From c87ff7213e15c7b878cede8dccd5af24c6ae7041 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sat, 31 May 2025 15:35:08 +0600 Subject: [PATCH 001/286] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B8=D0=BB=D0=BE=D1=81=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/{ => teacher}/page.tsx | 4 +- app/(student)/components/BaseLayout.tsx | 18 ++ app/(student)/components/CounterBanner.tsx | 61 ++++++ app/(student)/components/HomeClient.tsx | 164 ++++++++++++++ app/(student)/components/MyFontAwesome.tsx | 17 ++ app/(student)/components/VideoPlay.tsx | 49 +++++ .../components/buttons/FancyLinkBtn.tsx | 29 +++ app/(student)/components/popUp/Tiered.tsx | 57 +++++ app/(student)/layout.tsx | 13 ++ app/(student)/new/page.tsx | 11 + app/(student)/page.tsx | 8 + app/layout.tsx | 3 + package-lock.json | 94 ++++++++ package.json | 8 +- public/layout/images/home-banner-phone.png | Bin 0 -> 45155 bytes public/layout/images/logo-kg.svg | 205 ++++++++++++++++++ public/layout/images/logo-remove-white.png | Bin 0 -> 60288 bytes public/layout/images/logo-remove.png | Bin 0 -> 75195 bytes public/layout/images/man.png | Bin 0 -> 17471 bytes public/layout/images/shape.png | Bin 0 -> 2305 bytes public/layout/images/shape1.png | Bin 0 -> 382 bytes public/layout/images/shape2.png | Bin 0 -> 645 bytes public/layout/svg/red-logo.svg | 46 ++++ public/layout/svg/white-logo.svg | 47 ++++ styles/layout/_button.scss | 51 +++++ styles/layout/_topbar.scss | 17 +- styles/layout/_typography.scss | 2 +- styles/layout/layout.scss | 79 ++++++- 28 files changed, 977 insertions(+), 6 deletions(-) rename app/(main)/{ => teacher}/page.tsx (99%) create mode 100644 app/(student)/components/BaseLayout.tsx create mode 100644 app/(student)/components/CounterBanner.tsx create mode 100644 app/(student)/components/HomeClient.tsx create mode 100644 app/(student)/components/MyFontAwesome.tsx create mode 100644 app/(student)/components/VideoPlay.tsx create mode 100644 app/(student)/components/buttons/FancyLinkBtn.tsx create mode 100644 app/(student)/components/popUp/Tiered.tsx create mode 100644 app/(student)/layout.tsx create mode 100644 app/(student)/new/page.tsx create mode 100644 app/(student)/page.tsx create mode 100644 public/layout/images/home-banner-phone.png create mode 100644 public/layout/images/logo-kg.svg create mode 100644 public/layout/images/logo-remove-white.png create mode 100644 public/layout/images/logo-remove.png create mode 100644 public/layout/images/man.png create mode 100644 public/layout/images/shape.png create mode 100644 public/layout/images/shape1.png create mode 100644 public/layout/images/shape2.png create mode 100644 public/layout/svg/red-logo.svg create mode 100644 public/layout/svg/white-logo.svg create mode 100644 styles/layout/_button.scss diff --git a/app/(main)/page.tsx b/app/(main)/teacher/page.tsx similarity index 99% rename from app/(main)/page.tsx rename to app/(main)/teacher/page.tsx index afe44527..a06710d5 100644 --- a/app/(main)/page.tsx +++ b/app/(main)/teacher/page.tsx @@ -6,8 +6,8 @@ import { Column } from 'primereact/column'; import { DataTable } from 'primereact/datatable'; import { Menu } from 'primereact/menu'; import React, { useContext, useEffect, useRef, useState } from 'react'; -import { ProductService } from '../../demo/service/ProductService'; -import { LayoutContext } from '../../layout/context/layoutcontext'; +import { ProductService } from '../../../demo/service/ProductService'; +import { LayoutContext } from '../../../layout/context/layoutcontext'; import Link from 'next/link'; import { Demo } from '@/types'; import { ChartData, ChartOptions } from 'chart.js'; diff --git a/app/(student)/components/BaseLayout.tsx b/app/(student)/components/BaseLayout.tsx new file mode 100644 index 00000000..d7027d43 --- /dev/null +++ b/app/(student)/components/BaseLayout.tsx @@ -0,0 +1,18 @@ +"use client"; + +// import Footer from "./Footer"; +// import Header from "./Header"; + +export default function BaseLayout({ children }: { children: React.ReactNode }) { + return ( + <> +
+ {/*
*/} +
+ {children} +
+ {/*
*/} +
+ + ); +} \ No newline at end of file diff --git a/app/(student)/components/CounterBanner.tsx b/app/(student)/components/CounterBanner.tsx new file mode 100644 index 00000000..75b59db3 --- /dev/null +++ b/app/(student)/components/CounterBanner.tsx @@ -0,0 +1,61 @@ +import React from 'react' +import { faCircle, + faChalkboard, + faUserGraduate, + faBookOpen, + faShieldHeart, +} from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from './MyFontAwesome'; +import CountUp from 'react-countup'; + +export default function CounterBanner() { + return ( +
+
+
+
+ + +
+
+
+
+ Курстар & видеосабактар +
+
+ +
+
+ + +
+
+
+
+ Катталган студенттер +
+
+ +
+
+ + +
+
+
+
+ Окутуучулар +
+
+ +
+
+ + +
+
+
%
+ Канааттануу деңгээли +
+
+
+
+ ) +} diff --git a/app/(student)/components/HomeClient.tsx b/app/(student)/components/HomeClient.tsx new file mode 100644 index 00000000..c57325ca --- /dev/null +++ b/app/(student)/components/HomeClient.tsx @@ -0,0 +1,164 @@ +"use client"; + +import AOS from "aos"; +import "aos/dist/aos.css"; +import { useEffect } from "react"; +import CounterBanner from "./CounterBanner"; +import Link from "next/link"; +import { faClock, faVideo,} from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from "./MyFontAwesome"; +import VideoPlay from "./VideoPlay"; +import Image from "next/image"; + +export default function HomeClient() { + useEffect(() => { + AOS.init(); + }, []); + + return ( +
+
+
+
+
+
+ + + ЫҢГАЙЛУУ ОКУУ ҮЧҮН ОНЛАЙН МЕЙКИНДИК + +
+

+ Аралыктан окутуу порталына кош келиңиз! +

+
+ {" "} + Университеттин онлайн билим берүү жаатындагы долбоорлорун + бириктирүүдөбүз: +
    +
  • ачык онлайн курстар
  • +
  • жогорку билим берүү программалары
  • +
+
+
+
+ +
+
+ +
+
+ Shape +
+ + Пользователь + +
+ Shape +
+ +
+ Shape +
+ +
+
+ 13000 +

lorem

+
+
+ +
+
+ Куттуктайбыз! +

Сиздин кабыл алуу ийгиликтүү аяктады

+
+
+ +
+
+ User experience className +

Today at 12.00 PM

+
+ + Join now + +
+
+
+
+
+
+
+ ); +} diff --git a/app/(student)/components/MyFontAwesome.tsx b/app/(student)/components/MyFontAwesome.tsx new file mode 100644 index 00000000..e3bb24f8 --- /dev/null +++ b/app/(student)/components/MyFontAwesome.tsx @@ -0,0 +1,17 @@ +"use client"; // обязательно в app/ структуре + +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { IconProp } from "@fortawesome/fontawesome-svg-core"; +import { ComponentProps } from "react"; + +interface IconProps extends ComponentProps { + icon: IconProp; + className?: string; + size?: "xs" | "lg" | "sm" | "1x" | "2x" | "3x" | "4x" | "5x" | "6x" | "7x" | "8x" | "9x" | "10x"; +} + +export default function MyFontAwesome({ icon, className, size, ...props }:IconProps ) { + return ( + + ); +} \ No newline at end of file diff --git a/app/(student)/components/VideoPlay.tsx b/app/(student)/components/VideoPlay.tsx new file mode 100644 index 00000000..035e5c53 --- /dev/null +++ b/app/(student)/components/VideoPlay.tsx @@ -0,0 +1,49 @@ +'use client'; + +import { faPlay} from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from './MyFontAwesome'; +import Image from "next/image"; +import { useState } from "react"; +import { Dialog } from 'primereact/dialog'; +// import 'primereact/resources/themes/lara-light-blue/theme.css'; // или другая тема +import 'primereact/resources/primereact.min.css'; +import 'primeicons/primeicons.css'; + +export default function VideoPlay() { + const [videoCall, setVideoCall] = useState(false); + + return ( +
+ {if (!videoCall) return; setVideoCall(false); }}> +
+ +
+
+
+
+
setVideoCall(true)} + > + {/* Волна */} + + + {/* Иконка-кнопка */} +
+ +
+
+
+ Логотип ОшГУ +
+
+ ) +} diff --git a/app/(student)/components/buttons/FancyLinkBtn.tsx b/app/(student)/components/buttons/FancyLinkBtn.tsx new file mode 100644 index 00000000..1073c2ce --- /dev/null +++ b/app/(student)/components/buttons/FancyLinkBtn.tsx @@ -0,0 +1,29 @@ +'use client'; + +import Link from "next/link"; +import { useState } from "react"; + +export default function FancyLinkBtn({backround, effectBackround, title}) { + const [position, setPosition] = useState(false); + + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/app/(student)/components/popUp/Tiered.tsx b/app/(student)/components/popUp/Tiered.tsx new file mode 100644 index 00000000..1260075f --- /dev/null +++ b/app/(student)/components/popUp/Tiered.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { useEffect, useRef, useState } from 'react'; +import { Button } from 'primereact/button'; +import { TieredMenu } from 'primereact/tieredmenu'; +import { faBars, faClose } from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from '../MyFontAwesome'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; + +export default function Tiered({title, items, insideColor}) { + const [mobile, setMobile] = useState(false); + + const menu = useRef(null); + const media = useMediaQuery('(max-width: 1000px)'); + + const menuItems = items.map(item => ({ + ...item, + url: item.link && item.link + })); + + const toggleMenu = (e)=> { + menu.current.toggle(e); + setMobile(prev => !prev); + } + // Общий фонт который закрывает кнопку бургер меню, Close + return ( +
+ {title.name ? + } + + +
+ ); +} \ No newline at end of file diff --git a/app/(student)/layout.tsx b/app/(student)/layout.tsx new file mode 100644 index 00000000..45cb94cf --- /dev/null +++ b/app/(student)/layout.tsx @@ -0,0 +1,13 @@ +import BaseLayout from "./components/BaseLayout"; + +export default function Layout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( +
+ {children} +
+ ); +} \ No newline at end of file diff --git a/app/(student)/new/page.tsx b/app/(student)/new/page.tsx new file mode 100644 index 00000000..6b0987b4 --- /dev/null +++ b/app/(student)/new/page.tsx @@ -0,0 +1,11 @@ +'use client'; + +import React from 'react' + +export default function New() { + return ( +
+ New +
+ ) +} diff --git a/app/(student)/page.tsx b/app/(student)/page.tsx new file mode 100644 index 00000000..bd2f4a81 --- /dev/null +++ b/app/(student)/page.tsx @@ -0,0 +1,8 @@ +import HomeClient from "./components/HomeClient"; + +export default function Home() { + + return ( + + ); +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 4114afcf..5e9cecc2 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,9 @@ 'use client'; import { LayoutProvider } from '../layout/context/layoutcontext'; import { PrimeReactProvider } from 'primereact/api'; +import { config } from "@fortawesome/fontawesome-svg-core"; +import "@fortawesome/fontawesome-svg-core/styles.css"; // Импорт стилей +config.autoAddCss = false; import 'primereact/resources/primereact.css'; import 'primeflex/primeflex.css'; import 'primeicons/primeicons.css'; diff --git a/package-lock.json b/package-lock.json index 332e8ef7..241b058c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,21 @@ "name": "sakai-react", "version": "10.1.0", "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", + "aos": "^2.3.4", "chart.js": "4.2.1", + "countup": "^1.8.2", "next": "13.4.8", "primeflex": "^3.3.1", "primeicons": "^6.0.1", "primereact": "10.2.1", "react": "18.2.0", + "react-countup": "^6.5.3", "react-dom": "18.2.0", "typescript": "5.1.3" }, @@ -103,6 +109,48 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", + "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -561,6 +609,16 @@ "node": ">= 8" } }, + "node_modules/aos": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", + "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", + "dependencies": { + "classlist-polyfill": "^1.0.3", + "lodash.debounce": "^4.0.6", + "lodash.throttle": "^4.0.1" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -907,6 +965,11 @@ "node": ">= 6" } }, + "node_modules/classlist-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", + "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -936,6 +999,16 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/countup": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/countup/-/countup-1.8.2.tgz", + "integrity": "sha512-1qOuy+h+dgLY4TroLb4ZC2hK7HYS2Z7mnSUvdzoYAU7EZbqOse1mKZta/KYPhDPfd9lPDyP3Tb4pH6a10RkoCw==" + }, + "node_modules/countup.js": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.8.2.tgz", + "integrity": "sha512-UtRoPH6udaru/MOhhZhI/GZHJKAyAxuKItD2Tr7AbrqrOPBX/uejWBBJt8q86169AMqKkE9h9/24kFWbUk/Bag==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2566,12 +2639,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3099,6 +3182,17 @@ "node": ">=0.10.0" } }, + "node_modules/react-countup": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/react-countup/-/react-countup-6.5.3.tgz", + "integrity": "sha512-udnqVQitxC7QWADSPDOxVWULkLvKUWrDapn5i53HE4DPRVgs+Y5rr4bo25qEl8jSh+0l2cToJgGMx+clxPM3+w==", + "dependencies": { + "countup.js": "^2.8.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", diff --git a/package.json b/package.json index 8071b50b..44eb0099 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,21 @@ "lint": "next lint" }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", + "aos": "^2.3.4", "chart.js": "4.2.1", + "countup": "^1.8.2", "next": "13.4.8", "primeflex": "^3.3.1", "primeicons": "^6.0.1", "primereact": "10.2.1", "react": "18.2.0", + "react-countup": "^6.5.3", "react-dom": "18.2.0", "typescript": "5.1.3" }, @@ -28,4 +34,4 @@ "prettier": "^2.8.8", "sass": "^1.63.4" } -} \ No newline at end of file +} diff --git a/public/layout/images/home-banner-phone.png b/public/layout/images/home-banner-phone.png new file mode 100644 index 0000000000000000000000000000000000000000..399a19dcf39aaabbde410dda49bef65361bf272c GIT binary patch literal 45155 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 literal 0 HcmV?d00001 diff --git a/public/layout/images/logo-kg.svg b/public/layout/images/logo-kg.svg new file mode 100644 index 00000000..ac33ea12 --- /dev/null +++ b/public/layout/images/logo-kg.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + В + + + + + Р + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/layout/images/logo-remove-white.png b/public/layout/images/logo-remove-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3d28f7d584100fa710e5dcad4c9448c49f60319c GIT binary patch literal 60288 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 literal 0 HcmV?d00001 diff --git a/public/layout/images/man.png b/public/layout/images/man.png new file mode 100644 index 0000000000000000000000000000000000000000..0168ee167c95356cb8e67ee2cea3eb9a65478c45 GIT binary patch literal 17471 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 literal 0 HcmV?d00001 diff --git a/public/layout/images/shape.png b/public/layout/images/shape.png new file mode 100644 index 0000000000000000000000000000000000000000..a82ce023a4d747dc1f719de8472ed6cbe3815cea GIT binary patch literal 2305 zcmV+c3I6tpP)JA;Hq&=nMepQt@k!*;Vh{VB5;FM>UVT*$9J>Y5Aeo_tIok0hxIs#yPXaH`hKZb=Z`2wKK2iJaLU|}pM z0hlrL!L6Uz)p_O!8k840_Y>1C=+Lh>I!`=}J?I(~7k+T+Cw6tuqo9K_9|Pz4NryU5 zAHfvUhc>zN6T7-xeFPEZ*o)IOw2sNRXeT)V+*?E}9dY^KeePx^?;pV(xx) z?pdd(sE=d4L`~(Ovrnh2>BmoFFbNC4mME#r=GD9JYp8!F105OT#g<9|k2BQG-Xvcgc@ssts0M%5NBmfMBEY_G2BZ;YvGsi|(D&FmQbWW$1jO`Wep0zXmae)5e6+RTo?Pm1$kRcEHm z&UIrG%nlpq3Y;=oN~=o}0GdKJ#+%zRCm8(1t}aRdcnaA> zU6KH>G{!pAt!m5(=Y_0)Ii+q+O9J4$F;<+FR+l6I?h9Fyiu&w#b!Gket8+h@J_xHi zKd5T`>8s;Hc4DzzU2zT?XQ3RQKvm{(T3sB6^-^@`D1b|{1F)*|@`zXsmy9n$icF+# zf}wGOg9WQPWf*qs8d%j8c`8_ox|;jegq_Sxzzf{BChW{;s9QxbCv5c1gfbL4-NAxY zU1lB_Fm`oiimp!oAS~(@`5beiZ1h!WZI%S#hgI3VpBJg2LmdAO&!S< zh3s6bI*KDZz>LLKbtDOZU$IVPfg0c&~Y#$3kZ{brfwA}S}AH@~kZe-?z7?1j#mZCm^2SYt+ zYt;ECcY~2T!;==CAoLnXL5v!v_LLg;W*K$2BE#`aOBZ}e@qV8&brY{hU6=XPmLdp3 zCmHUgmb;t6@tRzZE@s?W6!)jCaerFs4y}I#f*_<>3uf+8mls9q3-Gys`(O{p^Qcys z-_ee!y#X;<>PIzj3xe=V{1+#XbKIU+9sx0)rcPC!W(sE#&gJ^MSKq=P8)c%Xfp9b6TGuzJf7&Pg5Vc7`+Z)$F&2*Gq|pG@Q(Hw z?%bXmhXVk2gQdqF(vISe*IMfeP+WO(8)X`}`T&3prlFE}^J;X@&I-`?c028N24-lT zzs{>KccHGC4;83=)aCgUW7N%|Nqro=sMC5Gh}q9AZ@uPqmIk8`{@ItXr*n5E4R>df zyX(A*{M%A*L61=vn79Z*_-X!|^~|F_{Gbf=edbAONA?ylFK4I{w^-!p_aAYES{-Kx zR}g-i|KMNL+`o>M+u(8={1^Eje&V@``ZhTCD_wF2Ob~hv>cs*}!3_6G%l$)YdD{73 zeM>Y;ouzQUB})F6f(H-;LHJu_xfj}5ASOetE=%3R^QhmJ;7(Hdsnv0(P&sOKYB>Z! z5dIe1z>EPiqV8W+$NfV^Zgt$Rg>b9m{>|tC2!hZkpy=Ttf#e)F)nzj2r4|EVfXYcH}qxC&WavbY( zV5jsRk~6x!?ShVs?b#1|ZpI#Zr+WgF~Rrw^1<`X`&@mnGj6c!XkC7wsmV1O4hbJ-J}l@9c?ayqSVN?sjxiHp#Z4J34;C z^G|kkM_&~m16y=-XJ^Ok*wbEUxab2V$)=Vr;};pdK+9f@W?!@R>jriL%FegjvqpBm z=RMu8kYrn)Mn-o)&0%D8e$4K^@9X-yKk+iMn@O@Iw{!&cN|!6_>B{%FfnC#C9y>#3 zKQv<(K=*W3+pY+#$4Rm&bd%POK9243@m$ieyS?4xnU0Q6t_HTJqZE5^1}_TSO_C%@ bl7Hz3mIGNh7!O9700000NkvXXu0mjf6B$k_ literal 0 HcmV?d00001 diff --git a/public/layout/images/shape1.png b/public/layout/images/shape1.png new file mode 100644 index 0000000000000000000000000000000000000000..bee24c6573993881efd3678a7b44598f614392bb GIT binary patch literal 382 zcmV-^0fGLBP){|)$kH;Y^X3`7vUwC7G8fzdu zlix6#n44j=BVD9}(U~XIiGzjR2vl@7&PAQqf<^26W5Izs4}aL{)8lc$!;Tu~e!)0X z<3bkflEOKx_@qteVZ|fDe;&IPtE-#n3+4zYykTE3Jyaf9Fk7hnk(9~7=C5>PwZY}v zHqRK?;2p5ZJvMoJ=XZXKdz;I7F}WPv!{&iJz~mLX)WYOf&Y^?J*Xvwz9BjYk-q?n<9JXf=`2PwJuf{>c)o>bEG@ ccJ)_uzu7rA;zwmh&;S4c07*qoM6N<$f<7gxu>b%7 literal 0 HcmV?d00001 diff --git a/public/layout/images/shape2.png b/public/layout/images/shape2.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fe1c5b6d641f64442e6479ee8f0e2bebc56aa3 GIT binary patch literal 645 zcmV;00($+4P)3MLC)_G(CdVT0P=cim&F-Bp*9F z_GZKW5$^!Det7oHn_a_>^aRrHjQKP}uhfSR0RQ*05Wt-aFM&Vw9oz$@4FiE2b$JhN z*FHybWZ=f4JGA=x3fzPt#z%K+_g5GgwC3hIBf~KUR;kQrc5m6(sv>{o#~G{+ z5mRS51Lm?4w;LQvh$R!?Ih!SR=qcsCXOX~werjsMgD!4~Wr2ZB!9>}&!(4g>78n+7 zszuNG>2uQ*-gO@c0Mc{qcpgO(EPHye`<*30M>m^IMunul7u3PejEoEk(EVG^lWsrN zNN8rUHIu$n2%t4)w#aC{A#O30RUQ%3e1FW918iw;T%edG zq#mVjujfLq5uftxo$qbaT$2`9o=mcE=?4uH=FvwavhHWxWj-3H^II^l4j6r*!|hjS f#^|nW{TICgGb&vsttk2E00000NkvXXu0mjfbw?Z6 literal 0 HcmV?d00001 diff --git a/public/layout/svg/red-logo.svg b/public/layout/svg/red-logo.svg new file mode 100644 index 00000000..69deed08 --- /dev/null +++ b/public/layout/svg/red-logo.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/layout/svg/white-logo.svg b/public/layout/svg/white-logo.svg new file mode 100644 index 00000000..d76c8ff6 --- /dev/null +++ b/public/layout/svg/white-logo.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/layout/_button.scss b/styles/layout/_button.scss new file mode 100644 index 00000000..1d184d38 --- /dev/null +++ b/styles/layout/_button.scss @@ -0,0 +1,51 @@ +button { + outline: 0; + border: none; + + &:focus { + outline: 0; + border: 0; + } +} + +.default-btn { + padding: 15px 35px; + text-align: center; + color: var(--whiteColor); + font-size: var(--fontSize); + font-weight: 400; + transition: var(--transition); + display: inline-flex; + align-items: center; + justify-content: center; + position: relative; + z-index: 0; + box-shadow: none; + overflow: hidden; + white-space: nowrap; + cursor: pointer; +} + +.fancyEffect { + position: absolute; + top: 0; + bottom: 0; + left: 50%; + width: 550px; + height: 550px; + margin: auto; + border-radius: 50%; + z-index: -1; +} + +.fancyBefore { + transform-origin: top center; + transform: translateX(-50%) translateY(-5%) scale(0.4); + transition: transform 0.9s; +} + +.fancyAfter { + transition: transform 1s; + transform: translateX(-45%) translateY(0) scale(1); + transform-origin: bottom center; +} diff --git a/styles/layout/_topbar.scss b/styles/layout/_topbar.scss index 79402366..bf6f5d9c 100644 --- a/styles/layout/_topbar.scss +++ b/styles/layout/_topbar.scss @@ -22,7 +22,7 @@ border-radius: 12px; img { - height: 2.5rem; + // height: 2.5rem; margin-right: .5rem; } @@ -86,6 +86,21 @@ } } +.main-header { + position: fixed; + top: 50px; /* равняется высоте .top-bar */ + width: 100%; + background: #fff; + z-index: 10; /* чтобы header был над контентом */ + box-shadow: 0 2px 4px rgba(0,0,0,0.1); + padding: 16px; + + .main-header.scrolled { + transform: translateY(50px); /* прячет шапку на высоту .top-bar */ + top: 0; + } +} + @media (max-width: 991px) { .layout-topbar { justify-content: space-between; diff --git a/styles/layout/_typography.scss b/styles/layout/_typography.scss index b9a0c8ff..a72d190a 100644 --- a/styles/layout/_typography.scss +++ b/styles/layout/_typography.scss @@ -3,7 +3,7 @@ h1, h2, h3, h4, h5, h6 { font-family: inherit; font-weight: 500; line-height: 1.2; - color: var(--surface-900); + // color: var(--surface-900); &:first-child { margin-top: 0; diff --git a/styles/layout/layout.scss b/styles/layout/layout.scss index fef2ed48..30218e29 100644 --- a/styles/layout/layout.scss +++ b/styles/layout/layout.scss @@ -1,3 +1,79 @@ + +:root { + --bodyFonts: "Jost", sans-serif; + --mainColor: #08A9E6; + --redColor: #EC272F; + --titleColor: #21225F; + --bodyColor: #555555; + --whiteColor: #ffffff; + --fontSize: 16px; + --transition: 0.5s; +} + +p { + color: var(--bodyColor); + margin-bottom: 10px; +} +p:last-child { + margin-bottom: 0; +} + +a { + display: inline-block; + transition: var(--transition); + text-decoration: none; +} +a:hover, a:focus { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + color: var(--titleColor); +} + +.mainColor-hover:hover{ + color: #08A9E6; +} + +/* animate */ +.animateContent{ + animation: content linear 6s infinite; +} + +@keyframes content { + 10%{ + transform: translateX(2px); + } + 50%{ + transform: translateX(-4px); + } + 80%{ + transform: translateY(-2px); + } + 100%{ + transform: translateY(4px); + } +} + +.animateFaster{ + animation: faster linear 4s infinite forwards; +} + +@keyframes faster { + 10%{ + transform: translateX(-2px); + } + 50%{ + transform: translateX(4px); + } + 80%{ + transform: translateY(2px); + } + 100%{ + transform: translateY(-4px); + } +} + @import './_variables'; @import "./_mixins"; @import "./_main"; @@ -8,4 +84,5 @@ @import "./_footer"; @import "./_responsive"; @import "./_utils"; -@import "./_typography"; \ No newline at end of file +@import "./_typography"; +@import "./_button"; \ No newline at end of file From 8097b6c1b92cc16515df2ce440238f3e0a03b447 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sun, 1 Jun 2025 19:38:15 +0600 Subject: [PATCH 002/286] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/layout.tsx | 2 +- app/(student)/layout.tsx | 8 +- app/(student)/new/page.tsx | 11 - app/(student)/page.tsx | 8 - app/{(student) => }/components/BaseLayout.tsx | 0 .../components/CounterBanner.tsx | 2 +- app/{(student) => }/components/HomeClient.tsx | 2 +- .../components/MyFontAwesome.tsx | 0 app/{(student) => }/components/VideoPlay.tsx | 3 +- .../components/buttons/FancyLinkBtn.tsx | 0 .../components/popUp/Tiered.tsx | 2 +- app/favicon.ico | Bin 1225 -> 0 bytes app/layout.tsx | 1 + app/page.tsx | 8 + layout/AppTopbar.tsx | 3 +- package-lock.json | 1060 +++++++++++++++-- package.json | 6 +- postcss.config.js | 6 + styles/globals.css | 78 ++ styles/layout/_topbar.scss | 2 +- styles/layout/layout.scss | 76 -- tailwind.config.js | 10 + 22 files changed, 1081 insertions(+), 207 deletions(-) delete mode 100644 app/(student)/new/page.tsx delete mode 100644 app/(student)/page.tsx rename app/{(student) => }/components/BaseLayout.tsx (100%) rename app/{(student) => }/components/CounterBanner.tsx (98%) rename app/{(student) => }/components/HomeClient.tsx (99%) rename app/{(student) => }/components/MyFontAwesome.tsx (100%) rename app/{(student) => }/components/VideoPlay.tsx (98%) rename app/{(student) => }/components/buttons/FancyLinkBtn.tsx (100%) rename app/{(student) => }/components/popUp/Tiered.tsx (97%) delete mode 100644 app/favicon.ico create mode 100644 app/page.tsx create mode 100644 postcss.config.js create mode 100644 styles/globals.css create mode 100644 tailwind.config.js diff --git a/app/(main)/layout.tsx b/app/(main)/layout.tsx index 5cb39fdb..122640dd 100644 --- a/app/(main)/layout.tsx +++ b/app/(main)/layout.tsx @@ -19,7 +19,7 @@ export const metadata: Metadata = { ttl: 604800 }, icons: { - icon: '/favicon.ico' + // icon: '' } }; diff --git a/app/(student)/layout.tsx b/app/(student)/layout.tsx index 45cb94cf..0eec769f 100644 --- a/app/(student)/layout.tsx +++ b/app/(student)/layout.tsx @@ -1,13 +1,15 @@ -import BaseLayout from "./components/BaseLayout"; +import Layout from "../../layout/layout"; -export default function Layout({ +export default function LayoutStudent({ children, }: Readonly<{ children: React.ReactNode; }>) { + return (
- {children} + {/* {children} */} + {children};
); } \ No newline at end of file diff --git a/app/(student)/new/page.tsx b/app/(student)/new/page.tsx deleted file mode 100644 index 6b0987b4..00000000 --- a/app/(student)/new/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -'use client'; - -import React from 'react' - -export default function New() { - return ( -
- New -
- ) -} diff --git a/app/(student)/page.tsx b/app/(student)/page.tsx deleted file mode 100644 index bd2f4a81..00000000 --- a/app/(student)/page.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import HomeClient from "./components/HomeClient"; - -export default function Home() { - - return ( - - ); -} \ No newline at end of file diff --git a/app/(student)/components/BaseLayout.tsx b/app/components/BaseLayout.tsx similarity index 100% rename from app/(student)/components/BaseLayout.tsx rename to app/components/BaseLayout.tsx diff --git a/app/(student)/components/CounterBanner.tsx b/app/components/CounterBanner.tsx similarity index 98% rename from app/(student)/components/CounterBanner.tsx rename to app/components/CounterBanner.tsx index 75b59db3..58a13363 100644 --- a/app/(student)/components/CounterBanner.tsx +++ b/app/components/CounterBanner.tsx @@ -5,7 +5,7 @@ import { faCircle, faBookOpen, faShieldHeart, } from "@fortawesome/free-solid-svg-icons"; -import MyFontAwesome from './MyFontAwesome'; +import MyFontAwesome from '../../components/MyFontAwesome'; import CountUp from 'react-countup'; export default function CounterBanner() { diff --git a/app/(student)/components/HomeClient.tsx b/app/components/HomeClient.tsx similarity index 99% rename from app/(student)/components/HomeClient.tsx rename to app/components/HomeClient.tsx index c57325ca..dff8bed4 100644 --- a/app/(student)/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -18,7 +18,7 @@ export default function HomeClient() { return (
-
+
diff --git a/app/(student)/components/MyFontAwesome.tsx b/app/components/MyFontAwesome.tsx similarity index 100% rename from app/(student)/components/MyFontAwesome.tsx rename to app/components/MyFontAwesome.tsx diff --git a/app/(student)/components/VideoPlay.tsx b/app/components/VideoPlay.tsx similarity index 98% rename from app/(student)/components/VideoPlay.tsx rename to app/components/VideoPlay.tsx index 035e5c53..024875db 100644 --- a/app/(student)/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -1,13 +1,14 @@ 'use client'; import { faPlay} from "@fortawesome/free-solid-svg-icons"; -import MyFontAwesome from './MyFontAwesome'; + import Image from "next/image"; import { useState } from "react"; import { Dialog } from 'primereact/dialog'; // import 'primereact/resources/themes/lara-light-blue/theme.css'; // или другая тема import 'primereact/resources/primereact.min.css'; import 'primeicons/primeicons.css'; +import MyFontAwesome from "./MyFontAwesome"; export default function VideoPlay() { const [videoCall, setVideoCall] = useState(false); diff --git a/app/(student)/components/buttons/FancyLinkBtn.tsx b/app/components/buttons/FancyLinkBtn.tsx similarity index 100% rename from app/(student)/components/buttons/FancyLinkBtn.tsx rename to app/components/buttons/FancyLinkBtn.tsx diff --git a/app/(student)/components/popUp/Tiered.tsx b/app/components/popUp/Tiered.tsx similarity index 97% rename from app/(student)/components/popUp/Tiered.tsx rename to app/components/popUp/Tiered.tsx index 1260075f..2a1718b7 100644 --- a/app/(student)/components/popUp/Tiered.tsx +++ b/app/components/popUp/Tiered.tsx @@ -4,7 +4,7 @@ import { useEffect, useRef, useState } from 'react'; import { Button } from 'primereact/button'; import { TieredMenu } from 'primereact/tieredmenu'; import { faBars, faClose } from "@fortawesome/free-solid-svg-icons"; -import MyFontAwesome from '../MyFontAwesome'; +import MyFontAwesome from '../../../components/MyFontAwesome'; import { useMediaQuery } from '@/hooks/useMediaQuery'; export default function Tiered({title, items, insideColor}) { diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index a614a31e44745fac24459b113a11e079c0e19cbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1225 zcmV;)1UCDLP)aQP;ly#o`xZBfi3gI0H}O=_D^^b?dL&#e0&x_%X?gYdegcmgL3H zF*+mn*(Ha2@okx3Am+dIqmy9#nzI%rZ-hHedH+ zeUcX!m08-C#DNQtVS01%h+8qak*js_T{}*}FBpJUAh5h?P-baaX6YmN7I!uya24Jz zv-B{WkQXQ6X8c~U0#D!%oQS`0at8u%BW6c316Y{k#l}`h*TExM`hK)~HAZhuO`u0G zs&NR9V{F{{y!d_qWqj^!*!Kz@HCf2>=okffKH98AO`yNteBFkdF*V6Ux{hS&05)~l z;iyQK(C??j=a(A3+PkO5=Z)tZ1SK7u^jTzeOKnjN;iZjCJ->H2!{~1tBzZAWXwzp0 z36xn1bFd=Gi_uA5TqA_@KSA8g%=mLPmX=xiCyh2Nvvf<67aN3AZkkXew?FMbmW_}SW^U5Xds9_)^KzeLFCl(>V{Ip}TAjwa*yG8*4R7Ddj0iy#XuE0YEBfoCVJwUg9J9< zrg$kCL{zKA*j4dve7#B#mv-#Lj7Z`Da;z(}bXy18>G))jK$)dmu|-g;F>S`{T1;$( zqO32YeU1%lAzWxK!;XpvacL`rdJsuoj7sw20h}X<)iGh85qGyI$%}6UMFSN*EoR|+ zT#ok~d*>S)N%dkvE3{!x#eyU+rbnAz;jXzISJ!usPM6ZU-OUiRAH!ctkB4}SevWaiklzEst%;C=7csvIP8S}@(v>6eJ7NNn z!~;t}!fGvW00000NkvXXu0mjf2cAs0 diff --git a/app/layout.tsx b/app/layout.tsx index 5e9cecc2..74fedd14 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,7 @@ 'use client'; import { LayoutProvider } from '../layout/context/layoutcontext'; import { PrimeReactProvider } from 'primereact/api'; +import '../styles/globals.css'; import { config } from "@fortawesome/fontawesome-svg-core"; import "@fortawesome/fontawesome-svg-core/styles.css"; // Импорт стилей config.autoAddCss = false; diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 00000000..45a50bc6 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,8 @@ +import React from 'react' +import HomeClient from './components/HomeClient' + +export default function page() { + return ( + + ) +} diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 9a2c8849..f63a5d92 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -21,7 +21,8 @@ const AppTopbar = forwardRef((props, ref) => { return (
- logo + {/* logo */} + logo SAKAI diff --git a/package-lock.json b/package-lock.json index 241b058c..01ec7a0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,10 +27,14 @@ "typescript": "5.1.3" }, "devDependencies": { + "@tailwindcss/postcss": "^4.1.8", + "autoprefixer": "^10.4.21", "eslint": "8.43.0", "eslint-config-next": "13.4.6", + "postcss": "^8.5.4", "prettier": "^2.8.8", - "sass": "^1.63.4" + "sass": "^1.63.4", + "tailwindcss": "^4.1.8" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -42,6 +46,31 @@ "node": ">=0.10.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", @@ -184,6 +213,66 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@kurkle/color": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", @@ -387,6 +476,267 @@ "tslib": "^2.4.0" } }, + "node_modules/@tailwindcss/node": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.8.tgz", + "integrity": "sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.8" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.8.tgz", + "integrity": "sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.8", + "@tailwindcss/oxide-darwin-arm64": "4.1.8", + "@tailwindcss/oxide-darwin-x64": "4.1.8", + "@tailwindcss/oxide-freebsd-x64": "4.1.8", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.8", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.8", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.8", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.8", + "@tailwindcss/oxide-linux-x64-musl": "4.1.8", + "@tailwindcss/oxide-wasm32-wasi": "4.1.8", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.8", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.8" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.8.tgz", + "integrity": "sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.8.tgz", + "integrity": "sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.8.tgz", + "integrity": "sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.8.tgz", + "integrity": "sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.8.tgz", + "integrity": "sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.8.tgz", + "integrity": "sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.8.tgz", + "integrity": "sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.8.tgz", + "integrity": "sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.8.tgz", + "integrity": "sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.8.tgz", + "integrity": "sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.10", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.8.tgz", + "integrity": "sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz", + "integrity": "sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.8.tgz", + "integrity": "sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.8", + "@tailwindcss/oxide": "4.1.8", + "postcss": "^8.4.41", + "tailwindcss": "4.1.8" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -779,6 +1129,43 @@ "has-symbols": "^1.0.3" } }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -846,6 +1233,38 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -881,9 +1300,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001572", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", - "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", + "version": "1.0.30001720", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", + "integrity": "sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==", "funding": [ { "type": "opencollective", @@ -965,6 +1384,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/classlist-polyfill": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", @@ -1097,6 +1525,15 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1130,6 +1567,12 @@ "csstype": "^3.0.2" } }, + "node_modules/electron-to-chromium": { + "version": "1.5.161", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", + "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1137,9 +1580,9 @@ "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -1264,6 +1707,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1811,6 +2263,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2522,106 +2987,343 @@ "set-function-name": "^2.0.1" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "argparse": "^2.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "minimist": "^1.2.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "json5": "lib/cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "json-buffer": "3.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/locate-path": { @@ -2678,6 +3380,15 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2721,6 +3432,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2728,9 +3475,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -2800,6 +3547,35 @@ } } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2809,6 +3585,15 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3037,9 +3822,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3054,9 +3839,10 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3065,17 +3851,27 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3508,9 +4304,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -3667,6 +4463,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwindcss": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.8.tgz", + "integrity": "sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -3676,6 +4478,32 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3848,6 +4676,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 44eb0099..01e1fd49 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,13 @@ "typescript": "5.1.3" }, "devDependencies": { + "@tailwindcss/postcss": "^4.1.8", + "autoprefixer": "^10.4.21", "eslint": "8.43.0", "eslint-config-next": "13.4.6", + "postcss": "^8.5.4", "prettier": "^2.8.8", - "sass": "^1.63.4" + "sass": "^1.63.4", + "tailwindcss": "^4.1.8" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..8f3250b7 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + '@tailwindcss/postcss': {}, // Используем новый плагин + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 00000000..063a1b0f --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --bodyFonts: "Jost", sans-serif; + --mainColor: #08A9E6; + --redColor: #EC272F; + --titleColor: #21225F; + --bodyColor: #555555; + --whiteColor: #ffffff; + --fontSize: 16px; + --transition: 0.5s; +} + +p { + color: var(--bodyColor); + margin-bottom: 10px; +} +p:last-child { + margin-bottom: 0; +} + +a { + display: inline-block; + transition: var(--transition); + text-decoration: none; +} +a:hover, a:focus { + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + color: var(--titleColor); +} + +.mainColor-hover:hover{ + color: #08A9E6; +} + +/* animate */ +.animateContent{ + animation: content linear 6s infinite; +} + +@keyframes content { + 10%{ + transform: translateX(2px); + } + 50%{ + transform: translateX(-4px); + } + 80%{ + transform: translateY(-2px); + } + 100%{ + transform: translateY(4px); + } +} + +.animateFaster{ + animation: faster linear 4s infinite forwards; +} + +@keyframes faster { + 10%{ + transform: translateX(-2px); + } + 50%{ + transform: translateX(4px); + } + 80%{ + transform: translateY(2px); + } + 100%{ + transform: translateY(-4px); + } +} \ No newline at end of file diff --git a/styles/layout/_topbar.scss b/styles/layout/_topbar.scss index bf6f5d9c..3ae47918 100644 --- a/styles/layout/_topbar.scss +++ b/styles/layout/_topbar.scss @@ -1,6 +1,6 @@ .layout-topbar { position: fixed; - height: 5rem; + height: 6rem; z-index: 997; left: 0; top: 0; diff --git a/styles/layout/layout.scss b/styles/layout/layout.scss index 30218e29..0b5314a9 100644 --- a/styles/layout/layout.scss +++ b/styles/layout/layout.scss @@ -1,79 +1,3 @@ - -:root { - --bodyFonts: "Jost", sans-serif; - --mainColor: #08A9E6; - --redColor: #EC272F; - --titleColor: #21225F; - --bodyColor: #555555; - --whiteColor: #ffffff; - --fontSize: 16px; - --transition: 0.5s; -} - -p { - color: var(--bodyColor); - margin-bottom: 10px; -} -p:last-child { - margin-bottom: 0; -} - -a { - display: inline-block; - transition: var(--transition); - text-decoration: none; -} -a:hover, a:focus { - text-decoration: none; -} - -h1, h2, h3, h4, h5, h6 { - color: var(--titleColor); -} - -.mainColor-hover:hover{ - color: #08A9E6; -} - -/* animate */ -.animateContent{ - animation: content linear 6s infinite; -} - -@keyframes content { - 10%{ - transform: translateX(2px); - } - 50%{ - transform: translateX(-4px); - } - 80%{ - transform: translateY(-2px); - } - 100%{ - transform: translateY(4px); - } -} - -.animateFaster{ - animation: faster linear 4s infinite forwards; -} - -@keyframes faster { - 10%{ - transform: translateX(-2px); - } - 50%{ - transform: translateX(4px); - } - 80%{ - transform: translateY(2px); - } - 100%{ - transform: translateY(-4px); - } -} - @import './_variables'; @import "./_mixins"; @import "./_main"; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..de7789e0 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,10 @@ +module.exports = { + content: [ + "./app/**/*.{js,ts,jsx,tsx}", + "./layout/**/*.{js,ts,jsx,tsx}", + "./components/**/*.{js,ts,jsx,tsx}", + ], + corePlugins: { + preflight: false, // Важно! + }, +} \ No newline at end of file From 15fc38e7c71e40e874b761ed1482eea5c83b9845 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 2 Jun 2025 11:32:20 +0600 Subject: [PATCH 003/286] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BC=D0=B0=D0=BD=D1=82=D0=B8=D0=BA=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8,=20=D0=BD=D0=BE=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20tailwind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/BaseLayout.tsx | 13 +-- app/components/CounterBanner.tsx | 8 +- app/components/HomeClient.tsx | 35 ++++--- app/components/MyFontAwesome.tsx | 2 +- app/components/VideoPlay.tsx | 22 ++--- app/components/popUp/Tiered.tsx | 19 ++-- app/lorem/page.tsx | 7 ++ app/page.tsx | 6 +- hooks/useMediaQuery.tsx | 19 ++++ layout/AppFooter.tsx | 52 +++++++++- layout/AppTopbar.tsx | 157 ++++++++++++++++++++++++++++--- styles/globals.css | 3 +- styles/layout/_topbar.scss | 53 ++++------- tailwind.config.js | 10 ++ 14 files changed, 306 insertions(+), 100 deletions(-) create mode 100644 app/lorem/page.tsx create mode 100644 hooks/useMediaQuery.tsx diff --git a/app/components/BaseLayout.tsx b/app/components/BaseLayout.tsx index d7027d43..101fd3fb 100644 --- a/app/components/BaseLayout.tsx +++ b/app/components/BaseLayout.tsx @@ -1,17 +1,18 @@ "use client"; -// import Footer from "./Footer"; -// import Header from "./Header"; +import AppTopbar from "@/layout/AppTopbar"; +import HomeClient from "./HomeClient"; +import AppFooter from "@/layout/AppFooter"; -export default function BaseLayout({ children }: { children: React.ReactNode }) { +export default function BaseLayout() { return ( <>
- {/*
*/} +
- {children} +
- {/*
*/} +
); diff --git a/app/components/CounterBanner.tsx b/app/components/CounterBanner.tsx index 58a13363..ea617fbf 100644 --- a/app/components/CounterBanner.tsx +++ b/app/components/CounterBanner.tsx @@ -5,20 +5,20 @@ import { faCircle, faBookOpen, faShieldHeart, } from "@fortawesome/free-solid-svg-icons"; -import MyFontAwesome from '../../components/MyFontAwesome'; +import MyFontAwesome from './MyFontAwesome'; import CountUp from 'react-countup'; export default function CounterBanner() { return (
-
+
-
+
+
+
Курстар & видеосабактар
@@ -55,7 +55,7 @@ export default function CounterBanner() { Канааттануу деңгээли
-
+
) } diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index dff8bed4..a66607ec 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -16,21 +16,19 @@ export default function HomeClient() { }, []); return ( -
+
-
- Shape + Shape
- Shape + Shape
13000 @@ -159,6 +157,15 @@ export default function HomeClient() {
+ + {/* Counter Statistics */} + + + {/* Oshgu Video */} +
+

Видеоэкскурсия по главному зданию ОшГУ

+
+
); } diff --git a/app/components/MyFontAwesome.tsx b/app/components/MyFontAwesome.tsx index e3bb24f8..28e58167 100644 --- a/app/components/MyFontAwesome.tsx +++ b/app/components/MyFontAwesome.tsx @@ -3,7 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { IconProp } from "@fortawesome/fontawesome-svg-core"; import { ComponentProps } from "react"; - + interface IconProps extends ComponentProps { icon: IconProp; className?: string; diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index 024875db..ee722e28 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -28,22 +28,22 @@ export default function VideoPlay() { >
-
-
-
+ {/*
*/} + {/*
setVideoCall(true)} - > + > */} {/* Волна */} - + {/* */} {/* Иконка-кнопка */} -
+ {/*
-
-
-
- Логотип ОшГУ +
*/} + {/*
+
*/} + {/* Логотип ОшГУ */}
) diff --git a/app/components/popUp/Tiered.tsx b/app/components/popUp/Tiered.tsx index 2a1718b7..b629c09f 100644 --- a/app/components/popUp/Tiered.tsx +++ b/app/components/popUp/Tiered.tsx @@ -3,8 +3,8 @@ import { useEffect, useRef, useState } from 'react'; import { Button } from 'primereact/button'; import { TieredMenu } from 'primereact/tieredmenu'; -import { faBars, faClose } from "@fortawesome/free-solid-svg-icons"; -import MyFontAwesome from '../../../components/MyFontAwesome'; +import { faBars, faClose, faEllipsisVertical } from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from '../MyFontAwesome'; import { useMediaQuery } from '@/hooks/useMediaQuery'; export default function Tiered({title, items, insideColor}) { @@ -29,10 +29,10 @@ export default function Tiered({title, items, insideColor}) { label={title.name && title.name} icon={title.name && "pi pi-list"} onClick={(e) => toggleMenu(e)} - className={`flex gap-2 text-[17px] text-[var(${insideColor})] hover:text-[var(--mainColor)]`} + className={`gap-2 p-2 bg-inherit text-[16px] text-[var(${insideColor})] hover:text-[var(--mainColor)]`} /> : } @@ -41,17 +41,18 @@ export default function Tiered({title, items, insideColor}) { popup ref={menu} breakpoint="1000px" - style={{ width: media ? '90%' : '' , marginLeft: media ? '5%' : ''}} - className={`pointer max-h-[200px] overflow-y-scroll`} + style={{ width: media ? '90%' : '' , left:'10px'}} + className={`pointer mt-4 max-h-[200px] overflow-y-scroll`} pt={{ - root: { className: `bg-white mt-4 border border-gray-300 rounded-md shadow-md`}, + root: { className: `bg-white border border-gray-300 rounded-md shadow-md`}, menu: { className: 'transition-all' }, - menuitem: { className: 'text-[var(--titleColor)] text-[14px] px-4 py-4 border-b hover:shadow-xl border-gray-200 hover:text-white hover:bg-[var(--mainColor)]' }, - action: { className: '' }, // для иконки + текста + menuitem: { className: 'text-[var(--titleColor)] text-[14px] px-1 py-2 border-b hover:shadow-xl border-gray-200 hover:text-white hover:bg-[var(--mainColor)]' }, + action: { className: 'flex gap-1' }, // для иконки + текста icon: { className: 'text-[var(--titleColor)] mx-1 hover:text-white' }, submenuIcon: { className: 'text-gray-400 ml-auto' } }} /> +
); } \ No newline at end of file diff --git a/app/lorem/page.tsx b/app/lorem/page.tsx new file mode 100644 index 00000000..539c1ccf --- /dev/null +++ b/app/lorem/page.tsx @@ -0,0 +1,7 @@ +import React from 'react' + +export default function page() { + return ( +
page
+ ) +} diff --git a/app/page.tsx b/app/page.tsx index 45a50bc6..39c48471 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,8 +1,10 @@ import React from 'react' -import HomeClient from './components/HomeClient' +import BaseLayout from './components/BaseLayout' export default function page() { return ( - +
+ +
) } diff --git a/hooks/useMediaQuery.tsx b/hooks/useMediaQuery.tsx new file mode 100644 index 00000000..89e61dca --- /dev/null +++ b/hooks/useMediaQuery.tsx @@ -0,0 +1,19 @@ +"use client"; + +import { useState, useEffect } from "react"; + +export function useMediaQuery(query:string) { + const [matches, setMatches] = useState(false); + + useEffect(() => { + const mediaQuery = window.matchMedia(query); + setMatches(mediaQuery.matches); + + const handler = (e:MediaQueryListEvent) => setMatches(e.matches); + mediaQuery.addEventListener("change", handler); + + return () => mediaQuery.removeEventListener("change", handler); + }, [query]); + + return matches; +} diff --git a/layout/AppFooter.tsx b/layout/AppFooter.tsx index 424b9987..4b84b090 100644 --- a/layout/AppFooter.tsx +++ b/layout/AppFooter.tsx @@ -2,16 +2,60 @@ import React, { useContext } from 'react'; import { LayoutContext } from './context/layoutcontext'; +import Image from 'next/image'; +import { faChalkboard, faPhone,} from "@fortawesome/free-solid-svg-icons"; +import MyFontAwesome from '@/app/components/MyFontAwesome'; +import Link from 'next/link'; const AppFooter = () => { const { layoutConfig } = useContext(LayoutContext); + + // dark mode + // Logo return ( -
- Logo - by - PrimeReact +
+
+
+ Логотип +
+ Кыргызстан, 723500, г. Ош, ул. Ленина, 331, ОшГУ Главный корпус + Общий отдел: +996 3222 7-07-12, + факс +996 3222 7-09-15, + edu@oshsu.kg +
+
+
+
+ +

Курстар

+
+
+ lorem ipsum + lorem ipsum + lorem ipsum +
+
+
+
+ +

Байланыш

+
+
+ lorem ipsum + lorem ipsum + lorem ipsum +
+
+ +

+ © 2025 ОшГУ | 2025 OshSU - IT Academy Ошский Государственный Университет oshsu.kg +

+
); }; diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index f63a5d92..f7ffa387 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -5,6 +5,10 @@ import { classNames } from 'primereact/utils'; import React, { forwardRef, useContext, useImperativeHandle, useRef } from 'react'; import { AppTopbarRef } from '@/types'; import { LayoutContext } from './context/layoutcontext'; +import Tiered from '@/app/components/popUp/Tiered'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; +import { usePathname } from 'next/navigation'; const AppTopbar = forwardRef((props, ref) => { const { layoutConfig, layoutState, onMenuToggle, showProfileSidebar } = useContext(LayoutContext); @@ -18,27 +22,152 @@ const AppTopbar = forwardRef((props, ref) => { topbarmenubutton: topbarmenubuttonRef.current })); + const pathName = usePathname(); + const media = useMediaQuery('(max-width: 1000px)'); + + const items = [ + { + label: 'Ачык онлайн курстар', + icon: 'pi pi-file', + items: [], + link:'/login' + }, + { + label: 'Бакалавриат', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Магистратура', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Кошумча билим берүү', + icon: 'pi pi-file', + items: [] + }, + ]; + + const mobileMenu = [ + { + label: 'КАТАЛОГ', + icon: 'pi pi-list', + items: [ + { + label: 'Ачык онлайн курстар', + icon: 'pi pi-file', + items: [], + link:'/login' + }, + { + label: 'Бакалавриат', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Магистратура', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Кошумча билим берүү', + icon: 'pi pi-file', + items: [] + }, + ], + }, + { + label: 'Бакалавриат', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Магистратура', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Кошумча билим берүү', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Кошумча билим берүү', + icon: 'pi pi-file', + items: [] + }, + { + label: 'КАТАЛОГ', + icon: 'pi pi-list', + items: [ + { + label: 'Ачык онлайн курстар', + icon: 'pi pi-file', + items: [], + link:'/login' + }, + { + label: 'Бакалавриат', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Магистратура', + icon: 'pi pi-file', + items: [] + }, + { + label: 'Кошумча билим берүү', + icon: 'pi pi-file', + items: [] + }, + ], + }, + ]; + return (
{/* logo */} - logo - SAKAI + logo +

Цифровой кампус ОшГУ

- - - + {pathName !== '/' ? + : '' + }
- +
+ {media ? + + :
+ + + + ОшМУнун сайты + Байланыш +
+ } + + +
+
+ {/* - + */}
); diff --git a/styles/globals.css b/styles/globals.css index 063a1b0f..ba85d770 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -75,4 +75,5 @@ h1, h2, h3, h4, h5, h6 { 100%{ transform: translateY(-4px); } -} \ No newline at end of file +} + diff --git a/styles/layout/_topbar.scss b/styles/layout/_topbar.scss index 3ae47918..d6a02350 100644 --- a/styles/layout/_topbar.scss +++ b/styles/layout/_topbar.scss @@ -18,12 +18,12 @@ color: var(--surface-900); font-size: 1.5rem; font-weight: 500; - width: 300px; + // width: 300px; border-radius: 12px; img { // height: 2.5rem; - margin-right: .5rem; + // margin-right: .5rem; } &:focus { @@ -63,7 +63,7 @@ } .layout-menu-button { - margin-left: 2rem; + // margin-left: 2rem; } .layout-topbar-menu-button { @@ -81,60 +81,45 @@ display: flex; .layout-topbar-button { - margin-left: 1rem; + // margin-left: 1rem; } } } -.main-header { - position: fixed; - top: 50px; /* равняется высоте .top-bar */ - width: 100%; - background: #fff; - z-index: 10; /* чтобы header был над контентом */ - box-shadow: 0 2px 4px rgba(0,0,0,0.1); - padding: 16px; - - .main-header.scrolled { - transform: translateY(50px); /* прячет шапку на высоту .top-bar */ - top: 0; - } -} - @media (max-width: 991px) { .layout-topbar { justify-content: space-between; .layout-topbar-logo { - width: auto; + // width: auto; order: 2; } .layout-menu-button { margin-left: 0; - order: 1; + order: 3; } .layout-topbar-menu-button { display: inline-flex; margin-left: 0; - order: 3; + // order: 1; } .layout-topbar-menu { margin-left: 0; - position: absolute; - flex-direction: column; - background-color: var(--surface-overlay); - box-shadow: 0px 3px 5px rgba(0,0,0,.02), 0px 0px 2px rgba(0,0,0,.05), 0px 1px 4px rgba(0,0,0,.08); - border-radius: 12px; - padding: 1rem; - right: 2rem; - top: 5rem; - min-width: 15rem; - display: none; - -webkit-animation: scalein 0.15s linear; - animation: scalein 0.15s linear; + // position: absolute; + // flex-direction: column; + // background-color: var(--surface-overlay); + // box-shadow: 0px 3px 5px rgba(0,0,0,.02), 0px 0px 2px rgba(0,0,0,.05), 0px 1px 4px rgba(0,0,0,.08); + // border-radius: 12px; + // padding: 1rem; + // right: 2rem; + // top: 5rem; + // min-width: 15rem; + // display: none; + // -webkit-animation: scalein 0.15s linear; + // animation: scalein 0.15s linear; &.layout-topbar-menu-mobile-active { display: block diff --git a/tailwind.config.js b/tailwind.config.js index de7789e0..813453ad 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,7 +3,17 @@ module.exports = { "./app/**/*.{js,ts,jsx,tsx}", "./layout/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}", + "./app/components/**/*.{js,ts,jsx,tsx}", ], + theme: { + screens: { + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + } + }, corePlugins: { preflight: false, // Важно! }, From a059336a5cc5e8abe822958683aaadd35f324abf Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 2 Jun 2025 15:22:48 +0600 Subject: [PATCH 004/286] =?UTF-8?q?=D0=91=D0=B0=D0=B3=D0=B8=20=D1=83=D1=81?= =?UTF-8?q?=D0=BF=D0=B5=D1=88=D0=BD=D0=BE=20=D0=BF=D0=BE=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=D0=B5=D0=BB=D0=B8=D1=81=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/HomeClient.tsx | 18 +++++++-------- app/components/VideoPlay.tsx | 29 +++++++++++++------------ app/components/buttons/FancyLinkBtn.tsx | 2 +- app/components/popUp/Tiered.tsx | 5 +++-- {styles => app}/globals.css | 5 ++--- app/layout.tsx | 6 ++--- layout/AppTopbar.tsx | 14 +----------- styles/layout/_typography.scss | 24 -------------------- tailwind.config.js | 20 ----------------- 9 files changed, 34 insertions(+), 89 deletions(-) rename {styles => app}/globals.css (94%) delete mode 100644 tailwind.config.js diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index a66607ec..0ecdc498 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -8,7 +8,6 @@ import Link from "next/link"; import { faClock, faVideo,} from "@fortawesome/free-solid-svg-icons"; import MyFontAwesome from "./MyFontAwesome"; import VideoPlay from "./VideoPlay"; -import Image from "next/image"; export default function HomeClient() { useEffect(() => { @@ -39,7 +38,7 @@ export default function HomeClient() { ЫҢГАЙЛУУ ОКУУ ҮЧҮН ОНЛАЙН МЕЙКИНДИК
-

Аралыктан окутуу порталына кош келиңиз! -

+
{" "} Университеттин онлайн билим берүү жаатындагы долбоорлорун бириктирүүдөбүз: -
    +
    • ачык онлайн курстар
    • жогорку билим берүү программалары
    @@ -112,15 +112,15 @@ export default function HomeClient() {
-
+
13000 -

lorem

+

Студент

@@ -131,7 +131,7 @@ export default function HomeClient() { data-aos-duration="1000" data-aos-once="true" > -
+
Куттуктайбыз!

Сиздин кабыл алуу ийгиликтүү аяктады

@@ -144,7 +144,7 @@ export default function HomeClient() { data-aos-duration="1000" data-aos-once="true" > -
+
User experience className

Today at 12.00 PM

diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index ee722e28..d843bcf6 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -15,11 +15,12 @@ export default function VideoPlay() { return (
- {if (!videoCall) return; setVideoCall(false); }}> + {if (!videoCall) return; setVideoCall(false); }}>
-
- {/*
*/} - {/*
+
+
setVideoCall(true)} - > */} + > {/* Волна */} - {/* */} + {/* Иконка-кнопка */} - {/*
+
-
*/} - {/*
-
*/} - {/* Логотип ОшГУ */} +
+
+
+ Логотип ОшГУ
) diff --git a/app/components/buttons/FancyLinkBtn.tsx b/app/components/buttons/FancyLinkBtn.tsx index 1073c2ce..9016c00f 100644 --- a/app/components/buttons/FancyLinkBtn.tsx +++ b/app/components/buttons/FancyLinkBtn.tsx @@ -17,7 +17,7 @@ export default function FancyLinkBtn({backround, effectBackround, title}) { backgroundColor:`var(${backround})`, }} > - {title} + {title} toggleMenu(e)} - className={`gap-2 p-2 bg-inherit text-[16px] text-[var(${insideColor})] hover:text-[var(--mainColor)]`} + style={{color:'var(--BodyColor)'}} + className={`gap-2 p-2 bg-white text-[16px]`} /> :
} - -
+
- {/* - - - - */}
); diff --git a/styles/layout/_typography.scss b/styles/layout/_typography.scss index a72d190a..6278de2f 100644 --- a/styles/layout/_typography.scss +++ b/styles/layout/_typography.scss @@ -10,30 +10,6 @@ h1, h2, h3, h4, h5, h6 { } } -h1 { - font-size: 2.5rem; -} - -h2 { - font-size: 2rem; -} - -h3 { - font-size: 1.75rem; -} - -h4 { - font-size: 1.5rem; -} - -h5 { - font-size: 1.25rem; -} - -h6 { - font-size: 1rem; -} - mark { background: #FFF8E1; padding: .25rem .4rem; diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 813453ad..00000000 --- a/tailwind.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - content: [ - "./app/**/*.{js,ts,jsx,tsx}", - "./layout/**/*.{js,ts,jsx,tsx}", - "./components/**/*.{js,ts,jsx,tsx}", - "./app/components/**/*.{js,ts,jsx,tsx}", - ], - theme: { - screens: { - sm: '640px', - md: '768px', - lg: '1024px', - xl: '1280px', - '2xl': '1536px', - } - }, - corePlugins: { - preflight: false, // Важно! - }, -} \ No newline at end of file From 5058bdafaa0c60d052482017956b82e001cc9c46 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 2 Jun 2025 17:20:43 +0600 Subject: [PATCH 005/286] login page update --- app/(full-page)/auth/login/page.tsx | 47 ++++++++++++----------------- app/components/InfoBanner.tsx | 11 +++++++ app/globals.css | 33 ++++++++++++++++++++ 3 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 app/components/InfoBanner.tsx diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index d3dd85ca..86647115 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -8,6 +8,7 @@ import { Password } from 'primereact/password'; import { LayoutContext } from '../../../../layout/context/layoutcontext'; import { InputText } from 'primereact/inputtext'; import { classNames } from 'primereact/utils'; +import InfoBanner from '@/app/components/InfoBanner'; const LoginPage = () => { const [password, setPassword] = useState(''); @@ -15,38 +16,29 @@ const LoginPage = () => { const { layoutConfig } = useContext(LayoutContext); const router = useRouter(); - const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); + // const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); return ( -
-
- Sakai logo -
-
-
- Image -
Welcome, Isabel!
- Sign in to continue -
- +
+ +
+
+ +
+ +
-
-
); }; diff --git a/app/components/InfoBanner.tsx b/app/components/InfoBanner.tsx new file mode 100644 index 00000000..c3f57cf2 --- /dev/null +++ b/app/components/InfoBanner.tsx @@ -0,0 +1,11 @@ +'use client'; + +export default function InfoBanner({title}:{title:string}) { + console.log(title); + + return ( +
+

{title}

+
+ ); +}; diff --git a/app/globals.css b/app/globals.css index 2387162d..bc4d3859 100644 --- a/app/globals.css +++ b/app/globals.css @@ -76,3 +76,36 @@ h1, h2, h3, h4, h5, h6 { } } +.user-img { + position: relative; + margin-bottom: 30px; +} +.user-img img { + /* border: solid .5px ; */ + box-shadow: 0px 1px 9px 4px; + animation: border-transform 10s linear infinite alternate forwards; +} + +@keyframes border-transform { + 0%, 100% { + border-radius: 60% 40% 56% 33%/73% 82% 18% 27%; + } + 14% { + border-radius: 40% 60% 54% 46%/49% 60% 40% 51%; + } + 28% { + border-radius: 54% 46% 38% 62%/49% 70% 30% 51%; + } + 42% { + border-radius: 61% 39% 55% 45%/61% 38% 62% 39%; + } + 56% { + border-radius: 61% 39% 67% 33%/70% 50% 50% 30%; + } + 70% { + border-radius: 50% 50% 34% 66%/56% 68% 32% 44%; + } + 84% { + border-radius: 46% 54% 50% 50%/35% 61% 39% 65%; + } +} From 0279c5d25b6aed6e4671ade26e65a28bce9ae5b9 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 3 Jun 2025 09:52:27 +0600 Subject: [PATCH 006/286] =?UTF-8?q?=D0=9B=D0=BE=D0=B3=D0=B8=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=87=D1=82=D0=B8=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 90 ++++++++++++++++++++++------- app/components/InfoBanner.tsx | 1 - app/components/VideoPlay.tsx | 2 - app/globals.css | 5 ++ package-lock.json | 73 ++++++++++++++++++++++- package.json | 5 +- schemas/schema.tsx | 22 +++++++ 7 files changed, 171 insertions(+), 27 deletions(-) create mode 100644 schemas/schema.tsx diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 86647115..878d108c 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -10,6 +10,11 @@ import { InputText } from 'primereact/inputtext'; import { classNames } from 'primereact/utils'; import InfoBanner from '@/app/components/InfoBanner'; +import { useForm } from 'react-hook-form'; +import { schema } from '@/schemas/schema'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { Controller } from 'react-hook-form'; + const LoginPage = () => { const [password, setPassword] = useState(''); const [checked, setChecked] = useState(false); @@ -18,6 +23,33 @@ const LoginPage = () => { const router = useRouter(); // const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); + const {register, handleSubmit, formState: { errors }, control} = useForm({ + resolver:yupResolver(schema), mode: 'onChange', + }); + + const onSubmit = async (data) => { + console.log(data); + + // console.log("Данные формы:", data); + try { + const res = await fetch('https://mooc.oshsu.kg/api/v2/login', { + method:"POST", + headers: { + 'Content-Type': 'application/json', + // 'mode':'no-cors', + }, + credentials: "include", + body: JSON.stringify({ + email : "kalilov054720@oshsu.kg", + password : "054720" + }), + // body: JSON.stringify(data), + }) + } catch(err){ + console.log("Ошибка ",err); + } + }; + return (
@@ -26,29 +58,43 @@ const LoginPage = () => {
-
diff --git a/app/components/InfoBanner.tsx b/app/components/InfoBanner.tsx index c3f57cf2..862aefc0 100644 --- a/app/components/InfoBanner.tsx +++ b/app/components/InfoBanner.tsx @@ -1,7 +1,6 @@ 'use client'; export default function InfoBanner({title}:{title:string}) { - console.log(title); return (
diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index d843bcf6..8834a5aa 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -18,8 +18,6 @@ export default function VideoPlay() { {if (!videoCall) return; setVideoCall(false); }}>
diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index d5e5f8ff..591a25a7 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -4,7 +4,6 @@ import { getConfirmOptions } from '@/utils/getConfirmOptions'; import { Button } from 'primereact/button'; import { faPlay } from '@fortawesome/free-solid-svg-icons'; import MyFontAwesome from '../MyFontAwesome'; -import { Divider } from 'primereact/divider'; export default function LessonCard({ status, diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 4447bed5..8f5e57b9 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -267,7 +267,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp typeColor={'var(--mainColor)'} lessonDate={'xx-xx'} urlForPDF={() => sentToPDF(item.document || '')} - urlForDownload='' + urlForDownload="" /> )) @@ -433,8 +433,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp type={{ typeValue: 'link', icon: 'pi pi-link' }} typeColor={'var(--mainColor)'} lessonDate={'xx-xx'} - urlForPDF={() => ('')} - urlForDownload='' + urlForPDF={() => ''} + urlForDownload="" /> )) @@ -555,8 +555,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const videoSection = () => { return (
-
- + {/* { toggleVideoType(e.value); @@ -564,16 +564,19 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp options={videoSelect} optionLabel="name" placeholder="Танданыз" + style={{backgroundColor: 'var(--mainColor', color: 'white'}} + panelStyle={{color: 'white'}} className="w-[213px] sm:w-full md:w-14rem" - /> + /> */}
- {selectedCity?.status ? ( -
+ {/* {!selectedCity?.status ? ( */} +
{ setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); setValue('usefulLink', e.target.value, { shouldValidate: true }); @@ -581,22 +584,22 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp /> {errors.usefulLink?.message}
- ) : ( - {}} - accept="video/" - onSelect={(e) => - setVideoValue((prev) => ({ - ...prev, - file: e.files[0] - })) - } - /> - )} + {/* // ) : ( + // {}} + // accept="video/" + // onSelect={(e) => + // setVideoValue((prev) => ({ + // ...prev, + // file: e.files[0] + // })) + // } + // /> + // )} */}
@@ -650,8 +653,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp type={{ typeValue: 'video', icon: 'pi pi-video' }} typeColor={'var(--mainColor)'} lessonDate={'xx-xx'} - urlForPDF={() => ('')} - urlForDownload='' + urlForPDF={() => ''} + urlForDownload="" /> )) diff --git a/app/components/popUp/Redacting.tsx b/app/components/popUp/Redacting.tsx index b42664ec..aac69991 100644 --- a/app/components/popUp/Redacting.tsx +++ b/app/components/popUp/Redacting.tsx @@ -8,7 +8,7 @@ export default function Redacting({ redactor, textSize }: {redactor: MenuItem[], return (
- menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> + menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> { edu@oshsu.kg
-
+ {/*

@@ -51,7 +51,7 @@ const AppFooter = () => { lorem ipsum lorem ipsum

-
+
*/}

© 2025 ОшГУ | 2025 OshSU - IT Academy Ошский Государственный Университет oshsu.kg diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index c5ed3c2d..90fe5626 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -145,7 +145,7 @@ const AppTopbar = forwardRef((props, ref) => { {media ? ( ) : ( -

+
{/* ((props, ref) => { ОшМУнун сайты - + {/* Байланыш - + */}
)} diff --git a/layout/StudentLayout.tsx b/layout/StudentLayout.tsx index 7ea3df42..3a078e89 100644 --- a/layout/StudentLayout.tsx +++ b/layout/StudentLayout.tsx @@ -149,7 +149,7 @@ const StudentLayout = ({ children }: ChildContainerProps) => {
{children}
{/* */}
- + {/* */}
diff --git a/layout/layout.tsx b/layout/layout.tsx index e886a689..013f6a17 100644 --- a/layout/layout.tsx +++ b/layout/layout.tsx @@ -149,7 +149,7 @@ const Layout = ({ children }: ChildContainerProps) => {
{children}
{/* */}
- + {/* */}
From ada5b1a4146aff88c37cfb7fbdc2827c3a647b11 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 08:58:20 +0600 Subject: [PATCH 109/286] =?UTF-8?q?=D1=84=D0=BE=D1=82=D0=BE=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=BD=D0=B0=20=D0=BA=D1=83=D1=80=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 64 ++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index f32036de..86f89d0f 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -28,6 +28,9 @@ import { useMediaQuery } from '@/hooks/useMediaQuery'; export default function Course() { const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); + interface FileWithPreview extends File { + objectURL?: string; + } const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); @@ -43,6 +46,7 @@ export default function Course() { perPage: 0 }); const [activeIndex, setActiveIndex] = useState(0); + const [imageState, setImageState] = useState(null); const [editingLesson, setEditingLesson] = useState({ title: '', @@ -117,11 +121,9 @@ export default function Course() { }; const handleFetchCourse = async (page = 1) => { - const data = await fetchCourses(page, 0); toggleSkeleton(); - console.log(course); - + if (course) { setHasCourses(false); setValueCourses(course.data); @@ -206,6 +208,7 @@ export default function Course() { }; const clearValues = () => { + setImageState(null); setCourseValue({ title: '', description: '', video_url: '', image: '' }); setEditingLesson({ title: '', description: '', video_url: '', image: '', created_at: '' }); setEditMode(false); @@ -236,7 +239,7 @@ export default function Course() { } }; - const onSelect = (e: FileUploadSelectEvent) => { + const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { editMode ? setEditingLesson((prev) => ({ ...prev, @@ -246,10 +249,13 @@ export default function Course() { ...prev, image: e.files[0] })); - - console.log('hi'); + setImageState(e.files[0].objectURL); }; + useEffect(() => { + console.log(imageState); + }, [imageState]); + const imageBodyTemplate = (product: CourseType) => { const image = product.image; @@ -290,9 +296,9 @@ export default function Course() { contextFetchCourse(); }, []); - useEffect(()=> { + useEffect(() => { handleFetchCourse(); - },[course]); + }, [course]); useEffect(() => { const title = editMode ? editingLesson.title.trim() : courseValue.title.trim(); @@ -339,11 +345,37 @@ export default function Course() { console.log('Для потока ', forStreamId); }, [forStreamId]); + const imagestateStyle = imageState ? 'flex gap-1 items-center justify-between' : ''; + return (
{/* modal window */}
+
+ {imagestateStyle && ( +
+ {typeof imageState === 'string' && + + } +
+ )} +
+ + + {courseValue.image || editingLesson.image ? ( +
+ {typeof editingLesson.image === 'string' && ( + <> + Сүрөт: {editingLesson.image} + + )} +
+ ) : ( + jpeg, png, jpg + )} +
+
{/*
*/}
@@ -405,22 +437,6 @@ export default function Course() { }} />
- -
- - - {courseValue.image || editingLesson.image ? ( -
- {typeof editingLesson.image === 'string' && ( - <> - Сүрөт: {editingLesson.image} - - )} -
- ) : ( - jpeg, png, jpg - )} -
{/*
*/}
From fb8573e24fd4f5fc7fd534fcdef723fb3c12f419 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 13:22:26 +0600 Subject: [PATCH 110/286] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 5 +- app/(main)/course/[courseTheme]/page.tsx | 17 ---- app/(main)/course/page.tsx | 39 +++++----- app/(student)/teaching/page.tsx | 3 +- app/components/NotFound.tsx | 2 +- app/components/PDFBook.tsx | 1 - app/components/cards/ItemCard.tsx | 98 +++++++++--------------- app/components/lessons/LessonTyping.tsx | 23 ++---- app/components/tables/StreamList.tsx | 48 ++++++------ app/globals.css | 6 +- layout/AppMenu.tsx | 2 +- layout/StudentLayout.tsx | 5 +- layout/context/layoutcontext.tsx | 27 ++++--- public/layout/svg/login-bg.svg | 1 + types/layout.d.ts | 8 +- types/myMainCourseType.tsx | 5 +- 16 files changed, 120 insertions(+), 170 deletions(-) create mode 100644 public/layout/svg/login-bg.svg diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 690d00f8..e90d1c06 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -19,11 +19,13 @@ import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; import { getToken } from '@/utils/auth'; import { logout } from '@/utils/logout'; import { LoginType } from '@/types/login'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; const LoginPage = () => { const { layoutConfig, setUser, setMessage, setGlobalLoading } = useContext(LayoutContext); const router = useRouter(); + const media = useMediaQuery('(max-width: 640px)'); // const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); const { @@ -40,7 +42,6 @@ const LoginPage = () => { console.log('Данные пользователя: ', value); const user = await login(value); - console.log(user); if (user && user.success) { document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; @@ -91,7 +92,7 @@ const LoginPage = () => { }; return ( -
+
{/* */}
diff --git a/app/(main)/course/[courseTheme]/page.tsx b/app/(main)/course/[courseTheme]/page.tsx index 86edb58e..2e5654ce 100644 --- a/app/(main)/course/[courseTheme]/page.tsx +++ b/app/(main)/course/[courseTheme]/page.tsx @@ -50,7 +50,6 @@ export default function CourseTheme() { const data = await fetchThemes(Number(courseTheme)); toggleSkeleton(); - console.log('id', selectedCourse); contextFetchThemes(Number(courseTheme)); if (data?.lessons) { @@ -120,7 +119,6 @@ export default function CourseTheme() { }; const handleUpdateTheme = async () => { - console.log('yeee'); const data = await updateTheme(Number(courseTheme), selectedCourse.id, editingThemes.title); if (data.success) { @@ -145,7 +143,6 @@ export default function CourseTheme() { }; const edit = (rowData: number | null) => { - console.log(rowData); setEditMode(true); setSelectedCourse({id: rowData}); @@ -160,18 +157,6 @@ export default function CourseTheme() { setSelectedCourse({ id: null }); }; - // const getConfirmOptions = (id: number) => ({ - // message: 'Сиз чын эле өчүрүүнү каалайсызбы??', - // header: 'Өчүрүү', - // icon: 'pi pi-info-circle', - // defaultFocus: 'reject', - // acceptClassName: 'p-button-danger', - // acceptLabel: 'Кийинки кадам', // кастомная надпись для "Yes" - // rejectLabel: 'Артка', - // accept: () => handleDeleteCourse(id), - // // reject: () => console.log('Удаление отменено') - // }); - useEffect(() => { handleFetchInfo(); handleFetchThemes(); @@ -180,7 +165,6 @@ export default function CourseTheme() { useEffect(() => { const handleShow = async () => { const data:{lessons: {data: {id: number, title: string}[]}} = await fetchThemes(Number(courseTheme)); - console.log(data); if (data?.lessons) { console.log('rab'); @@ -226,7 +210,6 @@ export default function CourseTheme() {
{themeInfo?.created_at} - Home/theme
diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 86f89d0f..02bfce2e 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -40,7 +40,7 @@ export default function Course() { const [formVisible, setFormVisible] = useState(false); const [forStart, setForStart] = useState(false); const [skeleton, setSkeleton] = useState(false); - const [pagination, setPagination] = useState({ + const [pagination, setPagination] = useState<{ currentPage: number; total: number; perPage: number }>({ currentPage: 1, total: 0, perPage: 0 @@ -125,13 +125,15 @@ export default function Course() { toggleSkeleton(); if (course) { + console.log(course); + setHasCourses(false); setValueCourses(course.data); - // setPagination({ - // currentPage: course.data, - // total: course?.data, - // perPage: course?.data - // }); + setPagination({ + currentPage: course.current_page, + total: course?.total, + perPage: course?.per_page + }); } else { setHasCourses(true); setMessage({ @@ -170,7 +172,7 @@ export default function Course() { if (data?.success) { toggleSkeleton(); // handleFetchCourse(); - contextFetchCourse(); + contextFetchCourse(1); setMessage({ state: true, value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } @@ -191,7 +193,7 @@ export default function Course() { if (data?.success) { toggleSkeleton(); // handleFetchCourse(); - contextFetchCourse(); + contextFetchCourse(1); setMessage({ state: true, value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } @@ -220,7 +222,7 @@ export default function Course() { if (data?.success) { toggleSkeleton(); // handleFetchCourse(); - contextFetchCourse(); + contextFetchCourse(1); clearValues(); setEditMode(false); setSelectedCourse(null); @@ -277,6 +279,8 @@ export default function Course() { // Ручное управление пагинацией const handlePageChange = (page: number) => { // handleFetchCourse(page); + contextFetchCourse(page); + console.log(page); }; const edit = (rowData: number | null) => { @@ -293,7 +297,7 @@ export default function Course() { }; useEffect(() => { - contextFetchCourse(); + contextFetchCourse(1); }, []); useEffect(() => { @@ -353,13 +357,7 @@ export default function Course() {
- {imagestateStyle && ( -
- {typeof imageState === 'string' && - - } -
- )} + {imagestateStyle &&
{typeof imageState === 'string' && }
}
@@ -496,7 +494,7 @@ export default function Course() { />
- + rowIndex + 1} header="Номер" style={{ width: '20px' }}> { const newValue = forStreamId?.id === rowData.id ? null : { id: rowData.id, title: rowData.title }; - console.log(rowData, forStreamId); - // Устанавливаем состояние setForStreamId(newValue); }} @@ -549,7 +545,8 @@ export default function Course() { rows={pagination.perPage} totalRecords={pagination.total} onPageChange={(e) => handlePageChange(e.page + 1)} - template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" + // template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" + template={media ? 'PrevPageLink NextPageLink' : 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink'} />
)} diff --git a/app/(student)/teaching/page.tsx b/app/(student)/teaching/page.tsx index 1a1aad21..470e83ab 100644 --- a/app/(student)/teaching/page.tsx +++ b/app/(student)/teaching/page.tsx @@ -31,7 +31,6 @@ export default function Teaching() { // functions const toggleSortSelect = (e: sortOptType) => { - console.log(e); setSelectedSort(e); }; @@ -110,7 +109,7 @@ export default function Teaching() { const x = displayData.map((semester: any, sIdx: number) => (

{semester.semester.name_kg}

-
+
{Object.values(semester) .filter((val: any) => val.subject) // только предметы .map((subj: any, subjIdx: number) => ( diff --git a/app/components/NotFound.tsx b/app/components/NotFound.tsx index a1de19d7..74b4e906 100644 --- a/app/components/NotFound.tsx +++ b/app/components/NotFound.tsx @@ -9,7 +9,7 @@ export const NotFound = ({ titleMessage }: { titleMessage: string }) => {

{titleMessage}

- + {/* */} Башкы баракчага кайтуу diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index 4bbf9a81..abbab375 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -157,7 +157,6 @@ export default function PDFViewer({ url }: { url: string }) { // media ? ( <> -

lorm

-//
-//
-//

{lessonName}

-//
-//
-//
-//
-// Окутуучу: -// {teacherName} -// {teacherLastName} -//
-//
-//
-// Тип: -// {lessonType} -//
-// { -// //
-//
-//
-//
- -//
-// ); -// } - 'use client'; -import { itemsCourseInfo } from '@/services/studentMain'; import Link from 'next/link'; import { Button } from 'primereact/button'; -import React from 'react'; +import React, { useEffect, useState } from 'react'; export default function ItemCard({ lessonName, @@ -48,38 +9,51 @@ export default function ItemCard({ connection }: { lessonName: string; - streams: {id: number, teacher?: { name: string; last_name?: string }; subject_type_name?: { name_kg: string, short_name_kg: string } }[]; + streams: { id: number; teacher?: { name: string; last_name?: string }; subject_type_name?: { name_kg: string; short_name_kg: string } }[]; connection: { id: number; course_id: number; id_myedu_stream: number }[]; }) { - console.log('conn',connection); - + const [activeStreamIdx, setActiveStreamIdx] = useState(null); + const matchedIdx = streams.findIndex((stream) => connection.some((item) => item.id_myedu_stream === stream.id)); + + useEffect(() => { + if (matchedIdx !== -1) { + setActiveStreamIdx(matchedIdx); + } + }, [streams, connection]); return ( -
+
-

{lessonName}

+

{lessonName}

- {streams.map((stream, idx) => ( -
-
- Окутуучу: - {stream.teacher?.name} - {stream.teacher?.last_name} -
-
+ {streams.map((stream, idx) => { + const isActive = idx === activeStreamIdx; + return ( +
- Тип: - {stream.subject_type_name?.short_name_kg} + Окутуучу: + {stream.teacher?.name} + {stream.teacher?.last_name} +
+
+
+ Тип: + {stream.subject_type_name?.short_name_kg} +
+ {connection.map((item) => { + if (item.id_myedu_stream === stream.id) { + return ( + +
- {connection.map((item) => { - if (item.id_myedu_stream === stream.id) { - return
-
- ))} + ); + })}
); diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 8f5e57b9..c5424091 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -250,8 +250,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp
-
-
+
+
{docShow ? ( ) : ( @@ -417,8 +417,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp
-
-
+
+
{linksShow ? ( ) : ( @@ -621,19 +621,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp
-
-
- {/* selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteVideo(id)} - cardValue={{ title: 'item.title', id: 8, desctiption: 'item?.description', type: '', photo: ''}} - cardBg={'#fff'} - type={{ typeValue: 'Лекция', icon: 'pi pi-lecture' }} - typeColor={'var(--mainColor)'} - lessonDate={'xx-xx'} - /> */} - +
+
{videoShow ? ( ) : ( diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index cf0e4f42..955b6c23 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -14,7 +14,7 @@ import { streamsType } from '@/types/streamType'; export default function StreamList({ callIndex, courseValue, isMobile }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean }) { interface mainStreamsType { connect_id: number | null,stream_id:number, subject_name: {name_kg:string}, - subject_type_name:{short_name_kg:string}, teacher:{name:string}, language:{name:string}, + subject_type_name:{name_kg:string}, teacher:{name:string}, language:{name:string}, id_edu_year:number,id_period:number, semester:{name_kg:string}, edu_form:{name_kg:string} } @@ -156,7 +156,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI } }, [streams]); - const itemTemplate = (item:mainStreamsType, index: number) => { + const itemTemplate = (item:mainStreamsType, index: number) => { const bgClass = item.connect_id ? 'bg-[var(--greenBgColor)] border-b border-[gray]' : index % 2 == 1 ? 'bg-[#f5f5f5]' : ''; return ( @@ -180,8 +180,8 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI
- {item?.subject_type_name?.short_name_kg}: - {item?.teacher?.name} + {item?.subject_type_name?.name_kg} + {/* {item?.teacher?.name} */}
Үйрөтүлүү тили: @@ -189,7 +189,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI
Окуу жылы: - {item?.id_edu_year} + 20{item?.id_edu_year}
Период: @@ -251,7 +251,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI {hasStreams ? ( ) : ( -
+
{isMobile && (
)}
diff --git a/app/globals.css b/app/globals.css index 967962c1..fc77e25a 100644 --- a/app/globals.css +++ b/app/globals.css @@ -44,7 +44,7 @@ h1, h2, h3, h4, h5, h6 { } .login-bg{ - background: url('/layout/images/login-bg.jpg') no-repeat center/cover; + background: url('/layout/svg/login-bg.svg') no-repeat center/cover; } /* animate */ @@ -344,6 +344,10 @@ h1, h2, h3, h4, h5, h6 { } } +.select-column .my-custom-table td{ + background-color: var(--greenBgColor); +} + .my-custom-table td, .my-custom-table th { /* border: 1px solid #ccc; */ diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 2e1a12a9..da735fba 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -48,7 +48,7 @@ const AppMenu = () => { useEffect(() => { if (user?.is_working) { - contextFetchCourse(); + contextFetchCourse(1); } if (user?.is_student) { const isTopicsChildPage = pathname.startsWith('/teaching/'); diff --git a/layout/StudentLayout.tsx b/layout/StudentLayout.tsx index 3a078e89..7175ca42 100644 --- a/layout/StudentLayout.tsx +++ b/layout/StudentLayout.tsx @@ -1,14 +1,11 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client'; -import { useRouter } from 'next/navigation'; import { useEventListener, useMountEffect, useUnmountEffect } from 'primereact/hooks'; import React, { useContext, useEffect, useRef, useState } from 'react'; import { classNames } from 'primereact/utils'; -import AppFooter from './AppFooter'; import AppSidebar from './AppSidebar'; import AppTopbar from './AppTopbar'; -import AppConfig from './AppConfig'; import { LayoutContext } from './context/layoutcontext'; import { PrimeReactContext } from 'primereact/api'; import { ChildContainerProps, LayoutState, AppTopbarRef } from '@/types'; @@ -136,7 +133,7 @@ const StudentLayout = ({ children }: ChildContainerProps) => { requireRole(); },[user]); - if(permission) return null; + // if(permission) return null; return ( diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 810b2c23..eb3e50f3 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -66,16 +66,15 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { }; // fetch course - const [course, setCourses] = useState<{data: myMainCourseType[]}>({data: []}); + const [course, setCourses] = useState<{ current_page: number; total: number; per_page: number; data:myMainCourseType[] }>({ current_page: 1, total: 0, per_page: 10, data: [] }); - const contextFetchCourse = async (page = 1) => { + const contextFetchCourse = async (page: number) => { const data = await fetchCourses(page, 0); - + console.log(data.courses); + if (data?.courses) { // setCourses(data.courses.data); setCourses(data.courses); - } else { - } }; @@ -83,17 +82,21 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [contextThemes, setContextThemes] = useState([]); const contextFetchThemes = async (id: number | null) => { const data = await fetchThemes(Number(id) || null); - + setContextThemes(data); - } + }; + + useEffect(() => { + console.log('course ', course); + }, [course]); // fetch themes for student const [contextStudentThemes, setContextStudentThemes] = useState([]); const contextFetchStudentThemes = async (id: number) => { const data = await fetchStudentThemes(id); - + setContextStudentThemes(data); - } + }; const value: LayoutContextProps = { layoutConfig, @@ -108,18 +111,18 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { setGlobalLoading, message, setMessage, - + contextFetchCourse, course, setCourses, - + contextFetchThemes, contextThemes, setContextThemes, contextFetchStudentThemes, contextStudentThemes, - setContextStudentThemes, + setContextStudentThemes }; return ( diff --git a/public/layout/svg/login-bg.svg b/public/layout/svg/login-bg.svg new file mode 100644 index 00000000..5398aa5a --- /dev/null +++ b/public/layout/svg/login-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/types/layout.d.ts b/types/layout.d.ts index 81ae1627..f6a27da4 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -54,8 +54,12 @@ export interface LayoutContextProps { setGlobalLoading: React.Dispatch>; message: MessageType; setMessage: React.Dispatch>; - contextFetchCourse: ()=> void; - course: {data: myMainCourseType[]}; + contextFetchCourse: (id)=> void; + course: { current_page: number; + total: number; + per_page: number; + data: myMainCourseType[] + }; setCourses; contextFetchThemes: (id: number)=> void; contextThemes; diff --git a/types/myMainCourseType.tsx b/types/myMainCourseType.tsx index e14a4218..8f8280a0 100644 --- a/types/myMainCourseType.tsx +++ b/types/myMainCourseType.tsx @@ -15,7 +15,6 @@ export interface myMainCourseType { title: string; user_id: number; current_page?: number; - total?: number; - per_page?: number; - data?: test[]; + + // data?: test[]; } From 001e765fd0b6fa54d31c4aa0da428ada28b67fb4 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 14:43:23 +0600 Subject: [PATCH 111/286] =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20?= =?UTF-8?q?=D1=81=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 41 ++++++++++++++++--------- app/components/cards/ItemCard.tsx | 1 + app/components/lessons/LessonTyping.tsx | 7 ++++- app/globals.css | 2 +- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 02bfce2e..b94ead3f 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -125,8 +125,6 @@ export default function Course() { toggleSkeleton(); if (course) { - console.log(course); - setHasCourses(false); setValueCourses(course.data); setPagination({ @@ -210,6 +208,8 @@ export default function Course() { }; const clearValues = () => { + console.log('clear'); + setImageState(null); setCourseValue({ title: '', description: '', video_url: '', image: '' }); setEditingLesson({ title: '', description: '', video_url: '', image: '', created_at: '' }); @@ -242,16 +242,21 @@ export default function Course() { }; const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - image: e.files[0] - })) - : setCourseValue((prev) => ({ - ...prev, - image: e.files[0] - })); - setImageState(e.files[0].objectURL); + console.log('rabotaet ', e); + if (e.files.length > 0) { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + image: e.files[0] + })) + : setCourseValue((prev) => ({ + ...prev, + image: e.files[0] + })); + setImageState(e.files[0].objectURL); + } else { + console.log('noo'); + } }; useEffect(() => { @@ -494,7 +499,7 @@ export default function Course() { />
- + rowIndex + 1} header="Номер" style={{ width: '20px' }}> ) : ( <> - + rowIndex + 1} header="Номер" style={{ width: '20px' }}>
diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index c5424091..4de3d2b0 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -819,6 +819,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp { setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); @@ -833,6 +834,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp { setEditingLesson((prev) => prev && { ...prev, url: e.target.value }); setValue('usefulLink', e.target.value, { shouldValidate: true }); @@ -841,6 +843,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp { setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); @@ -853,10 +856,11 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp ) : selectType === 'video' ? ( <> {editingLesson?.video_type_id ? ( -
+
{ setEditingLesson((prev) => prev && { ...prev, video_link: e.target.value }); setValue('usefulLink', e.target.value, { shouldValidate: true }); @@ -889,6 +893,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp { setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); diff --git a/app/globals.css b/app/globals.css index fc77e25a..4babec37 100644 --- a/app/globals.css +++ b/app/globals.css @@ -345,7 +345,7 @@ h1, h2, h3, h4, h5, h6 { } .select-column .my-custom-table td{ - background-color: var(--greenBgColor); + background-color: var(--greenBgColor) !important; } .my-custom-table td, From f6a2d0c898623d8766116b41bc22505b7189e83a Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 15:57:55 +0600 Subject: [PATCH 112/286] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=20?= =?UTF-8?q?=D1=85=D1=83=D0=BA=20=D1=83=D0=BA=D0=BE=D1=80=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B9=20=D1=82=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 4 ++- app/components/cards/LessonCard.tsx | 9 ++++--- app/components/lessons/LessonTyping.tsx | 9 ++++--- app/globals.css | 4 +++ hooks/useShortText.tsx | 33 +++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 hooks/useShortText.tsx diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index b94ead3f..4f1d1bb9 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -25,6 +25,7 @@ import StreamList from '@/app/components/tables/StreamList'; import { TabPanel, TabView } from 'primereact/tabview'; import { TabViewChange } from '@/types/tabViewChange'; import { useMediaQuery } from '@/hooks/useMediaQuery'; +import useShortText from '@/hooks/useShortText'; export default function Course() { const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); @@ -355,6 +356,7 @@ export default function Course() { }, [forStreamId]); const imagestateStyle = imageState ? 'flex gap-1 items-center justify-between' : ''; + const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 30); return (
@@ -370,7 +372,7 @@ export default function Course() {
{typeof editingLesson.image === 'string' && ( <> - Сүрөт: {editingLesson.image} + {imageTitle} )}
diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 591a25a7..fa7ff9fc 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -4,6 +4,7 @@ import { getConfirmOptions } from '@/utils/getConfirmOptions'; import { Button } from 'primereact/button'; import { faPlay } from '@fortawesome/free-solid-svg-icons'; import MyFontAwesome from '../MyFontAwesome'; +import useShortText from '@/hooks/useShortText'; export default function LessonCard({ status, @@ -29,6 +30,8 @@ export default function LessonCard({ urlForDownload: string }) { + const shortTitle = useShortText(cardValue.title, 10); + const toSentPDF = () => { urlForPDF(); }; @@ -99,13 +102,13 @@ export default function LessonCard({
{/*
{!cardValue.photo && }
*/} -
{cardValue.title}
+
{shortTitle}
{type.typeValue === 'link' && {cardValue?.url}}
{cardValue?.desctiption && cardValue.desctiption}
{status === 'working' && type.typeValue !== 'video' && ( -
+
- {lessonDate} + {lessonDate}
)}
diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 4de3d2b0..70840ec6 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -422,8 +422,9 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp {linksShow ? ( ) : ( - links.map((item: lessonType) => ( - <> + links.map((item: lessonType) => { + console.log(item); + return <> selectedForEditing(id, type)} @@ -432,12 +433,12 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp cardBg={'#7bb78112'} type={{ typeValue: 'link', icon: 'pi pi-link' }} typeColor={'var(--mainColor)'} - lessonDate={'xx-xx'} + lessonDate={new Date(item.created_at).toISOString().slice(0, 10)} urlForPDF={() => ''} urlForDownload="" /> - )) + }) )}
diff --git a/app/globals.css b/app/globals.css index 4babec37..e883080e 100644 --- a/app/globals.css +++ b/app/globals.css @@ -423,6 +423,10 @@ h1, h2, h3, h4, h5, h6 { } } +.p-tooltip { + font-size: 12px; /* или любой нужный размер */ +} + /* styles/book.css */ /* Стили для контейнера всей книги */ diff --git a/hooks/useShortText.tsx b/hooks/useShortText.tsx new file mode 100644 index 00000000..e95ccce2 --- /dev/null +++ b/hooks/useShortText.tsx @@ -0,0 +1,33 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { Tooltip } from 'primereact/tooltip'; + +export default function useShortText(text: string, textLength: number) { + const [resultText, setResultText] = useState(''); + const [isLength, setIsLength] = useState(false); + + useEffect(() => { + if (text?.length > textLength) { + setIsLength(true); + return setResultText(text.slice(0, textLength)); + } else { + setResultText(text); + setIsLength(false); + } + }, [text]); + + return ( + <> + + {isLength ? ( +
+ {resultText} + +
+ ) : ( +
{resultText}
+ )} + + ); +} From 29c1ae65f5adf2da59c9340755e226a924aa708e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 17:23:39 +0600 Subject: [PATCH 113/286] =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D0=B8=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D0=BD=D0=BD=D0=B5=D1=80=20=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D0=B5=20=D0=BA=D0=BE=D0=B3?= =?UTF-8?q?=D0=B4=D0=B0=20=D0=B6=D0=B4=D0=B5=D0=BC=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[courseTheme]/page.tsx | 64 ++++++----- app/(main)/course/page.tsx | 129 ++++++++++----------- app/components/cards/LessonCard.tsx | 48 +++++--- app/components/lessons/LessonTyping.tsx | 136 +++++++++++++---------- 4 files changed, 212 insertions(+), 165 deletions(-) diff --git a/app/(main)/course/[courseTheme]/page.tsx b/app/(main)/course/[courseTheme]/page.tsx index 2e5654ce..30b8aa74 100644 --- a/app/(main)/course/[courseTheme]/page.tsx +++ b/app/(main)/course/[courseTheme]/page.tsx @@ -18,6 +18,7 @@ import { NotFound } from '@/app/components/NotFound'; import Redacting from '@/app/components/popUp/Redacting'; import { getRedactor } from '@/utils/getRedactor'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; +import { ProgressSpinner } from 'primereact/progressspinner'; export default function CourseTheme() { const [hasThemes, setHasThemes] = useState(false); @@ -29,6 +30,7 @@ export default function CourseTheme() { const [editMode, setEditMode] = useState(false); const [forStart, setForStart] = useState(true); const [skeleton, setSkeleton] = useState(false); + const [progressSpinner, setProgressSpinner] = useState(false); const [editingThemes, setEditingThemes] = useState<{ title: string }>({ title: '' }); @@ -50,7 +52,7 @@ export default function CourseTheme() { const data = await fetchThemes(Number(courseTheme)); toggleSkeleton(); - + contextFetchThemes(Number(courseTheme)); if (data?.lessons) { setHasThemes(false); @@ -119,7 +121,6 @@ export default function CourseTheme() { }; const handleUpdateTheme = async () => { - const data = await updateTheme(Number(courseTheme), selectedCourse.id, editingThemes.title); if (data.success) { toggleSkeleton(); @@ -143,16 +144,15 @@ export default function CourseTheme() { }; const edit = (rowData: number | null) => { - setEditMode(true); - setSelectedCourse({id: rowData}); + setSelectedCourse({ id: rowData }); // setThemeValue({ title: rowData.title || '' }); setFormVisible(true); }; const clearValues = () => { setThemeValue({ title: '', description: '', video_url: '' }); - setEditingThemes({ title: ''}); + setEditingThemes({ title: '' }); setEditMode(false); setSelectedCourse({ id: null }); }; @@ -164,16 +164,18 @@ export default function CourseTheme() { useEffect(() => { const handleShow = async () => { - const data:{lessons: {data: {id: number, title: string}[]}} = await fetchThemes(Number(courseTheme)); - + setProgressSpinner(true) + const data: { lessons: { data: { id: number; title: string }[] } } = await fetchThemes(Number(courseTheme)); + if (data?.lessons) { - console.log('rab'); - - const forEditing = data.lessons.data.find(item => item.id === selectedCourse.id) - + setProgressSpinner(false); + const forEditing = data.lessons.data.find((item) => item.id === selectedCourse.id); + setEditingThemes({ - title: forEditing?.title || '', + title: forEditing?.title || '' }); + } else { + setProgressSpinner(false); } }; @@ -181,7 +183,7 @@ export default function CourseTheme() { handleShow(); } }, [editMode]); - + useEffect(() => { const title = editMode ? editingThemes.title.trim() : themeValue.title.trim(); if (title.length > 0) { @@ -235,25 +237,29 @@ export default function CourseTheme() {
- { - // setCourseTitle(e.target.value); - editMode - ? setEditingThemes((prev) => ({ - ...prev, - title: e.target.value - })) - : setThemeValue((prev) => ({ - ...prev, - title: e.target.value - })); - }} - /> +
+ { + // setCourseTitle(e.target.value); + editMode + ? setEditingThemes((prev) => ({ + ...prev, + title: e.target.value + })) + : setThemeValue((prev) => ({ + ...prev, + title: e.target.value + })); + }} + /> + {progressSpinner && } +
- + {/* table section */} {hasThemes ? ( diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 4f1d1bb9..5e5f3ed0 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -26,6 +26,7 @@ import { TabPanel, TabView } from 'primereact/tabview'; import { TabViewChange } from '@/types/tabViewChange'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import useShortText from '@/hooks/useShortText'; +import { ProgressSpinner } from 'primereact/progressspinner'; export default function Course() { const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); @@ -41,6 +42,7 @@ export default function Course() { const [formVisible, setFormVisible] = useState(false); const [forStart, setForStart] = useState(false); const [skeleton, setSkeleton] = useState(false); + const [progressSpinner, setProgressSpinner] = useState(false); const [pagination, setPagination] = useState<{ currentPage: number; total: number; perPage: number }>({ currentPage: 1, total: 0, @@ -260,10 +262,6 @@ export default function Course() { } }; - useEffect(() => { - console.log(imageState); - }, [imageState]); - const imageBodyTemplate = (product: CourseType) => { const image = product.image; @@ -286,7 +284,6 @@ export default function Course() { const handlePageChange = (page: number) => { // handleFetchCourse(page); contextFetchCourse(page); - console.log(page); }; const edit = (rowData: number | null) => { @@ -334,15 +331,19 @@ export default function Course() { useEffect(() => { const handleShow = async () => { + setProgressSpinner(true); const data = await fetchCourseInfo(selectedCourse); if (data?.success) { + setProgressSpinner(false); setEditingLesson({ title: data.course.title || '', video_url: data.course.video_url || '', description: data.course.description || '', image: data.course.image }); + } else { + setProgressSpinner(false); } }; @@ -384,63 +385,75 @@ export default function Course() { {/*
*/}
- { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - title: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - title: e.target.value - })); - }} - /> +
+ { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + title: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + title: e.target.value + })); + }} + /> + {progressSpinner && } +
- { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - video_url: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - video_url: e.target.value - })); - }} - /> +
+ { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + video_url: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + video_url: e.target.value + })); + }} + /> + {progressSpinner && } +
{/*
*/} {/*
*/}
- { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - description: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - description: e.target.value - })); - }} - /> +
+ { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + description: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + description: e.target.value + })); + }} + /> + {progressSpinner && } +
{/*
*/}
@@ -605,15 +618,7 @@ export default function Course() { ) : ( <> - + rowIndex + 1} header="Номер" style={{ width: '20px' }}> void; - urlForDownload: string + urlForDownload: string; }) { - const shortTitle = useShortText(cardValue.title, 10); + const [progressSpinner, setProgressSpinner] = useState(false); + + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 2000); + }; const toSentPDF = () => { + toggleSpinner(); urlForPDF(); }; const lessonCardEvents = () => { - if(type.typeValue === 'doc'){ + if (type.typeValue === 'doc') { toSentPDF(); - } else if (type.typeValue === 'link'){ - window.location.href = cardValue?.url || '#'; + } else if (type.typeValue === 'link') { + // window.location.href = cardValue?.url || '#'; + window.open(cardValue?.url || '#', '_blank'); } }; @@ -117,15 +128,24 @@ export default function LessonCard({ {videoPreviw} {/* button */} - {btnLabel && <> - {status === 'student' && type.typeValue === 'doc' ? -
-
- :
+ + {' '} +
+ ) : ( +
); diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 70840ec6..ce08534c 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -21,6 +21,7 @@ import { Dropdown } from 'primereact/dropdown'; import PDFViewer from '../PDFBook'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useRouter } from 'next/navigation'; +import { ProgressSpinner } from 'primereact/progressspinner'; export default function LessonTyping({ mainType, courseId, lessonId }: { mainType: string; courseId: string | null; lessonId: string | null }) { // types @@ -101,6 +102,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const [selectType, setSelectType] = useState(''); const [visible, setVisisble] = useState(false); const [editingLesson, setEditingLesson] = useState(null); + const [progressSpinner, setProgressSpinner] = useState(false); // functions const handleUpdate = () => { @@ -157,13 +159,41 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp } }; + const fileUploadRef = useRef(null); + const clearFile = () => { + fileUploadRef.current?.clear(); + if (visible) { + setEditingLesson( + (prev) => + prev && { + ...prev, + file: null + } + ); + } else { + setDocValue((prev) => ({ + ...prev, + file: null + })); + } + }; + const clearValues = () => { + clearFile(); + setDocValue({ title: '', description: '', file: null, url: '', video_link: '' }); setLinksValue({ title: '', description: '', file: null, url: '', video_link: '' }); setEditingLesson(null); setSelectId(null); setSelectType(''); }; + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 1000); + }; + // DOC SECTION const sentToPDF = (url: string) => { @@ -186,25 +216,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp ); - const fileUploadRef = useRef(null); - const clearFile = () => { - fileUploadRef.current?.clear(); - if (visible) { - setEditingLesson( - (prev) => - prev && { - ...prev, - file: null - } - ); - } else { - setDocValue((prev) => ({ - ...prev, - file: null - })); - } - }; - const docSection = () => { return (
@@ -247,7 +258,10 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />
{/*
@@ -283,7 +297,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // fetch document const handleFetchDoc = async () => { // skeleton = false - const data = await fetchLesson('doc', courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null); if (data?.success) { @@ -310,6 +323,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // add document const handleAddDoc = async () => { + toggleSpinner(); const token = getToken('access_token'); const data = await addLesson('doc', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, docValue, 0); @@ -413,7 +427,10 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp setLinksValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />
-
@@ -424,20 +441,22 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp ) : ( links.map((item: lessonType) => { console.log(item); - return <> - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteLink(id)} - cardValue={{ title: item.title, id: item.id, desctiption: item?.description, type: 'url', photo: item?.photo }} - cardBg={'#7bb78112'} - type={{ typeValue: 'link', icon: 'pi pi-link' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(item.created_at).toISOString().slice(0, 10)} - urlForPDF={() => ''} - urlForDownload="" - /> - + return ( + <> + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteLink(id)} + cardValue={{ title: item.title, id: item.id, desctiption: item?.description, type: 'url', photo: item?.photo }} + cardBg={'#7bb78112'} + type={{ typeValue: 'link', icon: 'pi pi-link' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(item.created_at).toISOString().slice(0, 10)} + urlForPDF={() => ''} + urlForDownload="" + /> + + ); }) )}
@@ -476,10 +495,9 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // add link const handleAddLink = async () => { + toggleSpinner(); const token = getToken('access_token'); - const data = await addLesson('url', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, linksValue, 0); - console.log(data); if (data.success) { handleFetchLink(); @@ -547,8 +565,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // VIDEO SECTIONS const toggleVideoType = (e: videoType) => { - console.log(e); - setSelectedCity(e); setVideoValue({ title: '', description: '', file: null, url: '', video_link: '' }); }; @@ -571,23 +587,23 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp /> */}
{/* {!selectedCity?.status ? ( */} -
- { - setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); - setValue('usefulLink', e.target.value, { shouldValidate: true }); - }} - /> - {errors.usefulLink?.message} -
+
+ { + setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
{/* // ) : ( // setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />
-
@@ -657,7 +676,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const handleVideoType = async () => { const data = await fetchVideoType(); - console.log(data); if (data && Array.isArray(data)) { setVideoTypes(data); @@ -693,11 +711,9 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // add vieo const handleAddVideo = async () => { + toggleSpinner(); const token = getToken('access_token'); - const data = await addLesson('video', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, videoValue, selectedCity?.id); - console.log(data); - if (data.success) { handleFetchVideo(); setMessage({ From faa046ab4c05cbf5cb4472b2d920bc98716e1270 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 17:32:59 +0600 Subject: [PATCH 114/286] =?UTF-8?q?=D0=9D=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=B2=20=D1=81=D1=82=D1=83=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/AppMenu.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index da735fba..0d48f725 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -109,8 +109,8 @@ const AppMenu = () => { forThemes.push({ label: item.title, id: item.id, - to: '/teaching/ ? ', - items: [] + to: `/teaching/lesson/${item.id}`, + // items: [] }) ); if (forThemes.length > 0) { From 8a9deefd28c02dac355f871a47fe2fcff7148230 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 18:59:50 +0600 Subject: [PATCH 115/286] =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 6 +++--- app/components/cards/LessonCard.tsx | 4 ++-- app/components/lessons/LessonTyping.tsx | 4 ++-- app/components/popUp/Redacting.tsx | 2 +- layout/AppMenu.tsx | 5 ++--- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index e90d1c06..2a4846c2 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -25,7 +25,7 @@ const LoginPage = () => { const { layoutConfig, setUser, setMessage, setGlobalLoading } = useContext(LayoutContext); const router = useRouter(); - const media = useMediaQuery('(max-width: 640px)'); + const media = useMediaQuery('(max-width: 1030px)'); // const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); const { @@ -100,7 +100,7 @@ const LoginPage = () => {
-

Кирүү

+

Кирүү

{/*
diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 6db117ed..7e7a679e 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -99,8 +99,8 @@ export default function LessonCard({ return (
diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index ce08534c..6eb7465c 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -275,11 +275,11 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp status="working" onSelected={(id: number, type: string) => selectedForEditing(id, type)} onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: item?.title, id: item.id, type: 'doc' }} + cardValue={{ title: item?.title, id: item.id, desctiption: item?.description, type: 'doc' }} cardBg={'#ddc4f51a'} type={{ typeValue: 'doc', icon: 'pi pi-file' }} typeColor={'var(--mainColor)'} - lessonDate={'xx-xx'} + lessonDate={new Date(item.created_at).toISOString().slice(0, 10)} urlForPDF={() => sentToPDF(item.document || '')} urlForDownload="" /> diff --git a/app/components/popUp/Redacting.tsx b/app/components/popUp/Redacting.tsx index aac69991..20acd346 100644 --- a/app/components/popUp/Redacting.tsx +++ b/app/components/popUp/Redacting.tsx @@ -8,7 +8,7 @@ export default function Redacting({ redactor, textSize }: {redactor: MenuItem[], return (
- menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> + menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> { useEffect(() => { console.log('Обновился и готов'); - + if (contextStudentThemes?.lessons) { const forThemes: any = []; contextStudentThemes.lessons.data?.map((item: any) => forThemes.push({ label: item.title, id: item.id, - to: `/teaching/lesson/${item.id}`, - // items: [] + to: `/teaching/lesson/${item.id}` }) ); if (forThemes.length > 0) { From 3bceca8e21ddd4281263a13031c833493eaea43c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 25 Aug 2025 19:25:56 +0600 Subject: [PATCH 116/286] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/SessionManager.tsx | 13 +++++-------- layout/AppTopbar.tsx | 1 + layout/StudentLayout.tsx | 7 +++---- services/auth.tsx | 2 -- utils/axiosInstance.tsx | 16 ++++++++-------- 5 files changed, 17 insertions(+), 22 deletions(-) diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 79dae43b..93621e9d 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -19,7 +19,6 @@ const SessionManager = () => { }, [user]); useEffect(() => { - console.log('Роутинг'); setGlobalLoading(true); setTimeout(() => { setGlobalLoading(false); @@ -33,7 +32,9 @@ const SessionManager = () => { setGlobalLoading(true); try { if (res?.success) { - setGlobalLoading(false); + setTimeout(() => { + setGlobalLoading(false); + }, 1000); console.log('Данные пользователя успешно пришли ', res); const userVisit = localStorage.getItem('userVisit'); @@ -75,12 +76,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - // logout({ setUser, setGlobalLoading }); - // window.location.href = '/auth/login'; - setTimeout(() => { - setGlobalLoading(false); - }, 1000); - + logout({ setUser, setGlobalLoading }); + window.location.href = '/auth/login'; return; } setTimeout(() => { diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 90fe5626..fb8256bb 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -119,6 +119,7 @@ const AppTopbar = forwardRef((props, ref) => { icon: 'pi pi-sign-out', items: [], command: () => { + window.location.href = '/auth/login'; logout({ setUser, setGlobalLoading }); } } diff --git a/layout/StudentLayout.tsx b/layout/StudentLayout.tsx index 7175ca42..185278ec 100644 --- a/layout/StudentLayout.tsx +++ b/layout/StudentLayout.tsx @@ -122,18 +122,17 @@ const StudentLayout = ({ children }: ChildContainerProps) => { const requireRole = () => { if(!user?.is_student){ - console.log('Не имеете доступ! student'); + console.warn('Не имеете доступ! student'); setPermission(false); - // window.location.href = '/auth/login'; + window.location.href = '/auth/login'; } - // setPermission(true); } useEffect(()=> { requireRole(); },[user]); - // if(permission) return null; + if(permission) return null; return ( diff --git a/services/auth.tsx b/services/auth.tsx index a20fef7a..aec595d3 100644 --- a/services/auth.tsx +++ b/services/auth.tsx @@ -10,8 +10,6 @@ let url = ''; // }); export const login = async (value:LoginType) => { - console.log(value); - url = process.env.NEXT_PUBLIC_BASE_URL + '/login?'; try { diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 17800809..8420603d 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -3,7 +3,7 @@ import { getToken } from './auth'; const axiosInstance = axios.create({ baseURL: process.env.NEXT_PUBLIC_BASE_URL, - timeout: 10000, + timeout: 20000, }); axiosInstance.interceptors.request.use((config) => { @@ -25,21 +25,21 @@ axiosInstance.interceptors.response.use( if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - // localStorage.removeItem('userVisit'); - // window.location.href = '/auth/login'; + window.location.href = '/auth/login'; + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + localStorage.removeItem('userVisit'); } if (status === 403) { + window.location.href = '/'; console.warn('Не имеет доступ. Перенаправляю...'); - // window.location.href = '/'; } if (status === 404) { console.warn('404 - Перенаправляю...'); - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - // localStorage.removeItem('userVisit'); - // window.location.href = '/pages/notfound'; + window.location.href = '/pages/notfound'; + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + localStorage.removeItem('userVisit'); } return Promise.reject(error); From 04f6fc623fee728332eeb2c49a92c07f60b3ece1 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 26 Aug 2025 09:23:08 +0600 Subject: [PATCH 117/286] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 4 ++-- app/components/SessionManager.tsx | 4 ++-- layout/StudentLayout.tsx | 15 ++++++++++----- layout/layout.tsx | 19 +++++++++++-------- utils/axiosInstance.tsx | 14 +++++++------- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 2a4846c2..a829d655 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -99,7 +99,7 @@ const LoginPage = () => {
-
+

Кирүү

@@ -114,7 +114,7 @@ const LoginPage = () => { name="password" control={control} defaultValue="010270Ja" - render={({ field }) => } + render={({ field }) => } /> {errors.password && {errors.password.message}}
diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 93621e9d..7919b2ac 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -76,8 +76,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - logout({ setUser, setGlobalLoading }); - window.location.href = '/auth/login'; + // logout({ setUser, setGlobalLoading }); + // window.location.href = '/auth/login'; return; } setTimeout(() => { diff --git a/layout/StudentLayout.tsx b/layout/StudentLayout.tsx index 185278ec..1f43a25b 100644 --- a/layout/StudentLayout.tsx +++ b/layout/StudentLayout.tsx @@ -121,18 +121,23 @@ const StudentLayout = ({ children }: ChildContainerProps) => { }); const requireRole = () => { - if(!user?.is_student){ - console.warn('Не имеете доступ! student'); + console.log('Ваш статус: ', user?.is_student); + + if(user){ + if(!user?.is_student){ + console.warn('Не имеете доступ! student'); + // window.location.href = '/auth/login'; + // setPermission(true); + } setPermission(false); - window.location.href = '/auth/login'; } } useEffect(()=> { requireRole(); - },[user]); + },[user, pathname]); - if(permission) return null; + // if(permission) return null; return ( diff --git a/layout/layout.tsx b/layout/layout.tsx index 013f6a17..e40fd328 100644 --- a/layout/layout.tsx +++ b/layout/layout.tsx @@ -19,7 +19,7 @@ const Layout = ({ children }: ChildContainerProps) => { const { setRipple } = useContext(PrimeReactContext); const topbarRef = useRef(null); const sidebarRef = useRef(null); - const [permission, setPermission] = useState(false); + const [permission, setPermission] = useState(true); const [bindMenuOutsideClickListener, unbindMenuOutsideClickListener] = useEventListener({ type: 'click', listener: (event) => { @@ -124,17 +124,20 @@ const Layout = ({ children }: ChildContainerProps) => { }); const requireRole = () => { - if(!user?.is_working){ - console.log('Не имеете доступ! working'); + console.log('Ваш статус: ', user?.is_working); + if(user){ + if(!user?.is_working){ + // window.location.href = '/auth/login'; + // setPermission(true); + console.log('Не имеете доступ! working'); + } setPermission(false); - // window.location.href = '/auth/login'; - } - setPermission(true); + } } useEffect(()=> { - requireRole(); - },[user]); + requireRole(); + },[user, pathname]); // if(permission) return null; diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 8420603d..8f5cbfc7 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -25,21 +25,21 @@ axiosInstance.interceptors.response.use( if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - window.location.href = '/auth/login'; - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - localStorage.removeItem('userVisit'); + // window.location.href = '/auth/login'; + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // localStorage.removeItem('userVisit'); } if (status === 403) { - window.location.href = '/'; + // window.location.href = '/'; console.warn('Не имеет доступ. Перенаправляю...'); } if (status === 404) { console.warn('404 - Перенаправляю...'); - window.location.href = '/pages/notfound'; - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - localStorage.removeItem('userVisit'); + // window.location.href = '/pages/notfound'; + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // localStorage.removeItem('userVisit'); } return Promise.reject(error); From e3073ebd13970fdda961331837026fcf479ed24d Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 26 Aug 2025 17:46:35 +0600 Subject: [PATCH 118/286] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=B1=D0=B8=D0=BB=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 26 ++-- app/(full-page)/layout.tsx | 2 +- app/(main)/course/page.tsx | 175 ++++++++++++++------------- app/components/messages/Message.tsx | 4 +- app/components/tables/StreamList.tsx | 105 +++++++++++++--- app/globals.css | 43 ++++++- layout/AppTopbar.tsx | 5 - public/layout/svg/login-bg.svg | 2 +- 8 files changed, 231 insertions(+), 131 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index a829d655..6e866044 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -2,13 +2,9 @@ 'use client'; import { useRouter } from 'next/navigation'; import React, { useContext, useState } from 'react'; -import { Checkbox } from 'primereact/checkbox'; -import { Button } from 'primereact/button'; import { Password } from 'primereact/password'; import { LayoutContext } from '../../../../layout/context/layoutcontext'; import { InputText } from 'primereact/inputtext'; -import { classNames } from 'primereact/utils'; -import InfoBanner from '@/app/components/InfoBanner'; import { useForm } from 'react-hook-form'; import { schema } from '@/schemas/authSchema'; @@ -16,7 +12,6 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { Controller } from 'react-hook-form'; import { getUser, login } from '@/services/auth'; import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; -import { getToken } from '@/utils/auth'; import { logout } from '@/utils/logout'; import { LoginType } from '@/types/login'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -60,25 +55,25 @@ const LoginPage = () => { } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при авторизации' } - }); // messege - Ошибка при авторизации + value: { severity: 'error', summary: 'Ошибка при авторизации', detail: 'Повторите позже' } + }); // messege - Ошибка при авторизации, повторите позже logout({ setUser, setGlobalLoading }); console.log('Ошибка при получении пользователя'); } } catch (error) { setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при авторизации' } - }); // messege - Ошибка при авторизации + value: { severity: 'error', summary: 'Ошибка при авторизации', detail: 'Повторите позже' } + }); // messege - Ошибка при авторизации, повторите позже logout({ setUser, setGlobalLoading }); console.log('Ошибка при получении пользователя'); } } } else { - console.log('Ошибка при авторизации'); + console.log('Ошибка при авторизации, повторите позже'); setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при авторизации' } + value: { severity: 'error', summary: 'Ошибка', detail: 'Введите корректные данные' } }); // messege - Ошибка при авторизации } }; @@ -87,20 +82,21 @@ const LoginPage = () => { console.log('Ошибки формы:', errors); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа', detail: 'ПОвтор' } + value: { severity: 'error', summary: 'Ошибка', detail: 'Введите корректные данные' } }); // messege - Ошибка при авторизации }; return ( -
+
+ {/*
*/} {/* */}
-
-

Кирүү

+
+

Кирүү

{/*
- )} -
+ <> +
+
+ + )} @@ -583,7 +594,7 @@ export default function Course() { className="p-tabview p-tabview-nav p-tabview-selected p-tabview-panels p-tabview-panel" >
- + {}} />
diff --git a/app/components/messages/Message.tsx b/app/components/messages/Message.tsx index 42baa0a2..908dd2f6 100644 --- a/app/components/messages/Message.tsx +++ b/app/components/messages/Message.tsx @@ -12,7 +12,7 @@ export default function Message() { const toast = useRef(null); const showError = () => { - toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 3000 }); + toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 30000 }); }; useEffect(() => { @@ -26,7 +26,7 @@ export default function Message() { return (
{/*
); } diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 955b6c23..66de54db 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -11,16 +11,73 @@ import GroupSkeleton from '../skeleton/GroupSkeleton'; import Link from 'next/link'; import { streamsType } from '@/types/streamType'; -export default function StreamList({ callIndex, courseValue, isMobile }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean }) { +export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: ()=> void }) { interface mainStreamsType { - connect_id: number | null,stream_id:number, subject_name: {name_kg:string}, - subject_type_name:{name_kg:string}, teacher:{name:string}, language:{name:string}, - id_edu_year:number,id_period:number, semester:{name_kg:string}, edu_form:{name_kg:string} + connect_id: number | null; + stream_id: number; + subject_name: { name_kg: string }; + subject_type_name: { name_kg: string }; + teacher: { name: string }; + language: { name: string }; + id_edu_year: number; + id_period: number; + semester: { name_kg: string }; + edu_form: { name_kg: string }; } + const shablon = [ + { + connect_id: 0, + stream_id: 2, + subject_name: { name_kg: 'test' }, + subject_type_name: { name_kg: 'test' }, + teacher: { name: 'test' }, + language: { name: 'test' }, + id_edu_year: 2, + id_period: 2, + semester: { name_kg: 'test' }, + edu_form: { name_kg: 'test' } + }, + { + connect_id: 0, + stream_id: 0, + subject_name: { name_kg: 'test' }, + subject_type_name: { name_kg: 'test' }, + teacher: { name: 'test' }, + language: { name: 'test' }, + id_edu_year: 2, + id_period: 2, + semester: { name_kg: 'test' }, + edu_form: { name_kg: 'test' } + }, + { + connect_id: 2, + stream_id: 2, + subject_name: { name_kg: 'test' }, + subject_type_name: { name_kg: 'test' }, + teacher: { name: 'test' }, + language: { name: 'test' }, + id_edu_year: 2, + id_period: 2, + semester: { name_kg: 'test' }, + edu_form: { name_kg: 'test' } + }, + { + connect_id: 2, + stream_id: 2, + subject_name: { name_kg: 'test' }, + subject_type_name: { name_kg: 'test' }, + teacher: { name: 'test' }, + language: { name: 'test' }, + id_edu_year: 2, + id_period: 2, + semester: { name_kg: 'test' }, + edu_form: { name_kg: 'test' } + }, + ]; const [streams, setStreams] = useState([]); const [streamValues, setStreamValues] = useState<{ stream: streamsType[] }>({ stream: [] }); - const [displayStreams, setDisplayStreams] = useState<{ course_id: number; stream_id: number; info: string | null; stream_title: string }[]>([]); + const [displayStreams, setDisplayStreams] = useState<{ course_id: number; stream_id: number; info: string | null; stream_title: string }[] | any>([]); const [hasStreams, setHasStreams] = useState(false); const [skeleton, setSkeleton] = useState(false); @@ -35,11 +92,11 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI }, 1000); }; - const profilactor = (data: {connect_id: number, course_id: number; stream_id: number; info: string | null}[]) => { + const profilactor = (data: { connect_id: number; course_id: number; stream_id: number; info: string | null }[]) => { const newStreams: { course_id: number; stream_id: number; info: string | null }[] = []; - + data.forEach((item) => { - if (item?.connect_id) { + if (item?.connect_id) { newStreams.push({ course_id: item?.course_id, stream_id: item.stream_id, @@ -100,8 +157,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI } }; - const handleEdit = (e:{checked:boolean}, id: number, title: string) => { - + const handleEdit = (e: { checked: boolean }, id: number, title: string) => { const forSentStreams = { course_id: courseValue!.id, stream_id: id, @@ -111,10 +167,15 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI if (e.checked) { // profilactor(); - setStreamValues((prev) => prev && ({ - ...prev, - stream: [...prev.stream, forSentStreams] - })); + setStreamValues( + (prev) => + prev && { + ...prev, + stream: [...prev.stream, forSentStreams] + } + ); + const x = {streamTitle} + insideDisplayStreams(); } else { setStreamValues( (prev) => @@ -136,7 +197,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI } }); - // setDisplayStreams(forDisplay); + setDisplayStreams(forDisplay); }, [streamValues]); useEffect(() => { @@ -156,7 +217,11 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI } }, [streams]); - const itemTemplate = (item:mainStreamsType, index: number) => { + useEffect(()=> { + console.log(displayStreams); + },[displayStreams]) + + const itemTemplate = (item: mainStreamsType, index: number) => { const bgClass = item.connect_id ? 'bg-[var(--greenBgColor)] border-b border-[gray]' : index % 2 == 1 ? 'bg-[#f5f5f5]' : ''; return ( @@ -177,7 +242,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI
-
+
{item?.subject_type_name?.name_kg} @@ -211,7 +276,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI ); }; - const listTemplate = (items:mainStreamsType[]) => { + const listTemplate = (items: mainStreamsType[]) => { if (!items || items.length === 0) return null; let list = items.map((product, index: number) => { @@ -248,7 +313,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI )} - {hasStreams ? ( + {!hasStreams ? ( ) : (
@@ -269,7 +334,7 @@ export default function StreamList({ callIndex, courseValue, isMobile }: { callI ) : ( <> - + )}
diff --git a/app/globals.css b/app/globals.css index e883080e..343c757f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -4,7 +4,8 @@ :root { --bodyFonts: "Jost", sans-serif; --mainColor: #08A9E6; - --mainBgColor: #e6eef1; + /* --mainBgColor: #e6eef1; */ + --mainBgColor: #fff; --redColor: #EC272F; --redBgColor: #EC272F1A; --greenColor: rgb(46, 192, 46); @@ -44,7 +45,7 @@ h1, h2, h3, h4, h5, h6 { } .login-bg{ - background: url('/layout/svg/login-bg.svg') no-repeat center/cover; + background: url('/layout/svg/login-bg.svg') repeat left/cover; } /* animate */ @@ -136,6 +137,7 @@ h1, h2, h3, h4, h5, h6 { height: 60px; width: 60px; } + #preloader-area .spinner { position: absolute; z-index: 9999; @@ -195,12 +197,29 @@ h1, h2, h3, h4, h5, h6 { right: 0; } +@media screen and (max-width: 640px) { + #preloader-area{ + position: absolute; + left: 60%; + top: 50%; + width: 10px; + height: 10px; + } + + #preloader-area .spinner { + position: absolute; + z-index: 9999; + /* width: 3px; Уменьшаем с 6px до 3px */ + height: 45px; /* Уменьшаем с 90px до 45px */ + margin-top: -22.5px; /* Уменьшаем с -45px до -22.5px */ + } +} + .p-password .p-password-toggle-icon { top: 50% !important; transform: translateY(-50%); } - .loaded #preloader-area { opacity: 0; visibility: hidden; @@ -313,8 +332,6 @@ h1, h2, h3, h4, h5, h6 { width: 100%; } - - /* primeReact components */ .popup_menu_left{ width: 300px; @@ -368,6 +385,10 @@ h1, h2, h3, h4, h5, h6 { background-color: #f5f5f5; } +.my-custom-mobile-table:nth-child(even) { + background-color: red; +} + /* удаление встроенного underline при активаности для таб (TabView) */ .p-tabview-ink-bar { display: none !important; @@ -427,6 +448,18 @@ h1, h2, h3, h4, h5, h6 { font-size: 12px; /* или любой нужный размер */ } +@media screen and (max-width: 640px) { + .p-toast-message{ + font-size: 14px !important; + width: 290px !important; + margin: 0 auto; + } + + .p-toast-message-content{ + padding: 10px !important; + } +} + /* styles/book.css */ /* Стили для контейнера всей книги */ diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index fb8256bb..5f8beecf 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -91,11 +91,6 @@ const AppTopbar = forwardRef((props, ref) => { icon: '', items: [], url: 'https://oshsu.kg' - }, - { - label: 'Байланыш', - icon: '', - items: [] } ]; diff --git a/public/layout/svg/login-bg.svg b/public/layout/svg/login-bg.svg index 5398aa5a..f704ca1a 100644 --- a/public/layout/svg/login-bg.svg +++ b/public/layout/svg/login-bg.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 69ed0e84c41778458b3917877e65dcfe44cf68c9 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 27 Aug 2025 11:31:03 +0600 Subject: [PATCH 119/286] =?UTF-8?q?=D0=A5=D0=BB=D0=B5=D0=B1=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D1=80=D0=BE=D1=88=D0=BA=D0=B8=20=D0=B8=20=D0=B4?= =?UTF-8?q?=D1=80=D1=83=D0=B3=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[courseTheme]/[lessons]/page.tsx | 90 ++++++++++++++----- app/(main)/course/[courseTheme]/page.tsx | 71 +++++++++++---- .../[connect_id]/[stream_id]/page.tsx | 86 ++++++++++++++---- app/components/SessionManager.tsx | 2 +- app/components/messages/Message.tsx | 2 +- app/globals.css | 3 +- hooks/useBreadCrumbs.tsx | 72 +++++++++++++++ layout/layout.tsx | 14 +-- types/breadCrumbType.tsx | 6 ++ 9 files changed, 281 insertions(+), 65 deletions(-) create mode 100644 hooks/useBreadCrumbs.tsx create mode 100644 types/breadCrumbType.tsx diff --git a/app/(main)/course/[courseTheme]/[lessons]/page.tsx b/app/(main)/course/[courseTheme]/[lessons]/page.tsx index 83fa63b4..7fe5ce0d 100644 --- a/app/(main)/course/[courseTheme]/[lessons]/page.tsx +++ b/app/(main)/course/[courseTheme]/[lessons]/page.tsx @@ -7,7 +7,7 @@ import { Button } from 'primereact/button'; import Redacting from '@/app/components/popUp/Redacting'; import { addLesson, deleteLesson, fetchLesson, updateLesson } from '@/services/courses'; import { getToken } from '@/utils/auth'; -import { useParams } from 'next/navigation'; +import { useParams, usePathname } from 'next/navigation'; import { LayoutContext } from '@/layout/context/layoutcontext'; import useErrorMessage from '@/hooks/useErrorMessage'; import { getRedactor } from '@/utils/getRedactor'; @@ -15,6 +15,7 @@ import { getConfirmOptions } from '@/utils/getConfirmOptions'; import LessonTyping from '@/app/components/lessons/LessonTyping'; import { TabViewChange } from '@/types/tabViewChange'; import { useMediaQuery } from '@/hooks/useMediaQuery'; +import useBreadCrumbs from '@/hooks/useBreadCrumbs'; export default function Lesson() { const [activeIndex, setActiveIndex] = useState(0); @@ -34,6 +35,42 @@ export default function Lesson() { const courseId = params.courseTheme; const lessonId = params.lessons; + const teachingBreadCrumb = [ + { + id: 1, + url: '/', + title: 'Башкы баракча', + parent_id: null + }, + { + id: 2, + url: '/course', + title: 'Курстар', + parent_id: 1 + }, + { + id: 3, + url: `/course/${lessonId}`, + title: 'Темалар', + parent_id: 2 + }, + { + id: 4, + url: '/course/:course_id/:lesson_id', + title: 'Сабактар', + parent_id: 3 + }, + { + id: 5, + url: '/students/:course_id/:stream_id', + title: 'Студенттер', + parent_id: 2 + } + ]; + + const pathname = usePathname(); + const breadcrumb = useBreadCrumbs(teachingBreadCrumb,pathname); + const handleText = (e: string) => { setSentValues(e); }; @@ -154,28 +191,37 @@ export default function Lesson() { setContentShow(true); }; - const lessonInfo =
-
- -
-

{'Сабактын аталышы'}

-
- - - handleTabChange({index: 1})} className='cursor-pointer hover:text-[var(--mainColor)] transition-all'>Документтердин саны: ? - - - - handleTabChange({index: 2})} className='cursor-pointer hover:text-[var(--mainColor)] transition-all'>Шилтемелердин саны: ? - - - - handleTabChange({index: 3})} className='cursor-pointer hover:text-[var(--mainColor)] transition-all'>Видеолордун саны: ? - + const lessonInfo = ( +
+
+ +
+

{'Сабактын аталышы'}

+
+ + + handleTabChange({ index: 1 })} className="cursor-pointer hover:text-[var(--mainColor)] transition-all"> + Документтердин саны: ? + + + + + handleTabChange({ index: 2 })} className="cursor-pointer hover:text-[var(--mainColor)] transition-all"> + Шилтемелердин саны: ? + + + + + handleTabChange({ index: 3 })} className="cursor-pointer hover:text-[var(--mainColor)] transition-all"> + Видеолордун саны: ? + + +
+
{breadcrumb}
-
+ ); // USE EFFECTS @@ -243,7 +289,9 @@ export default function Lesson() {
)}
- ) : lessonInfo} + ) : ( + lessonInfo + )} {/* DOC */} diff --git a/app/(main)/course/[courseTheme]/page.tsx b/app/(main)/course/[courseTheme]/page.tsx index 30b8aa74..f299aa2a 100644 --- a/app/(main)/course/[courseTheme]/page.tsx +++ b/app/(main)/course/[courseTheme]/page.tsx @@ -10,7 +10,7 @@ import { DataTable } from 'primereact/datatable'; import { InputText } from 'primereact/inputtext'; import { LayoutContext } from '@/layout/context/layoutcontext'; import React, { useContext, useEffect, useState } from 'react'; -import { useParams } from 'next/navigation'; +import { useParams, usePathname } from 'next/navigation'; import { addThemes, deleteTheme, fetchCourseInfo, fetchThemes, updateTheme } from '@/services/courses'; import useErrorMessage from '@/hooks/useErrorMessage'; import { CourseCreateType } from '@/types/courseCreateType'; @@ -19,6 +19,7 @@ import Redacting from '@/app/components/popUp/Redacting'; import { getRedactor } from '@/utils/getRedactor'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; import { ProgressSpinner } from 'primereact/progressspinner'; +import useBreadCrumbs from '@/hooks/useBreadCrumbs'; export default function CourseTheme() { const [hasThemes, setHasThemes] = useState(false); @@ -39,7 +40,42 @@ export default function CourseTheme() { const { courseTheme } = useParams() as { courseTheme: string }; + const teachingBreadCrumb = [ + { + id: 1, + url: '/', + title: 'Башкы баракча', + parent_id: null + }, + { + id: 2, + url: '/course', + title: 'Курстар', + parent_id: 1 + }, + { + id: 3, + url: `/course/:id`, + title: 'Темалар', + parent_id: 2 + }, + { + id: 4, + url: '/course/:course_id/:lesson_id', + title: 'Сабактар', + parent_id: 3 + }, + { + id: 5, + url: '/students/:course_id/:stream_id', + title: 'Студенттер', + parent_id: 2 + } + ]; + const showError = useErrorMessage(); + const pathname = usePathname(); + const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); const toggleSkeleton = () => { setSkeleton(true); @@ -158,13 +194,13 @@ export default function CourseTheme() { }; useEffect(() => { - handleFetchInfo(); - handleFetchThemes(); + // handleFetchInfo(); + // handleFetchThemes(); }, []); useEffect(() => { const handleShow = async () => { - setProgressSpinner(true) + setProgressSpinner(true); const data: { lessons: { data: { id: number; title: string }[] } } = await fetchThemes(Number(courseTheme)); if (data?.lessons) { @@ -203,21 +239,24 @@ export default function CourseTheme() { return (
{/* title section */} -
-
-

- {themeInfo?.title} -

-

{themeInfo?.description}

-
- - {themeInfo?.created_at} +
+
+
+

+ {themeInfo?.title} +

+

{themeInfo?.description}

+
+ + {themeInfo?.created_at} +
-
-
- +
+ +
+
{breadcrumb}
{/* add button*/} diff --git a/app/(main)/students/[connect_id]/[stream_id]/page.tsx b/app/(main)/students/[connect_id]/[stream_id]/page.tsx index 320fca8e..38c455a6 100644 --- a/app/(main)/students/[connect_id]/[stream_id]/page.tsx +++ b/app/(main)/students/[connect_id]/[stream_id]/page.tsx @@ -3,11 +3,12 @@ import InfoBanner from '@/app/components/InfoBanner'; import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; +import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchStreamStudents } from '@/services/streams'; -import Link from 'next/link'; -import { useParams } from 'next/navigation'; +import { useParams, usePathname } from 'next/navigation'; import { Button } from 'primereact/button'; import { Column } from 'primereact/column'; import { DataTable } from 'primereact/datatable'; @@ -39,7 +40,7 @@ export default function StudentList() { last_visist: 'xx-xx', info: true } - ] + ]; // const [studentList, setStudentList] = useState([]); const [hasList, setHasList] = useState(false); const [skeleton, setSkeleton] = useState(false); @@ -47,9 +48,46 @@ export default function StudentList() { const { setMessage, setGlobalLoading } = useContext(LayoutContext); const showError = useErrorMessage(); - const {connect_id, stream_id} = useParams(); + const { connect_id, stream_id } = useParams(); console.log('params: ', connect_id, stream_id); - + + const media = useMediaQuery('(max-width: 640px)'); + const teachingBreadCrumb = [ + { + id: 1, + url: '/', + title: 'Башкы баракча', + parent_id: null + }, + { + id: 2, + url: '/course', + title: 'Курстар', + parent_id: 1 + }, + { + id: 3, + url: `/course/:id`, + title: 'Темалар', + parent_id: 2 + }, + { + id: 4, + url: '/course/:course_id/:lesson_id', + title: 'Сабактар', + parent_id: 3 + }, + { + id: 5, + url: `/students/${connect_id}/${stream_id}`, + title: 'Студенттер', + parent_id: 2 + } + ]; + + const pathname = usePathname(); + const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); + // functions const toggleSkeleton = () => { setSkeleton(true); @@ -61,7 +99,7 @@ export default function StudentList() { const handleFetchStudents = async () => { const data = await fetchStreamStudents(connect_id ? Number(connect_id) : null, stream_id ? Number(stream_id) : null); console.log(data); - + toggleSkeleton(); if (data && data.students) { setHasList(false); @@ -88,13 +126,19 @@ export default function StudentList() { return (
{skeleton ? ( - - ) : ( - <> - {/* info section */} - - - ) } + + ) : ( + <> + {/* info section */} +
+ +
+

{'Угуучулардын тизмеси'}

+
{breadcrumb}
+
+
+ + )} {/* table section */} {!hasList ? ( @@ -107,11 +151,17 @@ export default function StudentList() { <> rowIndex + 1} header="Номер" style={{ width: '20px' }}> -
- {rowData.last_name} - {rowData.name} - {rowData.father_name} -
} + ( +
+ {rowData.last_name} + {rowData.name} + {rowData.father_name} +
+ )} >
(null); const showError = () => { - toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 30000 }); + toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 2000 }); }; useEffect(() => { diff --git a/app/globals.css b/app/globals.css index 343c757f..18560759 100644 --- a/app/globals.css +++ b/app/globals.css @@ -41,7 +41,8 @@ h1, h2, h3, h4, h5, h6 { } .mainColor-hover:hover{ - color: #08A9E6; + color: #08A9E6 !important; + transition: .5s; } .login-bg{ diff --git a/hooks/useBreadCrumbs.tsx b/hooks/useBreadCrumbs.tsx new file mode 100644 index 00000000..2b8fc5ad --- /dev/null +++ b/hooks/useBreadCrumbs.tsx @@ -0,0 +1,72 @@ +'use client'; + +import { breadCrumbType } from '@/types/breadCrumbType'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import { useEffect, useState } from 'react'; + +export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], currentUrl: string) { + const pathname = usePathname(); + + const [breadCrumb, setBreadCrumb] = useState([]); + + const matchUrl = (pattern: string, url: string) => { + // Заменяем все ":что-то" на "([^/]+)" (регулярка: один сегмент) + const regex = new RegExp('^' + pattern.replace(/:[^/]+/g, '[^/]+') + '$'); + return regex.test(url); + }; + + const getBreadcrumbs = (data: breadCrumbType[], currentUrl: string) => { + + // 1. Находим текущую страницу по URL (с учётом динамики) + const currentPage = data.find((item) => matchUrl(item.url, currentUrl)); + console.log(currentPage); + + if (!currentPage) return []; + + const breadcrumbs = []; + let currentItem: breadCrumbType = currentPage; + const visited = new Set(); + + while (currentItem) { + if (visited.has(currentItem.id)) { + // Зацикленность → выходим + console.warn('Цикл в дереве хлебных крошек!'); + break; + } + visited.add(currentItem.id); + + breadcrumbs.unshift(currentItem); + const parent = data.find((item) => item.id === currentItem.parent_id); + if (parent) currentItem = parent; + else break; + } + + return breadcrumbs; + }; + + useEffect(() => { + const forBreadcrumb = getBreadcrumbs(insideBreadCrumb, currentUrl); + console.log(forBreadcrumb); + setBreadCrumb(forBreadcrumb); + }, [pathname]); + + return ( +
+ {breadCrumb?.map((crumb: breadCrumbType, index) => ( +
+
+ {index < breadCrumb.length - 1 ? ( + + {crumb.title} + + ) : ( + {crumb.title} + )} +
+ {index < breadCrumb.length - 1 && / } +
+ ))} +
+ ); +} diff --git a/layout/layout.tsx b/layout/layout.tsx index e40fd328..b6fc8faa 100644 --- a/layout/layout.tsx +++ b/layout/layout.tsx @@ -125,19 +125,19 @@ const Layout = ({ children }: ChildContainerProps) => { const requireRole = () => { console.log('Ваш статус: ', user?.is_working); - if(user){ - if(!user?.is_working){ + if (user) { + if (!user?.is_working) { // window.location.href = '/auth/login'; // setPermission(true); console.log('Не имеете доступ! working'); } setPermission(false); - } - } + } + }; - useEffect(()=> { - requireRole(); - },[user, pathname]); + useEffect(() => { + requireRole(); + }, [user, pathname]); // if(permission) return null; diff --git a/types/breadCrumbType.tsx b/types/breadCrumbType.tsx new file mode 100644 index 00000000..55c31ceb --- /dev/null +++ b/types/breadCrumbType.tsx @@ -0,0 +1,6 @@ +export interface breadCrumbType { + id: number; + url: string; + title: string; + parent_id: number | null; +} From e0f1fa478405507fd214e71fbf5115a041581af2 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 27 Aug 2025 13:18:31 +0600 Subject: [PATCH 120/286] =?UTF-8?q?=D0=9C=D0=BE=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=83=D0=B4=D0=BE=D0=B1=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=201.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[courseTheme]/[lessons]/page.tsx | 10 +- app/(main)/course/[courseTheme]/page.tsx | 2 +- app/(main)/course/page.tsx | 3 +- app/components/HomeClient.tsx | 2 +- app/components/popUp/FormModal.tsx | 102 ++++++++++++------ app/components/tables/StreamList.tsx | 2 +- app/globals.css | 20 ++++ hooks/useBreadCrumbs.tsx | 6 +- 8 files changed, 103 insertions(+), 44 deletions(-) diff --git a/app/(main)/course/[courseTheme]/[lessons]/page.tsx b/app/(main)/course/[courseTheme]/[lessons]/page.tsx index 7fe5ce0d..c61bc859 100644 --- a/app/(main)/course/[courseTheme]/[lessons]/page.tsx +++ b/app/(main)/course/[courseTheme]/[lessons]/page.tsx @@ -193,7 +193,7 @@ export default function Lesson() { const lessonInfo = (
-
+

{'Сабактын аталышы'}

@@ -240,7 +240,7 @@ export default function Lesson() { {/* CKEDITOR */} {/* title section */} -
+

diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index db9e4f38..71041d71 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -504,6 +504,7 @@ export default function Course() { disabled={progressSpinner === true ? true : false} rows={5} cols={30} + className='w-[300px]' onChange={(e) => { editMode ? setEditingLesson((prev) => ({ @@ -690,7 +691,7 @@ export default function Course() {

{/* STREAMS SECTION */}
- + {}} />
)} diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index b3b74e96..43ccccc4 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -18,7 +18,7 @@ export default function HomeClient() { return (
- {/* {"Уроки"} */} + {"Уроки"}
diff --git a/app/components/popUp/FormModal.tsx b/app/components/popUp/FormModal.tsx index 9ec91e8d..d281290a 100644 --- a/app/components/popUp/FormModal.tsx +++ b/app/components/popUp/FormModal.tsx @@ -1,49 +1,87 @@ 'use client'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; import { Button } from 'primereact/button'; import { Dialog } from 'primereact/dialog'; import { ReactNode, useEffect } from 'react'; -export default function FormModal({children, title, fetchValue, clearValues, visible, setVisible, start}: - { - children: ReactNode, - title: string, - fetchValue: ()=> void, - clearValues: ()=> void, - visible: boolean, - setVisible: (params: boolean)=> void, - start: boolean - } - ){ +export default function FormModal({ + children, + title, + fetchValue, + clearValues, + visible, + setVisible, + start +}: { + children: ReactNode; + title: string; + fetchValue: () => void; + clearValues: () => void; + visible: boolean; + setVisible: (params: boolean) => void; + start: boolean; +}) { + const media = useMediaQuery('(max-width:640px)'); const footerContent = (
-
); return (
- { - if (!visible) return; - setVisible(false); - clearValues(); - }} - footer={footerContent} - > - {children} - + {media ? ( + { + if (!visible) return; + setVisible(false); + clearValues(); + }} + footer={footerContent} + > + {children} + + ) : ( + { + if (!visible) return; + setVisible(false); + clearValues(); + }} + footer={footerContent} + > + {children} + + )}
); } diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 66de54db..54ed7e2a 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -174,7 +174,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis stream: [...prev.stream, forSentStreams] } ); - const x = {streamTitle} + // const x = {streamTitle} insideDisplayStreams(); } else { setStreamValues( diff --git a/app/globals.css b/app/globals.css index 18560759..2e1512d1 100644 --- a/app/globals.css +++ b/app/globals.css @@ -438,8 +438,17 @@ h1, h2, h3, h4, h5, h6 { @media screen and (max-width: 640px) { .my-custom-dialog{ + width: 350px; + } + .my-custom-document-dialog{ width: 300px; } +} + +@media screen and (max-width: 440px) { + .my-custom-dialog{ + width:320px; + } .my-custom-document-dialog{ width: 300px; } @@ -461,6 +470,17 @@ h1, h2, h3, h4, h5, h6 { } } +@media (max-width: 480px) { + .p-confirm-dialog { + width: 90% !important; + margin: 0 5% !important; + } + .p-confirm-dialog .p-button { + width: 100%; + margin-top: 0.5rem; + } +} + /* styles/book.css */ /* Стили для контейнера всей книги */ diff --git a/hooks/useBreadCrumbs.tsx b/hooks/useBreadCrumbs.tsx index 2b8fc5ad..86d3372c 100644 --- a/hooks/useBreadCrumbs.tsx +++ b/hooks/useBreadCrumbs.tsx @@ -52,10 +52,10 @@ export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], curre }, [pathname]); return ( -
+
{breadCrumb?.map((crumb: breadCrumbType, index) => (
-
+
{index < breadCrumb.length - 1 ? ( {crumb.title} @@ -64,7 +64,7 @@ export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], curre {crumb.title} )}
- {index < breadCrumb.length - 1 && / } + {index < breadCrumb.length - 1 && / }
))}
From 1576e8ca0aabb130b841b4f119ca888dd1998248 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 27 Aug 2025 22:44:08 +0600 Subject: [PATCH 121/286] =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B5=D0=BF=D0=BB?= =?UTF-8?q?=D0=BE=D1=8F,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=B4=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D0=B9=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++++ .idea/codeStyles/Project.xml | 48 ++++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 ++ .idea/deployment.xml | 14 ++++++ .idea/inspectionProfiles/Project_Default.xml | 6 +++ .idea/modules.xml | 8 ++++ .idea/prettier.xml | 6 +++ .idea/sakai-react.iml | 12 +++++ .idea/vcs.xml | 6 +++ .idea/webServers.xml | 14 ++++++ app/(main)/course/page.tsx | 25 +++++++--- app/components/HomeClient.tsx | 2 +- app/components/PDFBook.tsx | 2 +- app/components/SessionManager.tsx | 4 +- app/components/VideoPlay.tsx | 2 +- app/components/lessons/LessonTyping.tsx | 1 + app/components/tables/StreamList.tsx | 4 +- app/globals.css | 25 ++++++++++ layout/AppFooter.tsx | 2 +- layout/AppTopbar.tsx | 31 +++---------- next.config.js | 4 +- package.json | 1 + services/auth.tsx | 6 ++- services/courses.tsx | 2 +- services/query-tests.http | 36 +++++++-------- 25 files changed, 212 insertions(+), 62 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/deployment.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/prettier.xml create mode 100644 .idea/sakai-react.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/webServers.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..75d97586 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/deployment.xml b/.idea/deployment.xml new file mode 100644 index 00000000..3bc60ed5 --- /dev/null +++ b/.idea/deployment.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..03d9549e --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..9d3a0203 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 00000000..b0c1c68f --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/sakai-react.iml b/.idea/sakai-react.iml new file mode 100644 index 00000000..24643cc3 --- /dev/null +++ b/.idea/sakai-react.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/webServers.xml b/.idea/webServers.xml new file mode 100644 index 00000000..083d91ec --- /dev/null +++ b/.idea/webServers.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 71041d71..7996d588 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -420,7 +420,7 @@ export default function Course() { ); }; - const imagestateStyle = imageState ? 'flex gap-1 items-center justify-between' : ''; + const imagestateStyle = imageState ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 30); return ( @@ -429,10 +429,14 @@ export default function Course() {
- {imagestateStyle &&
{typeof imageState === 'string' && }
} -
+ {imagestateStyle && ( +
+ {typeof imageState === 'string' && } +
+ )} +
- + {courseValue.image || editingLesson.image ? (
{typeof editingLesson.image === 'string' && ( @@ -504,7 +508,7 @@ export default function Course() { disabled={progressSpinner === true ? true : false} rows={5} cols={30} - className='w-[300px]' + className="w-[300px]" onChange={(e) => { editMode ? setEditingLesson((prev) => ({ @@ -576,12 +580,19 @@ export default function Course() { />
+ handlePageChange(e.page + 1)} + template={media ? 'FirstPageLink PrevPageLink NextPageLink LastPageLink' : 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink'} + /> )} @@ -691,7 +702,7 @@ export default function Course() {
{/* STREAMS SECTION */}
- {}} /> + {}} />
)} diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 43ccccc4..0eab5958 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -18,7 +18,7 @@ export default function HomeClient() { return (
- {"Уроки"} + {/* {"Уроки"} */}
diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index abbab375..f1f80ce9 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -32,7 +32,7 @@ export default function PDFViewer({ url }: { url: string }) { try { // Проверяем, одна ли страница в документе - const newUrl = `http://api.mooc.oshsu.kg/temprory-file/${url}`; + const newUrl = `https://api.mooc.oshsu.kg/temprory-file/${url}`; const pdf = await pdfjsLib.getDocument(newUrl).promise; const tempPages = []; const firstPage = await pdf.getPage(1); diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 8de43d5f..91eb9ead 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -76,8 +76,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - // logout({ setUser, setGlobalLoading }); - // window.location.href = '/auth/login'; + logout({ setUser, setGlobalLoading }); + window.location.href = '/auth/login'; return; } setTimeout(() => { diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index 0b3f6094..e38163d8 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -43,7 +43,7 @@ export default function VideoPlay() {
- Логотип ОшГУ + Логотип ОшГУ
) diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 6eb7465c..2a67e46f 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -226,6 +226,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp
)} - {!hasStreams ? ( + {hasStreams ? ( ) : (
@@ -334,7 +334,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis ) : ( <> - + )}
diff --git a/app/globals.css b/app/globals.css index 2e1512d1..2e9dec58 100644 --- a/app/globals.css +++ b/app/globals.css @@ -478,6 +478,17 @@ h1, h2, h3, h4, h5, h6 { .p-confirm-dialog .p-button { width: 100%; margin-top: 0.5rem; + padding: 4px 5px !important; + } +} + +@media (max-width: 480px) { + + .p-button-label { + font-size: 14px !important; + } + .p-button-icon{ + width: 14px !important; } } @@ -536,4 +547,18 @@ h1, h2, h3, h4, h5, h6 { border-radius: 12px; padding: 4px 12px; box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.02), 0px 0px 2px rgba(0, 0, 0, 0.05), 0px 1px 4px rgba(0, 0, 0, 0.08); +} + +.p-paginator .p-paginator-first, .p-paginator .p-paginator-prev, .p-paginator .p-paginator-next, .p-paginator .p-paginator-last{ + min-width: 2rem !important; +} + +/* file upload */ +@media screen and (max-width: 640px) { + .p-button-label .p-clickable{ + font-size: 14px !important; + } + .p-fileupload-choose{ + padding: 4px 5px; + } } \ No newline at end of file diff --git a/layout/AppFooter.tsx b/layout/AppFooter.tsx index a6730783..84a2679b 100644 --- a/layout/AppFooter.tsx +++ b/layout/AppFooter.tsx @@ -18,7 +18,7 @@ const AppFooter = () => {
- Логотип + Логотип
Кыргызстан, 723500, г. Ош, ул. Ленина, 331, ОшГУ Главный корпус Общий отдел: +996 3222 7-07-12, diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 5f8beecf..04bb88ae 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -8,7 +8,7 @@ import { classNames } from 'primereact/utils'; import { AppTopbarRef } from '@/types'; import { LayoutContext } from './context/layoutcontext'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { usePathname } from 'next/navigation'; +import { usePathname, useRouter } from 'next/navigation'; import { logout } from '@/utils/logout'; const AppTopbar = forwardRef((props, ref) => { @@ -28,29 +28,7 @@ const AppTopbar = forwardRef((props, ref) => { const pathName = usePathname(); const media = useMediaQuery('(max-width: 1000px)'); - const items = [ - { - label: 'Ачык онлайн курстар', - icon: 'pi pi-file', - items: [], - url: '/login' - }, - { - label: 'Бакалавриат', - icon: 'pi pi-file', - items: [] - }, - { - label: 'Магистратура', - icon: 'pi pi-file', - items: [] - }, - { - label: 'Кошумча билим берүү', - icon: 'pi pi-file', - items: [] - } - ]; + const router = useRouter() const mobileMenu = [ user @@ -84,7 +62,10 @@ const AppTopbar = forwardRef((props, ref) => { label: 'Кирүү', icon: 'pi pi-sign-in', items: [], - url: '/auth/login' + // url: '/auth/login' + command: ()=> { + router.push('/auth/login'); + } }, { label: 'ОшМУнун сайты', diff --git a/next.config.js b/next.config.js index 767719fc..92539f64 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + output: 'export', +} module.exports = nextConfig diff --git a/package.json b/package.json index 9d95e74b..4057f700 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "next dev", "build": "next build", + "export": "next export", "start": "next start", "format": "prettier --write \"{app,demo,layout,types}/**/*.{js,ts,tsx,d.ts}\"", "lint": "next lint" diff --git a/services/auth.tsx b/services/auth.tsx index aec595d3..67fe48f9 100644 --- a/services/auth.tsx +++ b/services/auth.tsx @@ -11,7 +11,8 @@ let url = ''; export const login = async (value:LoginType) => { url = process.env.NEXT_PUBLIC_BASE_URL + '/login?'; - + console.log(url); + try { const res = await axiosInstance.post('/login?', value); const data = res.data; @@ -24,7 +25,8 @@ export const login = async (value:LoginType) => { export const getUser = async () => { url = process.env.NEXT_PUBLIC_BASE_URL + '/v1/user'; - + console.log(url); + try { const res = await axiosInstance.get(url); diff --git a/services/courses.tsx b/services/courses.tsx index c5be7db8..35da33e1 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -6,7 +6,7 @@ let url = ''; export const fetchCourses = async (page: number | null, limit: number | null) => { try { - const res = await axiosInstance.get(`/v1/teacher/courses?page=${Number(page)}&limit=${''}`); + const res = await axiosInstance.get(`/v1/teacher/courses?page=${Number(page)}&limit=${'3'}`); const data = await res.data; return data; diff --git a/services/query-tests.http b/services/query-tests.http index 8aa81c0b..94eeae42 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,24 +1,24 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTU4NjAxNzUsImV4cCI6MTc1NTg4OTAzNSwibmJmIjoxNzU1ODYwMTc1LCJqdGkiOiJ4ZFhqRXF1UTJCUzhPM05lIiwic3ViIjoiNTAzMjciLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.JsSkS7lVmjhq_9v9sGrcPUn_neb09rKfPTY4UjyXrLg +# @token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTU4NjAxNzUsImV4cCI6MTc1NTg4OTAzNSwibmJmIjoxNzU1ODYwMTc1LCJqdGkiOiJ4ZFhqRXF1UTJCUzhPM05lIiwic3ViIjoiNTAzMjciLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.JsSkS7lVmjhq_9v9sGrcPUn_neb09rKfPTY4UjyXrLg -### +# ### -http://api.mooc.oshsu.kg/public/api/v1/open/video/types -Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTQzODYzMzAsImV4cCI6MTc1NDQxNTE5MCwibmJmIjoxNzU0Mzg2MzMwLCJqdGkiOiJjc0hhSkdqYVhsT1V1VkpPIiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.E9dQ1RCISvf2psrA1iDf9CrYzExEKnZOgYq2XJ4cyXg -Content-Type: application/json +# http://api.mooc.oshsu.kg/public/api/v1/open/video/types +# Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTQzODYzMzAsImV4cCI6MTc1NDQxNTE5MCwibmJmIjoxNzU0Mzg2MzMwLCJqdGkiOiJjc0hhSkdqYVhsT1V1VkpPIiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.E9dQ1RCISvf2psrA1iDf9CrYzExEKnZOgYq2XJ4cyXg +# Content-Type: application/json -### -# STREAMS GET +# ### +# # STREAMS GET -GET http://api.mooc.oshsu.kg/public/api/v1/teacher/stream?course_id=77 -Authorization: Bearer {{token}} -Content-Type: application/json +# GET http://api.mooc.oshsu.kg/public/api/v1/teacher/stream?course_id=77 +# Authorization: Bearer {{token}} +# Content-Type: application/json -### -# test -GET http://api.mooc.oshsu.kg/public/api/v1/student/course/lesson/show -Authorization: Bearer {{token}} -Content-Type: application/json +# ### +# # test +# GET http://api.mooc.oshsu.kg/public/api/v1/student/course/lesson/show +# Authorization: Bearer {{token}} +# Content-Type: application/json -{ - "lesson_id": 57 -} +# { +# "lesson_id": 57 +# } From 83152612e09626fdce63cc2500b927e9919729d1 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 27 Aug 2025 22:59:57 +0600 Subject: [PATCH 122/286] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D1=81=D0=B0=D0=BA=D0=B0=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/landing/page.tsx | 557 ------------- app/(main)/blocks/page.tsx | 836 -------------------- app/(main)/documentation/index.module.css | 16 - app/(main)/documentation/page.tsx | 241 ------ app/(main)/pages/crud/page.tsx | 430 ---------- app/(main)/pages/empty/page.tsx | 16 - app/(main)/pages/timeline/page.tsx | 116 --- app/(main)/teacher/page.tsx | 393 --------- app/(main)/uikit/button/index.module.scss | 151 ---- app/(main)/uikit/button/page.tsx | 248 ------ app/(main)/uikit/charts/page.tsx | 283 ------- app/(main)/uikit/file/page.tsx | 35 - app/(main)/uikit/floatlabel/page.tsx | 215 ----- app/(main)/uikit/formlayout/page.tsx | 148 ---- app/(main)/uikit/input/page.tsx | 522 ------------ app/(main)/uikit/invalidstate/page.tsx | 186 ----- app/(main)/uikit/list/page.tsx | 192 ----- app/(main)/uikit/media/page.tsx | 109 --- app/(main)/uikit/menu/confirmation/page.tsx | 16 - app/(main)/uikit/menu/page.tsx | 584 -------------- app/(main)/uikit/menu/payment/page.tsx | 15 - app/(main)/uikit/menu/seat/page.tsx | 16 - app/(main)/uikit/message/page.tsx | 131 --- app/(main)/uikit/misc/page.tsx | 220 ------ app/(main)/uikit/overlay/page.tsx | 222 ------ app/(main)/uikit/panel/page.tsx | 233 ------ app/(main)/uikit/table/page.tsx | 464 ----------- app/(main)/uikit/tree/page.tsx | 42 - app/(main)/utilities/icons/page.tsx | 121 --- 29 files changed, 6758 deletions(-) delete mode 100644 app/(full-page)/landing/page.tsx delete mode 100644 app/(main)/blocks/page.tsx delete mode 100644 app/(main)/documentation/index.module.css delete mode 100644 app/(main)/documentation/page.tsx delete mode 100644 app/(main)/pages/crud/page.tsx delete mode 100644 app/(main)/pages/empty/page.tsx delete mode 100644 app/(main)/pages/timeline/page.tsx delete mode 100644 app/(main)/teacher/page.tsx delete mode 100644 app/(main)/uikit/button/index.module.scss delete mode 100644 app/(main)/uikit/button/page.tsx delete mode 100644 app/(main)/uikit/charts/page.tsx delete mode 100644 app/(main)/uikit/file/page.tsx delete mode 100644 app/(main)/uikit/floatlabel/page.tsx delete mode 100644 app/(main)/uikit/formlayout/page.tsx delete mode 100644 app/(main)/uikit/input/page.tsx delete mode 100644 app/(main)/uikit/invalidstate/page.tsx delete mode 100644 app/(main)/uikit/list/page.tsx delete mode 100644 app/(main)/uikit/media/page.tsx delete mode 100644 app/(main)/uikit/menu/confirmation/page.tsx delete mode 100644 app/(main)/uikit/menu/page.tsx delete mode 100644 app/(main)/uikit/menu/payment/page.tsx delete mode 100644 app/(main)/uikit/menu/seat/page.tsx delete mode 100644 app/(main)/uikit/message/page.tsx delete mode 100644 app/(main)/uikit/misc/page.tsx delete mode 100644 app/(main)/uikit/overlay/page.tsx delete mode 100644 app/(main)/uikit/panel/page.tsx delete mode 100644 app/(main)/uikit/table/page.tsx delete mode 100644 app/(main)/uikit/tree/page.tsx delete mode 100644 app/(main)/utilities/icons/page.tsx diff --git a/app/(full-page)/landing/page.tsx b/app/(full-page)/landing/page.tsx deleted file mode 100644 index 9377d188..00000000 --- a/app/(full-page)/landing/page.tsx +++ /dev/null @@ -1,557 +0,0 @@ -'use client'; -/* eslint-disable @next/next/no-img-element */ -import React, { useContext, useRef, useState } from 'react'; -import Link from 'next/link'; - -import { StyleClass } from 'primereact/styleclass'; -import { Button } from 'primereact/button'; -import { Ripple } from 'primereact/ripple'; -import { Divider } from 'primereact/divider'; -import { LayoutContext } from '../../../layout/context/layoutcontext'; -import { NodeRef } from '@/types'; -import { classNames } from 'primereact/utils'; - -const LandingPage = () => { - const [isHidden, setIsHidden] = useState(false); - const { layoutConfig } = useContext(LayoutContext); - const menuRef = useRef(null); - - const toggleMenuItemClick = () => { - setIsHidden((prevState) => !prevState); - }; - - return ( -
-
-
- - Sakai Logo - SAKAI - - - - - -
- -
-
-

- Eu sem integereget magna fermentum -

-

Sed blandit libero volutpat sed cras. Fames ac turpis egestas integer. Placerat in egestas erat...

- -
-
- Hero Image -
-
- -
-
-
-

Marvelous Features

- Placerat in egestas erat... -
- -
-
-
-
- -
-
Easy to Use
- Posuere morbi leo urna molestie. -
-
-
- -
-
-
-
- -
-
Fresh Design
- Semper risus in hendrerit. -
-
-
- -
-
-
-
- -
-
Well Documented
- Non arcu risus quis varius quam quisque. -
-
-
- -
-
-
-
- -
-
Responsive Layout
- Nulla malesuada pellentesque elit. -
-
-
- -
-
-
-
- -
-
Clean Code
- Condimentum lacinia quis vel eros. -
-
-
- -
-
-
-
- -
-
Dark Mode
- Convallis tellus id interdum velit laoreet. -
-
-
- -
-
-
-
- -
-
Ready to Use
- Mauris sit amet massa vitae. -
-
-
- -
-
-
-
- -
-
Modern Practices
- Elementum nibh tellus molestie nunc non. -
-
-
- -
-
-
-
- -
-
Privacy
- Neque egestas congue quisque. -
-
-
- -
-
-

Joséphine Miller

- Peak Interactive -

- “Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est - laborum.” -

- Company logo -
-
-
-
- -
-
-

Powerful Everywhere

- Amet consectetur adipiscing elit... -
- -
-
- mockup mobile -
- -
-
- -
-

Congue Quisque Egestas

- - Lectus arcu bibendum at varius vel pharetra vel turpis nunc. Eget aliquet nibh praesent tristique magna sit amet purus gravida. Sit amet mattis vulputate enim nulla aliquet. - -
-
- -
-
-
- -
-

Celerisque Eu Ultrices

- - Adipiscing commodo elit at imperdiet dui. Viverra nibh cras pulvinar mattis nunc sed blandit libero. Suspendisse in est ante in. Mauris pharetra et ultrices neque ornare aenean euismod elementum nisi. - -
- -
- mockup -
-
-
- -
-
-

Matchless Pricing

- Amet consectetur adipiscing elit... -
- -
-
-
-

Free

- free -
- $0 - per month - -
- -
    -
  • - - Responsive Layout -
  • -
  • - - Unlimited Push Messages -
  • -
  • - - 50 Support Ticket -
  • -
  • - - Free Shipping -
  • -
-
-
- -
-
-

Startup

- startup -
- $1 - per month - -
- -
    -
  • - - Responsive Layout -
  • -
  • - - Unlimited Push Messages -
  • -
  • - - 50 Support Ticket -
  • -
  • - - Free Shipping -
  • -
-
-
- -
-
-

Enterprise

- enterprise -
- $999 - per month - -
- -
    -
  • - - Responsive Layout -
  • -
  • - - Unlimited Push Messages -
  • -
  • - - 50 Support Ticket -
  • -
  • - - Free Shipping -
  • -
-
-
-
-
- -
-
-
- ); -}; - -export default LandingPage; diff --git a/app/(main)/blocks/page.tsx b/app/(main)/blocks/page.tsx deleted file mode 100644 index ebd5a25c..00000000 --- a/app/(main)/blocks/page.tsx +++ /dev/null @@ -1,836 +0,0 @@ -'use client'; -import React, { useState } from 'react'; - -import { InputText } from 'primereact/inputtext'; -import { Chip } from 'primereact/chip'; -import { Checkbox } from 'primereact/checkbox'; -import { Button } from 'primereact/button'; -import BlockViewer from '../../../demo/components/BlockViewer'; - -const Free = () => { - const [checked, setChecked] = useState(false); - - const block1 = ` -
-
-
- Create the screens -
your visitors deserve to see
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

- -
-
-
- hero-1 -
-
- `; - - const block2 = ` -
-
- One Product, - Many Solutions -
-
Ac turpis egestas maecenas pharetra convallis posuere morbi leo urna.
-
-
- - - -
Built for Developers
- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -
-
- - - -
End-to-End Encryption
- Risus nec feugiat in fermentum posuere urna nec. Posuere sollicitudin aliquam ultrices sagittis. -
-
- - - -
Easy to Use
- Ornare suspendisse sed nisi lacus sed viverra tellus. Neque volutpat ac tincidunt vitae semper. -
-
- - - -
Fast & Global Support
- Fermentum et sollicitudin ac orci phasellus egestas tellus rutrum tellus. -
-
- - - -
Open Source
- Nec tincidunt praesent semper feugiat. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. -
-
- - - -
Trusted Securitty
- Mattis rhoncus urna neque viverra justo nec ultrices. Id cursus metus aliquam eleifend. -
-
-
- `; - - const block3 = ` -
-
Pricing Plans
-
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit numquam eligendi quos.
- -
-
-
-
-
Basic
-
Plan description
-
-
- $9 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
-
-
-
-
- -
-
-
-
Premium
-
Plan description
-
-
- $29 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
  • - - Duis ultricies lacus sed -
  • -
-
-
-
-
- -
-
-
-
Enterprise
-
Plan description
-
-
- $49 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
  • - - Duis ultricies lacus sed -
  • -
  • - - Imperdiet proin -
  • -
  • - - Nisi scelerisque -
  • -
-
-
-
-
-
-
- `; - - const block4 = ` -
-
 POWERED BY DISCORD
-
Join Our Design Community
-
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit numquam eligendi quos.
-
- `; - - const block5 = ` -
-
🔥 Hot Deals!
-
- Libero voluptatum atque exercitationem praesentium provident odit. -
- - Learn More - - - - -
- `; - - const block6 = ` -
- -
-
-
Customers
-
-
- - 332 Active Users -
-
- - 9402 Sessions -
-
- - 2.32m Avg. Duration -
-
-
-
-
-
-
- `; - - const block7 = ` -
-
-
-
-
- Orders -
152
-
-
- -
-
- 24 new - since last visit -
-
-
-
-
-
- Revenue -
$2.100
-
-
- -
-
- %52+ - since last week -
-
-
-
-
-
- Customers -
28441
-
-
- -
-
- 520 - newly registered -
-
-
-
-
-
- Comments -
152 Unread
-
-
- -
-
- 85 - responded -
-
-
- `; - - const block8 = ` -
-
-
- hyper -
Welcome Back
- Don't have an account? - Create today! -
- -
- - - - - - -
-
- setChecked(e.checked)} checked={checked} className="mr-2" /> - -
- Forgot your password? -
- -
-
-
- `; - - const block9 = ` -
-
Movie Information
-
Morbi tristique blandit turpis. In viverra ligula id nulla hendrerit rutrum.
-
    -
  • -
    Title
    -
    Heat
    -
    -
    -
  • -
  • -
    Genre
    -
    - - - -
    -
    -
    -
  • -
  • -
    Director
    -
    Michael Mann
    -
    -
    -
  • -
  • -
    Actors
    -
    Robert De Niro, Al Pacino
    -
    -
    -
  • -
  • -
    Plot
    -
    - A group of professional bank robbers start to feel the heat from police - when they unknowingly leave a clue at their latest heist.
    -
    -
    -
  • -
-
- `; - - const block10 = ` -
-
Card Title
-
Vivamus id nisl interdum, blandit augue sit amet, eleifend mi.
-
-
- `; - - return ( - <> - -
-
-
- Create the screens -
your visitors deserve to see
-

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

- -
-
-
- hero-1 -
-
-
- - -
-
- One Product, - Many Solutions -
-
Ac turpis egestas maecenas pharetra convallis posuere morbi leo urna.
-
-
- - - -
Built for Developers
- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -
-
- - - -
End-to-End Encryption
- Risus nec feugiat in fermentum posuere urna nec. Posuere sollicitudin aliquam ultrices sagittis. -
-
- - - -
Easy to Use
- Ornare suspendisse sed nisi lacus sed viverra tellus. Neque volutpat ac tincidunt vitae semper. -
-
- - - -
Fast & Global Support
- Fermentum et sollicitudin ac orci phasellus egestas tellus rutrum tellus. -
-
- - - -
Open Source
- Nec tincidunt praesent semper feugiat. Sed adipiscing diam donec adipiscing tristique risus nec feugiat. -
-
- - - -
Trusted Securitty
- Mattis rhoncus urna neque viverra justo nec ultrices. Id cursus metus aliquam eleifend. -
-
-
-
- - -
-
Pricing Plans
-
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit numquam eligendi quos.
- -
-
-
-
-
Basic
-
Plan description
-
-
- $9 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
-
-
-
-
- -
-
-
-
Premium
-
Plan description
-
-
- $29 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
  • - - Duis ultricies lacus sed -
  • -
-
-
-
-
- -
-
-
-
Enterprise
-
Plan description
-
-
- $49 - per month -
-
-
    -
  • - - Arcu vitae elementum -
  • -
  • - - Dui faucibus in ornare -
  • -
  • - - Morbi tincidunt augue -
  • -
  • - - Duis ultricies lacus sed -
  • -
  • - - Imperdiet proin -
  • -
  • - - Nisi scelerisque -
  • -
-
-
-
-
-
-
-
- - -
-
-  POWERED BY DISCORD -
-
Join Our Design Community
-
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit numquam eligendi quos.
-
-
- - -
-
🔥 Hot Deals!
-
- Libero voluptatum atque exercitationem praesentium provident odit. -
- - Learn More - - - - -
-
- - -
- -
-
-
Customers
-
-
- - 332 Active Users -
-
- - 9402 Sessions -
-
- - 2.32m Avg. Duration -
-
-
-
-
-
-
-
- - -
-
-
-
-
- Orders -
152
-
-
- -
-
- 24 new - since last visit -
-
-
-
-
-
- Revenue -
$2.100
-
-
- -
-
- %52+ - since last week -
-
-
-
-
-
- Customers -
28441
-
-
- -
-
- 520 - newly registered -
-
-
-
-
-
- Comments -
152 Unread
-
-
- -
-
- 85 - responded -
-
-
-
- - -
-
-
- hyper -
Welcome Back
- Do not have an account? - Create today! -
- -
- - - - - - -
-
- setChecked(e.checked as boolean)} checked={checked} className="mr-2" /> - -
- Forgot your password? -
- -
-
-
-
- - -
-
Movie Information
-
Morbi tristique blandit turpis. In viverra ligula id nulla hendrerit rutrum.
-
    -
  • -
    Title
    -
    Heat
    -
    -
    -
  • -
  • -
    Genre
    -
    - - - -
    -
    -
    -
  • -
  • -
    Director
    -
    Michael Mann
    -
    -
    -
  • -
  • -
    Actors
    -
    Robert De Niro, Al Pacino
    -
    -
    -
  • -
  • -
    Plot
    -
    A group of professional bank robbers start to feel the heat from police when they unknowingly leave a clue at their latest heist.
    -
    -
    -
  • -
-
-
- - -
-
Card Title
-
Vivamus id nisl interdum, blandit augue sit amet, eleifend mi.
-
-
-
- - ); -}; - -export default Free; diff --git a/app/(main)/documentation/index.module.css b/app/(main)/documentation/index.module.css deleted file mode 100644 index acaa1030..00000000 --- a/app/(main)/documentation/index.module.css +++ /dev/null @@ -1,16 +0,0 @@ -@media screen and (max-width: 991px) { - .video-container { - position: relative; - width: 100%; - height: 0; - padding-bottom: 56.25%; - } - - .video { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} \ No newline at end of file diff --git a/app/(main)/documentation/page.tsx b/app/(main)/documentation/page.tsx deleted file mode 100644 index b958c674..00000000 --- a/app/(main)/documentation/page.tsx +++ /dev/null @@ -1,241 +0,0 @@ -/* eslint-disable @next/next/no-sync-scripts */ -import React from 'react'; - -const Documentation = () => { - return ( - <> -
-
-
-

Current Version

-

Next v13, React v18, Typescript with PrimeReact v10

- -
Getting Started
-

- Sakai is an application template for React based on the popular{' '} - - Next.js - {' '} - framework with new{' '} - - App Router - - . To get started, clone the{' '} - - repository - {' '} - from GitHub and install the dependencies with npm or yarn. -

-
-                            {`"npm install" or "yarn"`}
-                        
- -

- Next step is running the application using the start script and navigate to http://localhost:3000/ to view the application. That is it, you may now start with the development of your application using the Sakai - template. -

- -
-                            {`"npm run dev" or "yarn dev"`}
-                        
- -
Dependencies
-

Dependencies of Sakai are listed below and needs to be defined at package.json.

- -
-                            {`"primereact": "^9.6.2",                    //required: PrimeReact components
-"primeicons": "^6.0.1",                    //required: Icons
-"primeflex": "^3.3.0",                     //required: Utility CSS classes
-`}
-                        
- -
Structure
-

Sakai consist of a couple of folders where demos and core layout have been separated.

-

- There are two{' '} - - route groups - {' '} - under the app folder; {`(main)`} represents the pages that reside in the main dashboard layout whereas {`(full-page)`}{' '} - groups the pages with full page content such as landing page or a login page. -

-
    -
  • - layout/: Main layout files -
  • -
  • - demo/: Contains demo related utilities and helpers -
  • -
  • - app/: Demo pages -
  • -
  • - public/demo: Assets used in demos -
  • -
  • - public/layout: Assets used in layout such as a logo -
  • -
  • - styles/demo: Styles used in demos only -
  • -
  • - styles/layout: SCSS files of the core layout -
  • -
-
Route Groups
-

- Root Layout is the main of the application and it is defined at app/layout.tsx file. It contains the style imports and layout context provider. -

-
-                            
-                                {`"use client"
-import { LayoutProvider } from "./layout/context/layoutcontext";
-import { PrimeReactProvider } from "primereact/api";
-import "primereact/resources/primereact.css";
-...
-import "../styles/layout/layout.scss";
-import "../styles/demo/Demos.scss";
-
-interface RootLayoutProps {
-  children: React.ReactNode;
-}
-
-export default function RootLayout({ children }: RootLayoutProps) {
-  return (
-    
-      
-        
-      
-      
-        
-            {children}
-        
-      
-    
-  );
-}
-
-`}
-                            
-                        
-

- The pages that are using the layout elements need to be defined under the app/{'(main)'}/ folder. Those pages use the{' '} - app/{'(main)'}/layout.tsx as the root layout. -

-
-                            
-                                {`import { Metadata } from 'next';
-import Layout from "../../layout/layout";
-
-interface MainLayoutProps {
-  children: React.ReactNode;
-}
-
-export const metadata: Metadata = {
-    title: "Sakai by PrimeReact | Free Admin Template for Next.js",
-    ...
-  };
-
-export default function MainLayout({ children }: MainLayoutProps) {
-  return {children};
-}
-`}
-                            
-                        
-

- Only the pages that are using config sidebar wihout layout elements need to be defined under the app/{'(full-page)'}/ folder. Those pages use the{' '} - app/{'(full-page)'}/layout.tsx as the root layout. -

-
-                            
-                                {`import { Metadata } from 'next';
-import AppConfig from "../../layout/AppConfig";
-import React from "react";
-
-interface FullPageLayoutProps {
-  children: React.ReactNode;
-}
-
-export const metadata: Metadata = {
-    title: "Sakai by PrimeReact | Free Admin Template for Next.js",
-    ...
-  };
-
-export default function FullPageLayout({ children }: FullPageLayoutProps) {
-  return (
-    
-      {children}
-      
-    
-  );
-}
-`}
-                            
-                        
-
Default Configuration
-

- Initial layout configuration can be defined at the layout/context/layoutcontext.js file, this step is optional and only necessary when customizing the defaults. -

- -
-                            
-                                {`"use client";
-import React, { useState } from 'react';
-import Head from 'next/head';
-export const LayoutContext = React.createContext();
-
-export const LayoutProvider = (props) => {
-    const [layoutConfig, setLayoutConfig] = useState({
-        ripple: false,                          //toggles ripple on and off
-        inputStyle: 'outlined',                 //default style for input elements
-        menuMode: 'static',                     //layout mode of the menu, valid values are "static" or "overlay"
-        colorScheme: 'light',                   //color scheme of the template, valid values are "light", "dim" and "dark"
-        theme: 'lara-light-indigo',             //default component theme for PrimeReact
-        scale: 14                               //size of the body font size to scale the whole application
-    });
-}`}
-                            
-                        
- -
Menu
-

- Main menu is defined at AppMenu.js file based on{' '} - - MenuModel API - - . -

- -
PrimeReact Theme
-

- Sakai theming is based on the PrimeReact theme being used. -

- -
SASS Variables
-

- In case you'd like to customize the main layout variables, open _variables.scss file under layout folder. Saving the changes will be reflected instantly at your browser. -

- -
layout/_variables.scss
-
-                            
-                                {`
-/* General */
-$scale:14px;                    /* initial font size */ 
-$borderRadius:12px;             /* border radius of layout element e.g. card, sidebar */ 
-$transitionDuration:.2s;        /* transition duration of layout elements e.g. sidebar */ 
-`}
-                            
-                        
-
-
-
- - ); -}; - -export default Documentation; diff --git a/app/(main)/pages/crud/page.tsx b/app/(main)/pages/crud/page.tsx deleted file mode 100644 index 52cf6e5e..00000000 --- a/app/(main)/pages/crud/page.tsx +++ /dev/null @@ -1,430 +0,0 @@ -/* eslint-disable @next/next/no-img-element */ -'use client'; -import { Button } from 'primereact/button'; -import { Column } from 'primereact/column'; -import { DataTable } from 'primereact/datatable'; -import { Dialog } from 'primereact/dialog'; -import { FileUpload } from 'primereact/fileupload'; -import { InputNumber, InputNumberValueChangeEvent } from 'primereact/inputnumber'; -import { InputText } from 'primereact/inputtext'; -import { InputTextarea } from 'primereact/inputtextarea'; -import { RadioButton, RadioButtonChangeEvent } from 'primereact/radiobutton'; -import { Rating } from 'primereact/rating'; -import { Toast } from 'primereact/toast'; -import { Toolbar } from 'primereact/toolbar'; -import { classNames } from 'primereact/utils'; -import React, { useEffect, useRef, useState } from 'react'; -import { ProductService } from '../../../../demo/service/ProductService'; -import { Demo } from '@/types'; - -/* @todo Used 'as any' for types here. Will fix in next version due to onSelectionChange event type issue. */ -const Crud = () => { - let emptyProduct: Demo.Product = { - id: '', - name: '', - image: '', - description: '', - category: '', - price: 0, - quantity: 0, - rating: 0, - inventoryStatus: 'INSTOCK' - }; - - const [products, setProducts] = useState(null); - const [productDialog, setProductDialog] = useState(false); - const [deleteProductDialog, setDeleteProductDialog] = useState(false); - const [deleteProductsDialog, setDeleteProductsDialog] = useState(false); - const [product, setProduct] = useState(emptyProduct); - const [selectedProducts, setSelectedProducts] = useState(null); - const [submitted, setSubmitted] = useState(false); - const [globalFilter, setGlobalFilter] = useState(''); - const toast = useRef(null); - const dt = useRef>(null); - - useEffect(() => { - ProductService.getProducts().then((data) => setProducts(data as any)); - }, []); - - const formatCurrency = (value: number) => { - return value.toLocaleString('en-US', { - style: 'currency', - currency: 'USD' - }); - }; - - const openNew = () => { - setProduct(emptyProduct); - setSubmitted(false); - setProductDialog(true); - }; - - const hideDialog = () => { - setSubmitted(false); - setProductDialog(false); - }; - - const hideDeleteProductDialog = () => { - setDeleteProductDialog(false); - }; - - const hideDeleteProductsDialog = () => { - setDeleteProductsDialog(false); - }; - - const saveProduct = () => { - setSubmitted(true); - - if (product.name.trim()) { - let _products = [...(products as any)]; - let _product = { ...product }; - if (product.id) { - const index = findIndexById(product.id); - - _products[index] = _product; - toast.current?.show({ - severity: 'success', - summary: 'Successful', - detail: 'Product Updated', - life: 3000 - }); - } else { - _product.id = createId(); - _product.image = 'product-placeholder.svg'; - _products.push(_product); - toast.current?.show({ - severity: 'success', - summary: 'Successful', - detail: 'Product Created', - life: 3000 - }); - } - - setProducts(_products as any); - setProductDialog(false); - setProduct(emptyProduct); - } - }; - - const editProduct = (product: Demo.Product) => { - setProduct({ ...product }); - setProductDialog(true); - }; - - const confirmDeleteProduct = (product: Demo.Product) => { - setProduct(product); - setDeleteProductDialog(true); - }; - - const deleteProduct = () => { - let _products = (products as any)?.filter((val: any) => val.id !== product.id); - setProducts(_products); - setDeleteProductDialog(false); - setProduct(emptyProduct); - toast.current?.show({ - severity: 'success', - summary: 'Successful', - detail: 'Product Deleted', - life: 3000 - }); - }; - - const findIndexById = (id: string) => { - let index = -1; - for (let i = 0; i < (products as any)?.length; i++) { - if ((products as any)[i].id === id) { - index = i; - break; - } - } - - return index; - }; - - const createId = () => { - let id = ''; - let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < 5; i++) { - id += chars.charAt(Math.floor(Math.random() * chars.length)); - } - return id; - }; - - const exportCSV = () => { - dt.current?.exportCSV(); - }; - - const confirmDeleteSelected = () => { - setDeleteProductsDialog(true); - }; - - const deleteSelectedProducts = () => { - let _products = (products as any)?.filter((val: any) => !(selectedProducts as any)?.includes(val)); - setProducts(_products); - setDeleteProductsDialog(false); - setSelectedProducts(null); - toast.current?.show({ - severity: 'success', - summary: 'Successful', - detail: 'Products Deleted', - life: 3000 - }); - }; - - const onCategoryChange = (e: RadioButtonChangeEvent) => { - let _product = { ...product }; - _product['category'] = e.value; - setProduct(_product); - }; - - const onInputChange = (e: React.ChangeEvent, name: string) => { - const val = (e.target && e.target.value) || ''; - let _product = { ...product }; - _product[`${name}`] = val; - - setProduct(_product); - }; - - const onInputNumberChange = (e: InputNumberValueChangeEvent, name: string) => { - const val = e.value || 0; - let _product = { ...product }; - _product[`${name}`] = val; - - setProduct(_product); - }; - - const leftToolbarTemplate = () => { - return ( - -
-
-
- ); - }; - - const rightToolbarTemplate = () => { - return ( - - - - - ); - }; - - const customizedMarker = (item: CustomEvent) => { - return ( - - - - ); - }; - - return ( -
-
-
-
-
Left Align
- item.status} /> -
-
-
-
-
Right Align
- item.status} /> -
-
-
-
-
Alternate Align
- item.status} /> -
-
- -
-
-
Opposite Content
- item.status} content={(item) => {item.date}} /> -
-
- -
-
-
Customized
- -
-
-
-
-
Horizontal
-
Top Align
- item} /> - -
Bottom Align
- item} /> - -
Alternate Align
- item} opposite={ } /> -
-
-
-
- ); -}; - -export default TimelineDemo; diff --git a/app/(main)/teacher/page.tsx b/app/(main)/teacher/page.tsx deleted file mode 100644 index a06710d5..00000000 --- a/app/(main)/teacher/page.tsx +++ /dev/null @@ -1,393 +0,0 @@ -/* eslint-disable @next/next/no-img-element */ -'use client'; -import { Button } from 'primereact/button'; -import { Chart } from 'primereact/chart'; -import { Column } from 'primereact/column'; -import { DataTable } from 'primereact/datatable'; -import { Menu } from 'primereact/menu'; -import React, { useContext, useEffect, useRef, useState } from 'react'; -import { ProductService } from '../../../demo/service/ProductService'; -import { LayoutContext } from '../../../layout/context/layoutcontext'; -import Link from 'next/link'; -import { Demo } from '@/types'; -import { ChartData, ChartOptions } from 'chart.js'; - -const lineData: ChartData = { - labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], - datasets: [ - { - label: 'First Dataset', - data: [65, 59, 80, 81, 56, 55, 40], - fill: false, - backgroundColor: '#2f4860', - borderColor: '#2f4860', - tension: 0.4 - }, - { - label: 'Second Dataset', - data: [28, 48, 40, 19, 86, 27, 90], - fill: false, - backgroundColor: '#00bb7e', - borderColor: '#00bb7e', - tension: 0.4 - } - ] -}; - -const Dashboard = () => { - const [products, setProducts] = useState([]); - const menu1 = useRef(null); - const menu2 = useRef(null); - const [lineOptions, setLineOptions] = useState({}); - const { layoutConfig } = useContext(LayoutContext); - - const applyLightTheme = () => { - const lineOptions: ChartOptions = { - plugins: { - legend: { - labels: { - color: '#495057' - } - } - }, - scales: { - x: { - ticks: { - color: '#495057' - }, - grid: { - color: '#ebedef' - } - }, - y: { - ticks: { - color: '#495057' - }, - grid: { - color: '#ebedef' - } - } - } - }; - - setLineOptions(lineOptions); - }; - - const applyDarkTheme = () => { - const lineOptions = { - plugins: { - legend: { - labels: { - color: '#ebedef' - } - } - }, - scales: { - x: { - ticks: { - color: '#ebedef' - }, - grid: { - color: 'rgba(160, 167, 181, .3)' - } - }, - y: { - ticks: { - color: '#ebedef' - }, - grid: { - color: 'rgba(160, 167, 181, .3)' - } - } - } - }; - - setLineOptions(lineOptions); - }; - - useEffect(() => { - ProductService.getProductsSmall().then((data) => setProducts(data)); - }, []); - - useEffect(() => { - if (layoutConfig.colorScheme === 'light') { - applyLightTheme(); - } else { - applyDarkTheme(); - } - }, [layoutConfig.colorScheme]); - - const formatCurrency = (value: number) => { - return value?.toLocaleString('en-US', { - style: 'currency', - currency: 'USD' - }); - }; - - return ( -
-
-
-
-
- Orders -
152
-
-
- -
-
- 24 new - since last visit -
-
-
-
-
-
- Revenue -
$2.100
-
-
- -
-
- %52+ - since last week -
-
-
-
-
-
- Customers -
28441
-
-
- -
-
- 520 - newly registered -
-
-
-
-
-
- Comments -
152 Unread
-
-
- -
-
- 85 - responded -
-
- -
-
-
Recent Sales
- - {data.image}} /> - - formatCurrency(data.price)} /> - ( - <> -
-
-
-
Best Selling Products
-
-
-
-
    -
  • -
    - Space T-Shirt -
    Clothing
    -
    -
    -
    -
    -
    - %50 -
    -
  • -
  • -
    - Portal Sticker -
    Accessories
    -
    -
    -
    -
    -
    - %16 -
    -
  • -
  • -
    - Supernova Sticker -
    Accessories
    -
    -
    -
    -
    -
    - %67 -
    -
  • -
  • -
    - Wonders Notebook -
    Office
    -
    -
    -
    -
    -
    - %35 -
    -
  • -
  • -
    - Mat Black Case -
    Accessories
    -
    -
    -
    -
    -
    - %75 -
    -
  • -
  • -
    - Robots T-Shirt -
    Clothing
    -
    -
    -
    -
    -
    - %40 -
    -
  • -
-
-
- -
-
-
Sales Overview
- -
- -
-
-
Notifications
-
-
-
- - TODAY -
    -
  • -
    - -
    - - Richard Jones - - {' '} - has purchased a blue t-shirt for 79$ - - -
  • -
  • -
    - -
    - - Your request for withdrawal of 2500$ has been initiated. - -
  • -
- - YESTERDAY -
    -
  • -
    - -
    - - Keyser Wick - - {' '} - has purchased a black jacket for 59$ - - -
  • -
  • -
    - -
    - - Jane Davis - has posted a new questions about your product. - -
  • -
-
-
-
-
TAKE THE NEXT STEP
-
Try PrimeBlocks
-
-
- - Get Started - -
-
-
-
- ); -}; - -export default Dashboard; diff --git a/app/(main)/uikit/button/index.module.scss b/app/(main)/uikit/button/index.module.scss deleted file mode 100644 index 2ee14829..00000000 --- a/app/(main)/uikit/button/index.module.scss +++ /dev/null @@ -1,151 +0,0 @@ -.p-button{ - padding: 0%; -&.google { - background: linear-gradient(to left, var(--purple-600) 50%, var(--purple-700) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - border-color: var(--purple-700); - display: flex; - align-items: stretch; - padding: 0; - - - &:enabled:hover { - background: linear-gradient(to left, var(--purple-600) 50%, var(--purple-700) 50%); - background-size: 200% 100%; - background-position: left bottom; - border-color: var(--purple-700); - } - - &:focus { - box-shadow: 0 0 0 1px var(--purple-400); - } -} - -&.twitter { - background: linear-gradient(to left, var(--blue-400) 50%, var(--blue-500) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - border-color: var(--blue-500); - padding: 0; - display: flex; - align-items: stretch; - - &:enabled:hover { - background: linear-gradient(to left, var(--blue-400) 50%, var(--blue-500) 50%); - background-size: 200% 100%; - background-position: left bottom; - border-color: var(--blue-500); - } - - &:focus { - box-shadow: 0 0 0 1px var(--blue-200); - } -} - -&.discord { - background: linear-gradient(to left, var(--bluegray-700) 50%, var(--bluegray-800) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - border-color: var(--bluegray-800); - padding: 0; - display: flex; - align-items: stretch; - - &:enabled:hover { - background: linear-gradient(to left, var(--bluegray-700) 50%, var(--bluegray-800) 50%); - background-size: 200% 100%; - background-position: left bottom; - border-color: var(--bluegray-800); - } - - &:focus { - box-shadow: 0 0 0 1px var(--purple-500); - } -} - -.template-button .p-button.twitter { - background: linear-gradient(to left, var(--blue-400) 50%, var(--blue-500) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - color: #fff; - border-color: var(--blue-500); -} -.template-button .p-button.twitter:hover { - background-position: left bottom; -} -.template-button .p-button.twitter i { - background-color: var(--blue-500); -} -.template-button .p-button.twitter:focus { - box-shadow: 0 0 0 1px var(--blue-200); -} -.template-button .p-button.slack { - background: linear-gradient(to left, var(--orange-400) 50%, var(--orange-500) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - color: #fff; - border-color: var(--orange-500); -} -.template-button .p-button.slack:hover { - background-position: left bottom; -} -.template-button .p-button.slack i { - background-color: var(--orange-500); -} -.template-button .p-button.slack:focus { - box-shadow: 0 0 0 1px var(--orange-200); -} -.template-button .p-button.amazon { - background: linear-gradient(to left, var(--yellow-400) 50%, var(--yellow-500) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - color: #000; - border-color: var(--yellow-500); -} -.template-button .p-button.amazon:hover { - background-position: left bottom; -} -.template-button .p-button.amazon i { - background-color: var(--yellow-500); -} -.template-button .p-button.amazon:focus { - box-shadow: 0 0 0 1px var(--yellow-200); -} -.template-button .p-button.discord { - background: linear-gradient(to left, var(--bluegray-700) 50%, var(--bluegray-800) 50%); - background-size: 200% 100%; - background-position: right bottom; - transition: background-position 0.5s ease-out; - color: #fff; - border-color: var(--bluegray-800); -} -.template-button .p-button.discord:hover { - background-position: left bottom; -} -.template-button .p-button.discord i { - background-color: var(--bluegray-800); -} -.template-button .p-button.discord:focus { - box-shadow: 0 0 0 1px var(--bluegray-500); -} -@media screen and (max-width: 960px) { - -button .p-button { - margin-bottom: 0.5rem; - } - -button .p-button:not(.p-button-icon-only) { - display: flex; - flex-wrap: wrap; - - } - -button .p-buttonset .p-button { - margin-bottom: 0; - } -} -} \ No newline at end of file diff --git a/app/(main)/uikit/button/page.tsx b/app/(main)/uikit/button/page.tsx deleted file mode 100644 index 69196ed2..00000000 --- a/app/(main)/uikit/button/page.tsx +++ /dev/null @@ -1,248 +0,0 @@ -'use client'; -import React, { useState } from 'react'; -import { SplitButton } from 'primereact/splitbutton'; -import { Button } from 'primereact/button'; -import styles from './index.module.scss'; -import { classNames } from 'primereact/utils'; - -const ButtonDemo = () => { - const [loading1, setLoading1] = useState(false); - const [loading2, setLoading2] = useState(false); - const [loading3, setLoading3] = useState(false); - const [loading4, setLoading4] = useState(false); - - const onLoadingClick1 = () => { - setLoading1(true); - - setTimeout(() => { - setLoading1(false); - }, 2000); - }; - - const onLoadingClick2 = () => { - setLoading2(true); - - setTimeout(() => { - setLoading2(false); - }, 2000); - }; - - const onLoadingClick3 = () => { - setLoading3(true); - - setTimeout(() => { - setLoading3(false); - }, 2000); - }; - - const onLoadingClick4 = () => { - setLoading4(true); - - setTimeout(() => { - setLoading4(false); - }, 2000); - }; - - const items = [ - { - label: 'Update', - icon: 'pi pi-refresh' - }, - { - label: 'Delete', - icon: 'pi pi-times' - }, - { - label: 'Home', - icon: 'pi pi-home' - } - ]; - - return ( -
-
-
-
Default
-
- - - -
-
- -
-
Severities
-
-
-
- -
-
Text
-
-
-
- -
-
Outlined
-
-
-
- -
-
Button Group
- -
- -
-
SplitButton
-
- - - - - -
-
- -
-
Template
-
- - - -
-
-
- -
-
-
Icons
-
- - - -
-
- -
-
Raised
-
-
-
- -
-
Rounded
-
-
-
- -
-
Rounded Icons
-
-
-
- -
-
Rounded Text
-
-
-
- -
-
Rounded Outlined
-
-
-
- -
-
Loading
-
-
-
-
-
- ); -}; - -export default ButtonDemo; diff --git a/app/(main)/uikit/charts/page.tsx b/app/(main)/uikit/charts/page.tsx deleted file mode 100644 index 7ccc85af..00000000 --- a/app/(main)/uikit/charts/page.tsx +++ /dev/null @@ -1,283 +0,0 @@ -'use client'; -import { ChartData, ChartOptions } from 'chart.js'; -import { Chart } from 'primereact/chart'; -import React, { useContext, useEffect, useState } from 'react'; -import { LayoutContext } from '../../../../layout/context/layoutcontext'; -import type { ChartDataState, ChartOptionsState } from '@/types'; - -const ChartDemo = () => { - const [options, setOptions] = useState({}); - const [data, setChartData] = useState({}); - const { layoutConfig } = useContext(LayoutContext); - - useEffect(() => { - const documentStyle = getComputedStyle(document.documentElement); - const textColor = documentStyle.getPropertyValue('--text-color') || '#495057'; - const textColorSecondary = documentStyle.getPropertyValue('--text-color-secondary') || '#6c757d'; - const surfaceBorder = documentStyle.getPropertyValue('--surface-border') || '#dfe7ef'; - const barData: ChartData = { - labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], - datasets: [ - { - label: 'My First dataset', - backgroundColor: documentStyle.getPropertyValue('--primary-500') || '#6366f1', - borderColor: documentStyle.getPropertyValue('--primary-500') || '#6366f1', - data: [65, 59, 80, 81, 56, 55, 40] - }, - { - label: 'My Second dataset', - backgroundColor: documentStyle.getPropertyValue('--primary-200') || '#bcbdf9', - borderColor: documentStyle.getPropertyValue('--primary-200') || '#bcbdf9', - data: [28, 48, 40, 19, 86, 27, 90] - } - ] - }; - - const barOptions: ChartOptions = { - plugins: { - legend: { - labels: { - color: textColor - } - } - }, - scales: { - x: { - ticks: { - color: textColorSecondary, - font: { - weight: '500' - } - }, - grid: { - display: false - }, - border: { - display: false - } - }, - y: { - ticks: { - color: textColorSecondary - }, - grid: { - color: surfaceBorder - }, - border: { - display: false - } - } - } - }; - - const pieData: ChartData = { - labels: ['A', 'B', 'C'], - datasets: [ - { - data: [540, 325, 702], - backgroundColor: [documentStyle.getPropertyValue('--indigo-500') || '#6366f1', documentStyle.getPropertyValue('--purple-500') || '#a855f7', documentStyle.getPropertyValue('--teal-500') || '#14b8a6'], - hoverBackgroundColor: [documentStyle.getPropertyValue('--indigo-400') || '#8183f4', documentStyle.getPropertyValue('--purple-400') || '#b975f9', documentStyle.getPropertyValue('--teal-400') || '#41c5b7'] - } - ] - }; - - const pieOptions: ChartOptions = { - plugins: { - legend: { - labels: { - usePointStyle: true, - color: textColor - } - } - } - }; - - const lineData: ChartData = { - labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July'], - datasets: [ - { - label: 'First Dataset', - data: [65, 59, 80, 81, 56, 55, 40], - fill: false, - backgroundColor: documentStyle.getPropertyValue('--primary-500') || '#6366f1', - borderColor: documentStyle.getPropertyValue('--primary-500') || '#6366f1', - tension: 0.4 - }, - { - label: 'Second Dataset', - data: [28, 48, 40, 19, 86, 27, 90], - fill: false, - backgroundColor: documentStyle.getPropertyValue('--primary-200') || '#bcbdf9', - borderColor: documentStyle.getPropertyValue('--primary-200') || '#bcbdf9', - tension: 0.4 - } - ] - }; - - const lineOptions: ChartOptions = { - plugins: { - legend: { - labels: { - color: textColor - } - } - }, - scales: { - x: { - ticks: { - color: textColorSecondary - }, - grid: { - color: surfaceBorder - }, - border: { - display: false - } - }, - y: { - ticks: { - color: textColorSecondary - }, - grid: { - color: surfaceBorder - }, - border: { - display: false - } - } - } - }; - - const polarData: ChartData = { - datasets: [ - { - data: [11, 16, 7, 3], - backgroundColor: [ - documentStyle.getPropertyValue('--indigo-500') || '#6366f1', - documentStyle.getPropertyValue('--purple-500') || '#a855f7', - documentStyle.getPropertyValue('--teal-500') || '#14b8a6', - documentStyle.getPropertyValue('--orange-500') || '#f97316' - ], - label: 'My dataset' - } - ], - labels: ['Indigo', 'Purple', 'Teal', 'Orange'] - }; - - const polarOptions: ChartOptions = { - plugins: { - legend: { - labels: { - color: textColor - } - } - }, - scales: { - r: { - grid: { - color: surfaceBorder - } - } - } - }; - - const radarData: ChartData = { - labels: ['Eating', 'Drinking', 'Sleeping', 'Designing', 'Coding', 'Cycling', 'Running'], - datasets: [ - { - label: 'My First dataset', - borderColor: documentStyle.getPropertyValue('--indigo-400') || '#8183f4', - pointBackgroundColor: documentStyle.getPropertyValue('--indigo-400') || '#8183f4', - pointBorderColor: documentStyle.getPropertyValue('--indigo-400') || '#8183f4', - pointHoverBackgroundColor: textColor, - pointHoverBorderColor: documentStyle.getPropertyValue('--indigo-400') || '#8183f4', - data: [65, 59, 90, 81, 56, 55, 40] - }, - { - label: 'My Second dataset', - borderColor: documentStyle.getPropertyValue('--purple-400') || '#b975f9', - pointBackgroundColor: documentStyle.getPropertyValue('--purple-400') || '#b975f9', - pointBorderColor: documentStyle.getPropertyValue('--purple-400') || '#b975f9', - pointHoverBackgroundColor: textColor, - pointHoverBorderColor: documentStyle.getPropertyValue('--purple-400') || '#b975f9', - data: [28, 48, 40, 19, 96, 27, 100] - } - ] - }; - - const radarOptions: ChartOptions = { - plugins: { - legend: { - labels: { - color: textColor - } - } - }, - scales: { - r: { - grid: { - color: textColorSecondary - } - } - } - }; - - setOptions({ - barOptions, - pieOptions, - lineOptions, - polarOptions, - radarOptions - }); - setChartData({ - barData, - pieData, - lineData, - polarData, - radarData - }); - }, [layoutConfig]); - - return ( -
-
-
-
Linear Chart
- -
-
-
-
-
Bar Chart
- -
-
-
-
-
Pie Chart
- -
-
-
-
-
Doughnut Chart
- -
-
-
-
-
Polar Area Chart
- -
-
-
-
-
Radar Chart
- -
-
-
- ); -}; - -export default ChartDemo; diff --git a/app/(main)/uikit/file/page.tsx b/app/(main)/uikit/file/page.tsx deleted file mode 100644 index 9dd41f9b..00000000 --- a/app/(main)/uikit/file/page.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; - -import React, { useRef } from 'react'; -import { FileUpload } from 'primereact/fileupload'; -import { Toast } from 'primereact/toast'; - -const FileDemo = () => { - const toast = useRef(null); - - const onUpload = () => { - toast.current?.show({ - severity: 'info', - summary: 'Success', - detail: 'File Uploaded', - life: 3000 - }); - }; - - return ( -
- -
-
-
Advanced
- - -
Basic
- -
-
-
- ); -}; - -export default FileDemo; diff --git a/app/(main)/uikit/floatlabel/page.tsx b/app/(main)/uikit/floatlabel/page.tsx deleted file mode 100644 index 1dec3af6..00000000 --- a/app/(main)/uikit/floatlabel/page.tsx +++ /dev/null @@ -1,215 +0,0 @@ -"use client"; -import type { Demo } from "@/types"; -import { - AutoComplete, - AutoCompleteCompleteEvent, -} from "primereact/autocomplete"; -import { Calendar } from "primereact/calendar"; -import { Chips } from "primereact/chips"; -import { Dropdown } from "primereact/dropdown"; -import { InputMask } from "primereact/inputmask"; -import { InputNumber } from "primereact/inputnumber"; -import { InputText } from "primereact/inputtext"; -import { InputTextarea } from "primereact/inputtextarea"; -import { MultiSelect } from "primereact/multiselect"; -import { useEffect, useState } from "react"; -import { CountryService } from "../../../../demo/service/CountryService"; - -const FloatLabelDemo = () => { - const [countries, setCountries] = useState([]); - const [filteredCountries, setFilteredCountries] = useState( - [] - ); - const [value1, setValue1] = useState(""); - const [value2, setValue2] = useState(null); - const [value3, setValue3] = useState(""); - const [value4, setValue4] = useState(""); - const [value5, setValue5] = useState(null); - const [value6, setValue6] = useState([]); - const [value7, setValue7] = useState(""); - const [value8, setValue8] = useState(null); - const [value9, setValue9] = useState(""); - const [value10, setValue10] = useState(null); - const [value11, setValue11] = useState(null); - const [value12, setValue12] = useState(""); - - const cities = [ - { name: "New York", code: "NY" }, - { name: "Rome", code: "RM" }, - { name: "London", code: "LDN" }, - { name: "Istanbul", code: "IST" }, - { name: "Paris", code: "PRS" }, - ]; - - useEffect(() => { - CountryService.getCountries().then((countries) => { - setCountries(countries); - }); - }, []); - - const searchCountry = (event: AutoCompleteCompleteEvent) => { - const filtered = []; - const query = event.query; - for (let i = 0; i < countries.length; i++) { - const country = countries[i]; - if (country.name.toLowerCase().indexOf(query.toLowerCase()) === 0) { - filtered.push(country); - } - } - setFilteredCountries(filtered); - }; - - return ( -
-
Float Label
-

- All input text components support floating labels by adding ( - .p-float-label) to wrapper class. -

-
-
- - setValue1(e.target.value)} - /> - - -
-
- - setValue2(e.value)} - // suggestions={filteredCountries} - completeMethod={searchCountry} - field="name" - > - - -
-
- - - setValue3(e.target.value)} - /> - - -
-
- - - setValue4(e.target.value)} - /> - - -
-
- - setValue5(e.value ?? "")} - > - - -
-
- - setValue6(e.value ?? [])} - > - - -
-
- - setValue7(e.value ?? "")} - > - - -
-
- - - setValue8(e.target.value ?? null) - } - > - - -
-
-
- - - - - setValue9(e.target.value)} - /> - - -
-
-
- - setValue10(e.value)} - optionLabel="name" - > - - -
-
- - setValue11(e.value)} - optionLabel="name" - > - - -
-
- - setValue12(e.target.value)} - > - - -
-
-
- ); -}; - -export default FloatLabelDemo; diff --git a/app/(main)/uikit/formlayout/page.tsx b/app/(main)/uikit/formlayout/page.tsx deleted file mode 100644 index 01e98052..00000000 --- a/app/(main)/uikit/formlayout/page.tsx +++ /dev/null @@ -1,148 +0,0 @@ -'use client'; - -import React, { useState, useEffect, useMemo } from 'react'; -import { InputText } from 'primereact/inputtext'; -import { Button } from 'primereact/button'; -import { InputTextarea } from 'primereact/inputtextarea'; -import { Dropdown } from 'primereact/dropdown'; - -interface DropdownItem { - name: string; - code: string; -} - -const FormLayoutDemo = () => { - const [dropdownItem, setDropdownItem] = useState(null); - const dropdownItems: DropdownItem[] = useMemo( - () => [ - { name: 'Option 1', code: 'Option 1' }, - { name: 'Option 2', code: 'Option 2' }, - { name: 'Option 3', code: 'Option 3' } - ], - [] - ); - - useEffect(() => { - setDropdownItem(dropdownItems[0]); - }, [dropdownItems]); - - return ( -
-
-
-
Vertical
-
- - -
-
- - -
-
- - -
-
- -
-
Vertical Grid
-
-
- - -
-
- - -
-
-
-
- -
-
-
Horizontal
-
- -
- -
-
-
- -
- -
-
-
- -
-
Inline
-
-
- - -
-
- - -
- -
-
- -
-
Help Text
-
- - - Enter your username to reset your password. -
-
-
- -
-
-
Advanced
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - setDropdownItem(e.value)} options={dropdownItems} optionLabel="name" placeholder="Select One"> -
-
- - -
-
-
-
-
- ); -}; - -export default FormLayoutDemo; diff --git a/app/(main)/uikit/input/page.tsx b/app/(main)/uikit/input/page.tsx deleted file mode 100644 index dd0c4688..00000000 --- a/app/(main)/uikit/input/page.tsx +++ /dev/null @@ -1,522 +0,0 @@ -"use client"; -import type { Demo, Page } from "@/types"; -import { - AutoComplete, - AutoCompleteCompleteEvent, -} from "primereact/autocomplete"; -import { Button } from "primereact/button"; -import { Calendar } from "primereact/calendar"; -import { Checkbox, CheckboxChangeEvent } from "primereact/checkbox"; -import { Chips } from "primereact/chips"; -import { - ColorPicker, - ColorPickerHSBType, - ColorPickerRGBType, -} from "primereact/colorpicker"; -import { Dropdown } from "primereact/dropdown"; -import { InputNumber } from "primereact/inputnumber"; -import { InputSwitch } from "primereact/inputswitch"; -import { InputText } from "primereact/inputtext"; -import { InputTextarea } from "primereact/inputtextarea"; -import { Knob } from "primereact/knob"; -import { ListBox } from "primereact/listbox"; -import { MultiSelect } from "primereact/multiselect"; -import { RadioButton } from "primereact/radiobutton"; -import { Rating } from "primereact/rating"; -import { SelectButton } from "primereact/selectbutton"; -import { Slider } from "primereact/slider"; -import { ToggleButton } from "primereact/togglebutton"; -import { useEffect, useState } from "react"; -import { CountryService } from "../../../../demo/service/CountryService"; - -interface InputValue { - name: string; - code: string; -} - -const InputDemo: Page = () => { - const [floatValue, setFloatValue] = useState(""); - const [autoValue, setAutoValue] = useState([]); - const [selectedAutoValue, setSelectedAutoValue] = useState(null); - const [autoFilteredValue, setAutoFilteredValue] = useState( - [] - ); - const [calendarValue, setCalendarValue] = useState(null); - const [inputNumberValue, setInputNumberValue] = useState( - null - ); - const [chipsValue, setChipsValue] = useState([]); - const [sliderValue, setSliderValue] = useState(""); - const [ratingValue, setRatingValue] = useState(null); - const [colorValue, setColorValue] = useState< - string | ColorPickerRGBType | ColorPickerHSBType - >("1976D2"); - const [knobValue, setKnobValue] = useState(20); - const [radioValue, setRadioValue] = useState(null); - const [checkboxValue, setCheckboxValue] = useState([]); - const [switchValue, setSwitchValue] = useState(false); - const [listboxValue, setListboxValue] = useState(null); - const [dropdownValue, setDropdownValue] = useState(null); - const [multiselectValue, setMultiselectValue] = useState(null); - const [toggleValue, setToggleValue] = useState(false); - const [selectButtonValue1, setSelectButtonValue1] = useState(null); - const [selectButtonValue2, setSelectButtonValue2] = useState(null); - const [inputGroupValue, setInputGroupValue] = useState(false); - - const listboxValues: InputValue[] = [ - { name: "New York", code: "NY" }, - { name: "Rome", code: "RM" }, - { name: "London", code: "LDN" }, - { name: "Istanbul", code: "IST" }, - { name: "Paris", code: "PRS" }, - ]; - - const dropdownValues: InputValue[] = [ - { name: "New York", code: "NY" }, - { name: "Rome", code: "RM" }, - { name: "London", code: "LDN" }, - { name: "Istanbul", code: "IST" }, - { name: "Paris", code: "PRS" }, - ]; - - const multiselectValues: InputValue[] = [ - { name: "Australia", code: "AU" }, - { name: "Brazil", code: "BR" }, - { name: "China", code: "CN" }, - { name: "Egypt", code: "EG" }, - { name: "France", code: "FR" }, - { name: "Germany", code: "DE" }, - { name: "India", code: "IN" }, - { name: "Japan", code: "JP" }, - { name: "Spain", code: "ES" }, - { name: "United States", code: "US" }, - ]; - - const selectButtonValues1: InputValue[] = [ - { name: "Option 1", code: "O1" }, - { name: "Option 2", code: "O2" }, - { name: "Option 3", code: "O3" }, - ]; - - const selectButtonValues2: InputValue[] = [ - { name: "Option 1", code: "O1" }, - { name: "Option 2", code: "O2" }, - { name: "Option 3", code: "O3" }, - ]; - - useEffect(() => { - CountryService.getCountries().then((data) => setAutoValue(data)); - }, []); - - const searchCountry = (event: AutoCompleteCompleteEvent) => { - setTimeout(() => { - if (!event.query.trim().length) { - setAutoFilteredValue([...autoValue]); - } else { - setAutoFilteredValue( - autoValue.filter((country) => { - return country.name - .toLowerCase() - .startsWith(event.query.toLowerCase()); - }) - ); - } - }, 250); - }; - - const onCheckboxChange = (e: CheckboxChangeEvent) => { - let selectedValue = [...checkboxValue]; - if (e.checked) selectedValue.push(e.value); - else selectedValue.splice(selectedValue.indexOf(e.value), 1); - - setCheckboxValue(selectedValue); - }; - - const itemTemplate = (option: InputValue) => { - return ( -
- {option.name} - (e.currentTarget.src = - "https://www.primefaces.org/wp-content/uploads/2020/05/placeholder.png") - } - className={`flag flag-${option.code.toLowerCase()}`} - style={{ width: "21px" }} - /> - {option.name} -
- ); - }; - - return ( -
-
-
-
InputText
-
-
- -
-
- -
-
- -
-
- -
Icons
-
-
- - - - -
-
- - - - -
-
- - - - - -
-
- -
Float Label
- - setFloatValue(e.target.value)} - /> - - - -
Textarea
- - - {/*
AutoComplete
- setSelectedAutoValue(e.value)} - suggestions={autoFilteredValue} - completeMethod={searchCountry} - field="name" - /> */} - -
Calendar
- setCalendarValue(e.value ?? null)} - /> - -
InputNumber
- - setInputNumberValue(e.value ?? null) - } - showButtons - mode="decimal" - > - -
Chips
- setChipsValue(e.value ?? [])} - /> -
- -
-
-
-
Slider
- - setSliderValue(parseInt(e.target.value, 10)) - } - /> - - setSliderValue(e.value as number) - } - /> -
-
-
Rating
- setRatingValue(e.value ?? 0)} - /> -
-
-
ColorPicker
- setColorValue(e.value ?? "")} - style={{ width: "2rem" }} - /> -
-
-
Knob
- setKnobValue(e.value)} - step={10} - min={-50} - max={50} - /> -
-
-
-
- -
-
-
RadioButton
-
-
-
- setRadioValue(e.value)} - /> - -
-
-
-
- setRadioValue(e.value)} - /> - -
-
-
-
- setRadioValue(e.value)} - /> - -
-
-
- -
Checkbox
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- -
Input Switch
- setSwitchValue(e.value ?? false)} - /> -
- -
-
Listbox
- setListboxValue(e.value)} - options={listboxValues} - optionLabel="name" - filter - /> - -
Dropdown
- setDropdownValue(e.value)} - options={dropdownValues} - optionLabel="name" - placeholder="Select" - /> - -
MultiSelect
- setMultiselectValue(e.value)} - options={multiselectValues} - itemTemplate={itemTemplate} - optionLabel="name" - placeholder="Select Countries" - filter - className="multiselect-custom" - display="chip" - /> -
- -
-
ToggleButton
- setToggleValue(e.value)} - onLabel="Yes" - offLabel="No" - /> - -
SelectButton
- setSelectButtonValue1(e.value)} - options={selectButtonValues1} - optionLabel="name" - /> - -
SelectButton - Multiple
- setSelectButtonValue2(e.value)} - options={selectButtonValues2} - optionLabel="name" - multiple - /> -
-
- -
-
-
Input Groups
-
-
-
- - - - -
-
- -
-
- - - - - - - - $ - .00 -
-
- -
-
-
-
- -
-
- - - setInputGroupValue( - e.checked ?? false - ) - } - /> - - -
-
-
-
-
-
- ); -}; - -export default InputDemo; diff --git a/app/(main)/uikit/invalidstate/page.tsx b/app/(main)/uikit/invalidstate/page.tsx deleted file mode 100644 index 43ca3188..00000000 --- a/app/(main)/uikit/invalidstate/page.tsx +++ /dev/null @@ -1,186 +0,0 @@ -"use client"; - -import type { Demo } from "@/types"; -import { - AutoComplete, - AutoCompleteCompleteEvent, -} from "primereact/autocomplete"; -import { Calendar } from "primereact/calendar"; -import { Chips } from "primereact/chips"; -import { Dropdown } from "primereact/dropdown"; -import { InputMask } from "primereact/inputmask"; -import { InputNumber } from "primereact/inputnumber"; -import { InputText } from "primereact/inputtext"; -import { InputTextarea } from "primereact/inputtextarea"; -import { MultiSelect } from "primereact/multiselect"; -import { Password } from "primereact/password"; -import { useEffect, useState } from "react"; -import { CountryService } from "../../../../demo/service/CountryService"; - -const InvalidStateDemo = () => { - const [countries, setCountries] = useState([]); - const [filteredCountries, setFilteredCountries] = useState( - [] - ); - const [value1, setValue1] = useState(""); - const [value2, setValue2] = useState(null); - const [value3, setValue3] = useState(null); - const [value4, setValue4] = useState([]); - const [value5, setValue5] = useState(""); - const [value6, setValue6] = useState(""); - const [value7, setValue7] = useState(0); - const [value8, setValue8] = useState(null); - const [value9, setValue9] = useState(null); - const [value10, setValue10] = useState(""); - - const cities = [ - { name: "New York", code: "NY" }, - { name: "Rome", code: "RM" }, - { name: "London", code: "LDN" }, - { name: "Istanbul", code: "IST" }, - { name: "Paris", code: "PRS" }, - ]; - - useEffect(() => { - CountryService.getCountries().then((countries) => { - setCountries(countries); - }); - }, []); - - const searchCountry = (event: AutoCompleteCompleteEvent) => { - // in a real application, make a request to a remote url with the query and - // return filtered results, for demo we filter at client side - const filtered = []; - const query = event.query; - for (let i = 0; i < countries.length; i++) { - const country = countries[i]; - if (country.name.toLowerCase().indexOf(query.toLowerCase()) === 0) { - filtered.push(country); - } - } - setFilteredCountries(filtered); - }; - - const onCalendarChange = (e: any) => { - setValue3(e.value!); - }; - - return ( -
-
Invalid State
-
-
-
- - setValue1(e.target.value)} - className="p-invalid" - /> -
-
- - setValue2(e.value)} - // suggestions={filteredCountries} - completeMethod={searchCountry} - field="name" - className="p-invalid" - /> -
-
- - -
-
- - setValue4(e.value ?? [])} - className="p-invalid" - /> -
-
- - setValue5(e.target.value)} - className="p-invalid" - /> -
-
- -
-
- - setValue6(e.value ?? "")} - className="p-invalid" - /> -
-
- - - setValue7(e.target.value ?? 0) - } - className="p-invalid" - /> -
-
- - setValue8(e.value)} - optionLabel="name" - className="p-invalid" - /> -
-
- - setValue9(e.value)} - optionLabel="name" - className="p-invalid" - /> -
-
- - setValue10(e.target.value)} - className="p-invalid" - /> -
-
-
-
- ); -}; - -export default InvalidStateDemo; diff --git a/app/(main)/uikit/list/page.tsx b/app/(main)/uikit/list/page.tsx deleted file mode 100644 index ca05aa44..00000000 --- a/app/(main)/uikit/list/page.tsx +++ /dev/null @@ -1,192 +0,0 @@ -'use client'; - -import React, { useState, useEffect } from 'react'; -import { DataView, DataViewLayoutOptions } from 'primereact/dataview'; -import { Button } from 'primereact/button'; -import { Dropdown, DropdownChangeEvent } from 'primereact/dropdown'; -import { Rating } from 'primereact/rating'; -import { PickList } from 'primereact/picklist'; -import { OrderList } from 'primereact/orderlist'; -import { ProductService } from '../../../../demo/service/ProductService'; -import { InputText } from 'primereact/inputtext'; -import type { Demo } from '@/types'; - -const ListDemo = () => { - const listValue = [ - { name: 'San Francisco', code: 'SF' }, - { name: 'London', code: 'LDN' }, - { name: 'Paris', code: 'PRS' }, - { name: 'Istanbul', code: 'IST' }, - { name: 'Berlin', code: 'BRL' }, - { name: 'Barcelona', code: 'BRC' }, - { name: 'Rome', code: 'RM' } - ]; - - const [picklistSourceValue, setPicklistSourceValue] = useState(listValue); - const [picklistTargetValue, setPicklistTargetValue] = useState([]); - const [orderlistValue, setOrderlistValue] = useState(listValue); - const [dataViewValue, setDataViewValue] = useState([]); - const [globalFilterValue, setGlobalFilterValue] = useState(''); - const [filteredValue, setFilteredValue] = useState(null); - const [layout, setLayout] = useState<'grid' | 'list' | (string & Record)>('grid'); - const [sortKey, setSortKey] = useState(null); - const [sortOrder, setSortOrder] = useState<0 | 1 | -1 | null>(null); - const [sortField, setSortField] = useState(''); - - const sortOptions = [ - { label: 'Price High to Low', value: '!price' }, - { label: 'Price Low to High', value: 'price' } - ]; - - useEffect(() => { - ProductService.getProducts().then((data) => setDataViewValue(data)); - setGlobalFilterValue(''); - }, []); - - useEffect(() => { - ProductService.getProducts().then((data) => setDataViewValue(data)); - setGlobalFilterValue(''); - }, []); - - const onFilter = (e: React.ChangeEvent) => { - const value = e.target.value; - setGlobalFilterValue(value); - if (value.length === 0) { - setFilteredValue(null); - } else { - const filtered = dataViewValue?.filter((product) => { - const productNameLowercase = product.name.toLowerCase(); - const searchValueLowercase = value.toLowerCase(); - return productNameLowercase.includes(searchValueLowercase); - }); - - setFilteredValue(filtered); - } - }; - - const onSortChange = (event: DropdownChangeEvent) => { - const value = event.value; - - if (value.indexOf('!') === 0) { - setSortOrder(-1); - setSortField(value.substring(1, value.length)); - setSortKey(value); - } else { - setSortOrder(1); - setSortField(value); - setSortKey(value); - } - }; - - const dataViewHeader = ( -
- - - - - - setLayout(e.value)} /> -
- ); - - const dataviewListItem = (data: Demo.Product) => { - return ( -
-
- {data.name} -
-
{data.name}
-
{data.description}
- -
- - {data.category} -
-
-
- ${data.price} - - {data.inventoryStatus} -
-
-
- ); - }; - - const dataviewGridItem = (data: Demo.Product) => { - return ( -
-
-
-
- - {data.category} -
- {data.inventoryStatus} -
-
- {data.name} -
{data.name}
-
{data.description}
- -
-
- ${data.price} -
-
-
- ); - }; - - const itemTemplate = (data: Demo.Product, layout: 'grid' | 'list' | (string & Record)) => { - if (!data) { - return; - } - - if (layout === 'list') { - return dataviewListItem(data); - } else if (layout === 'grid') { - return dataviewGridItem(data); - } - }; - - return ( -
-
-
-
DataView
- -
-
- -
-
-
PickList
- {/*
{item.name}
} - onChange={(e) => { - setPicklistSourceValue(e.source); - setPicklistTargetValue(e.target); - }} - sourceStyle={{ height: '200px' }} - targetStyle={{ height: '200px' }} - >
*/} -
-
- -
-
-
OrderList
- {/*
{item.name}
} onChange={(e) => setOrderlistValue(e.value)}>
*/} -
-
-
- ); -}; - -export default ListDemo; diff --git a/app/(main)/uikit/media/page.tsx b/app/(main)/uikit/media/page.tsx deleted file mode 100644 index 269f5da1..00000000 --- a/app/(main)/uikit/media/page.tsx +++ /dev/null @@ -1,109 +0,0 @@ -'use client'; - -import { Button } from 'primereact/button'; -import { Carousel } from 'primereact/carousel'; -import { Galleria } from 'primereact/galleria'; -import { Image } from 'primereact/image'; -import React, { useEffect, useState } from 'react'; -import { PhotoService } from '../../../../demo/service/PhotoService'; -import { ProductService } from '../../../../demo/service/ProductService'; -import type { Demo } from '@/types'; - -const MediaDemo = () => { - const [products, setProducts] = useState([]); - const [images, setImages] = useState([]); - - const galleriaResponsiveOptions = [ - { - breakpoint: '1024px', - numVisible: 5 - }, - { - breakpoint: '960px', - numVisible: 4 - }, - { - breakpoint: '768px', - numVisible: 3 - }, - { - breakpoint: '560px', - numVisible: 1 - } - ]; - const carouselResponsiveOptions = [ - { - breakpoint: '1024px', - numVisible: 3, - numScroll: 3 - }, - { - breakpoint: '768px', - numVisible: 2, - numScroll: 2 - }, - { - breakpoint: '560px', - numVisible: 1, - numScroll: 1 - } - ]; - - useEffect(() => { - ProductService.getProductsSmall().then((products) => setProducts(products)); - - PhotoService.getImages().then((images) => setImages(images)); - }, []); - - const carouselItemTemplate = (product: Demo.Product) => { - return ( -
-
- {product.name} -
-
-

{product.name}

-
${product.price}
- {product.inventoryStatus} -
- - - -
-
-
- ); - }; - - const galleriaItemTemplate = (item: Demo.Photo) => {item.alt}; - const galleriaThumbnailTemplate = (item: Demo.Photo) => {item.alt}; - - return ( -
-
-
-
Carousel
- -
-
- -
-
-
Image
-
- Image -
-
-
- -
-
-
Galleria
- -
-
-
- ); -}; - -export default MediaDemo; diff --git a/app/(main)/uikit/menu/confirmation/page.tsx b/app/(main)/uikit/menu/confirmation/page.tsx deleted file mode 100644 index 8b5b8d2f..00000000 --- a/app/(main)/uikit/menu/confirmation/page.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import React from 'react'; -import Menu from '../page'; -function ConfirmationDemo() { - return ( - -
- -

Confirmation Component Content via Child Route

-
-
- ); -} - -export default ConfirmationDemo; diff --git a/app/(main)/uikit/menu/page.tsx b/app/(main)/uikit/menu/page.tsx deleted file mode 100644 index c49836bd..00000000 --- a/app/(main)/uikit/menu/page.tsx +++ /dev/null @@ -1,584 +0,0 @@ -'use client'; -import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { Menubar } from 'primereact/menubar'; -import { InputText } from 'primereact/inputtext'; -import { BreadCrumb } from 'primereact/breadcrumb'; -import { Steps } from 'primereact/steps'; -import { TabMenu } from 'primereact/tabmenu'; -import { TieredMenu } from 'primereact/tieredmenu'; -import { Menu } from 'primereact/menu'; -import { Button } from 'primereact/button'; -import { ContextMenu } from 'primereact/contextmenu'; -import { MegaMenu } from 'primereact/megamenu'; -import { PanelMenu } from 'primereact/panelmenu'; -import { useRouter } from 'next/navigation'; -import { usePathname } from 'next/navigation'; - -const MenuDemo = ({ children }: any) => { - const [activeIndex, setActiveIndex] = useState(0); - const menu = useRef(null); - const contextMenu = useRef(null); - const router = useRouter(); - const pathname = usePathname(); - - const checkActiveIndex = useCallback(() => { - const paths = pathname.split('/'); - const currentPath = paths[paths.length - 1]; - - switch (currentPath) { - case 'seat': - setActiveIndex(1); - break; - case 'payment': - setActiveIndex(2); - break; - case 'confirmation': - setActiveIndex(3); - break; - default: - break; - } - }, [pathname]); - - useEffect(() => { - checkActiveIndex(); - }, [checkActiveIndex]); - - const nestedMenuitems = [ - { - label: 'Customers', - icon: 'pi pi-fw pi-table', - items: [ - { - label: 'New', - icon: 'pi pi-fw pi-user-plus', - items: [ - { - label: 'Customer', - icon: 'pi pi-fw pi-plus' - }, - { - label: 'Duplicate', - icon: 'pi pi-fw pi-copy' - } - ] - }, - { - label: 'Edit', - icon: 'pi pi-fw pi-user-edit' - } - ] - }, - { - label: 'Orders', - icon: 'pi pi-fw pi-shopping-cart', - items: [ - { - label: 'View', - icon: 'pi pi-fw pi-list' - }, - { - label: 'Search', - icon: 'pi pi-fw pi-search' - } - ] - }, - { - label: 'Shipments', - icon: 'pi pi-fw pi-envelope', - items: [ - { - label: 'Tracker', - icon: 'pi pi-fw pi-compass' - }, - { - label: 'Map', - icon: 'pi pi-fw pi-map-marker' - }, - { - label: 'Manage', - icon: 'pi pi-fw pi-pencil' - } - ] - }, - { - label: 'Profile', - icon: 'pi pi-fw pi-user', - items: [ - { - label: 'Settings', - icon: 'pi pi-fw pi-cog' - }, - { - label: 'Billing', - icon: 'pi pi-fw pi-file' - } - ] - }, - { - label: 'Quit', - icon: 'pi pi-fw pi-sign-out' - } - ]; - - const breadcrumbHome = { icon: 'pi pi-home', to: '/' }; - const breadcrumbItems = [{ label: 'Computer' }, { label: 'Notebook' }, { label: 'Accessories' }, { label: 'Backpacks' }, { label: 'Item' }]; - - const wizardItems = [ - { label: 'Personal', command: () => router.push('/uikit/menu') }, - { label: 'Seat', command: () => router.push('/uikit/menu/seat') }, - { label: 'Payment', command: () => router.push('/uikit/menu/payment') }, - { - label: 'Confirmation', - command: () => router.push('/uikit/menu/confirmation') - } - ]; - - const tieredMenuItems = [ - { - label: 'Customers', - icon: 'pi pi-fw pi-table', - items: [ - { - label: 'New', - icon: 'pi pi-fw pi-user-plus', - items: [ - { - label: 'Customer', - icon: 'pi pi-fw pi-plus' - }, - { - label: 'Duplicate', - icon: 'pi pi-fw pi-copy' - } - ] - }, - { - label: 'Edit', - icon: 'pi pi-fw pi-user-edit' - } - ] - }, - { - label: 'Orders', - icon: 'pi pi-fw pi-shopping-cart', - items: [ - { - label: 'View', - icon: 'pi pi-fw pi-list' - }, - { - label: 'Search', - icon: 'pi pi-fw pi-search' - } - ] - }, - { - label: 'Shipments', - icon: 'pi pi-fw pi-envelope', - items: [ - { - label: 'Tracker', - icon: 'pi pi-fw pi-compass' - }, - { - label: 'Map', - icon: 'pi pi-fw pi-map-marker' - }, - { - label: 'Manage', - icon: 'pi pi-fw pi-pencil' - } - ] - }, - { - label: 'Profile', - icon: 'pi pi-fw pi-user', - items: [ - { - label: 'Settings', - icon: 'pi pi-fw pi-cog' - }, - { - label: 'Billing', - icon: 'pi pi-fw pi-file' - } - ] - }, - { - separator: true - }, - { - label: 'Quit', - icon: 'pi pi-fw pi-sign-out' - } - ]; - - const overlayMenuItems = [ - { - label: 'Save', - icon: 'pi pi-save' - }, - { - label: 'Update', - icon: 'pi pi-refresh' - }, - { - label: 'Delete', - icon: 'pi pi-trash' - }, - { - separator: true - }, - { - label: 'Home', - icon: 'pi pi-home' - } - ]; - - const menuitems = [ - { - label: 'Customers', - items: [ - { - label: 'New', - icon: 'pi pi-fw pi-plus' - }, - { - label: 'Edit', - icon: 'pi pi-fw pi-user-edit' - } - ] - }, - { - label: 'Orders', - items: [ - { - label: 'View', - icon: 'pi pi-fw pi-list' - }, - { - label: 'Search', - icon: 'pi pi-fw pi-search' - } - ] - } - ]; - - const contextMenuItems = [ - { - label: 'Save', - icon: 'pi pi-save' - }, - { - label: 'Update', - icon: 'pi pi-refresh' - }, - { - label: 'Delete', - icon: 'pi pi-trash' - }, - { - separator: true - }, - { - label: 'Options', - icon: 'pi pi-cog' - } - ]; - - const megamenuItems = [ - { - label: 'Fashion', - icon: 'pi pi-fw pi-tag', - items: [ - [ - { - label: 'Woman', - items: [{ label: 'Woman Item' }, { label: 'Woman Item' }, { label: 'Woman Item' }] - }, - { - label: 'Men', - items: [{ label: 'Men Item' }, { label: 'Men Item' }, { label: 'Men Item' }] - } - ], - [ - { - label: 'Kids', - items: [{ label: 'Kids Item' }, { label: 'Kids Item' }] - }, - { - label: 'Luggage', - items: [{ label: 'Luggage Item' }, { label: 'Luggage Item' }, { label: 'Luggage Item' }] - } - ] - ] - }, - { - label: 'Electronics', - icon: 'pi pi-fw pi-desktop', - items: [ - [ - { - label: 'Computer', - items: [{ label: 'Computer Item' }, { label: 'Computer Item' }] - }, - { - label: 'Camcorder', - items: [{ label: 'Camcorder Item' }, { label: 'Camcorder Item' }, { label: 'Camcorder Item' }] - } - ], - [ - { - label: 'TV', - items: [{ label: 'TV Item' }, { label: 'TV Item' }] - }, - { - label: 'Audio', - items: [{ label: 'Audio Item' }, { label: 'Audio Item' }, { label: 'Audio Item' }] - } - ], - [ - { - label: 'Sports.7', - items: [{ label: 'Sports.7.1' }, { label: 'Sports.7.2' }] - } - ] - ] - }, - { - label: 'Furniture', - icon: 'pi pi-fw pi-image', - items: [ - [ - { - label: 'Living Room', - items: [{ label: 'Living Room Item' }, { label: 'Living Room Item' }] - }, - { - label: 'Kitchen', - items: [{ label: 'Kitchen Item' }, { label: 'Kitchen Item' }, { label: 'Kitchen Item' }] - } - ], - [ - { - label: 'Bedroom', - items: [{ label: 'Bedroom Item' }, { label: 'Bedroom Item' }] - }, - { - label: 'Outdoor', - items: [{ label: 'Outdoor Item' }, { label: 'Outdoor Item' }, { label: 'Outdoor Item' }] - } - ] - ] - }, - { - label: 'Sports', - icon: 'pi pi-fw pi-star', - items: [ - [ - { - label: 'Basketball', - items: [{ label: 'Basketball Item' }, { label: 'Basketball Item' }] - }, - { - label: 'Football', - items: [{ label: 'Football Item' }, { label: 'Football Item' }, { label: 'Football Item' }] - } - ], - [ - { - label: 'Tennis', - items: [{ label: 'Tennis Item' }, { label: 'Tennis Item' }] - } - ] - ] - } - ]; - - const panelMenuitems = [ - { - label: 'Customers', - icon: 'pi pi-fw pi-table', - items: [ - { - label: 'New', - icon: 'pi pi-fw pi-user-plus', - items: [ - { - label: 'Customer', - icon: 'pi pi-fw pi-plus' - }, - { - label: 'Duplicate', - icon: 'pi pi-fw pi-copy' - } - ] - }, - { - label: 'Edit', - icon: 'pi pi-fw pi-user-edit' - } - ] - }, - { - label: 'Orders', - icon: 'pi pi-fw pi-shopping-cart', - items: [ - { - label: 'View', - icon: 'pi pi-fw pi-list' - }, - { - label: 'Search', - icon: 'pi pi-fw pi-search' - } - ] - }, - { - label: 'Shipments', - icon: 'pi pi-fw pi-envelope', - items: [ - { - label: 'Tracker', - icon: 'pi pi-fw pi-compass' - }, - { - label: 'Map', - icon: 'pi pi-fw pi-map-marker' - }, - { - label: 'Manage', - icon: 'pi pi-fw pi-pencil' - } - ] - }, - { - label: 'Profile', - icon: 'pi pi-fw pi-user', - items: [ - { - label: 'Settings', - icon: 'pi pi-fw pi-cog' - }, - { - label: 'Billing', - icon: 'pi pi-fw pi-file' - } - ] - } - ]; - - const toggleMenu = (event: React.MouseEvent) => { - menu.current?.toggle(event); - }; - - const onContextRightClick = (event: React.MouseEvent) => { - contextMenu.current?.show(event); - }; - - const menubarEndTemplate = () => { - return ( - - - - - ); - }; - - return ( -
-
-
-
Menubar
- -
-
- -
-
-
Breadcrumb
- -
-
- -
-
-
Steps
- setActiveIndex(e.index)} readOnly={false} /> - {pathname === '/uikit/menu' ? ( -
- -

Personal Component Content via Child Route

-
- ) : ( - <>{children} - )} -
-
- -
-
-
TabMenu
- setActiveIndex(e.index)} /> - {pathname === '/uikit/menu' ? ( -
- -

Personal Component Content via Child Route

-
- ) : ( - <>{children} - )} -
-
- -
-
-
Tiered Menu
- -
-
- -
-
-
Plain Menu
- -
-
- -
-
-
Overlay Menu
- - -
- -
-
ContextMenu
- Right click to display. - -
-
- -
-
-
MegaMenu - Horizontal
- - -
MegaMenu - Vertical
- -
-
- -
-
-
PanelMenu
- -
-
-
- ); -}; - -export default MenuDemo; diff --git a/app/(main)/uikit/menu/payment/page.tsx b/app/(main)/uikit/menu/payment/page.tsx deleted file mode 100644 index 4f19d0b7..00000000 --- a/app/(main)/uikit/menu/payment/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -'use client'; -import React from 'react'; -import Menu from '../page'; -function PaymentDemo() { - return ( - -
- -

Payment Component Content via Child Route

-
-
- ); -} - -export default PaymentDemo; diff --git a/app/(main)/uikit/menu/seat/page.tsx b/app/(main)/uikit/menu/seat/page.tsx deleted file mode 100644 index a4dd25cf..00000000 --- a/app/(main)/uikit/menu/seat/page.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import React from 'react'; -import Menu from '../page'; -function SeatDemo() { - return ( - -
- -

Seat Component Content via Child Route

-
-
- ); -} - -export default SeatDemo; diff --git a/app/(main)/uikit/message/page.tsx b/app/(main)/uikit/message/page.tsx deleted file mode 100644 index 772cb852..00000000 --- a/app/(main)/uikit/message/page.tsx +++ /dev/null @@ -1,131 +0,0 @@ -'use client'; -import React, { useRef, useState } from 'react'; -import { Toast } from 'primereact/toast'; -import { Messages } from 'primereact/messages'; -import { Message } from 'primereact/message'; -import { InputText } from 'primereact/inputtext'; -import { Button } from 'primereact/button'; - -const MessagesDemo = () => { - const [username, setUsername] = useState(''); - const [email, setEmail] = useState(''); - const toast = useRef(null); - const message = useRef(null); - - const addSuccessMessage = () => { - message.current?.show({ severity: 'success', content: 'Message Detail' }); - }; - - const addInfoMessage = () => { - message.current?.show({ severity: 'info', content: 'Message Detail' }); - }; - - const addWarnMessage = () => { - message.current?.show({ severity: 'warn', content: 'Message Detail' }); - }; - - const addErrorMessage = () => { - message.current?.show({ severity: 'error', content: 'Message Detail' }); - }; - - const showSuccess = () => { - toast.current?.show({ - severity: 'success', - summary: 'Success Message', - detail: 'Message Detail', - life: 3000 - }); - }; - - const showInfo = () => { - toast.current?.show({ - severity: 'info', - summary: 'Info Message', - detail: 'Message Detail', - life: 3000 - }); - }; - - const showWarn = () => { - toast.current?.show({ - severity: 'warn', - summary: 'Warn Message', - detail: 'Message Detail', - life: 3000 - }); - }; - - const showError = () => { - toast.current?.show({ - severity: 'error', - summary: 'Error Message', - detail: 'Message Detail', - life: 3000 - }); - }; - - return ( -
-
-
-
Toast
-
- -
-
-
- -
-
-
Messages
-
-
- -
-
- -
-
-
Inline
-
- - setUsername(e.target.value)} required className="p-invalid" /> - -
-
- - setEmail(e.target.value)} required className="p-invalid" /> - -
-
-
- -
-
-
Help Text
-
- - - - Enter your username to reset your password. - -
-
-
-
- ); -}; - -export default MessagesDemo; diff --git a/app/(main)/uikit/misc/page.tsx b/app/(main)/uikit/misc/page.tsx deleted file mode 100644 index 92c72d8b..00000000 --- a/app/(main)/uikit/misc/page.tsx +++ /dev/null @@ -1,220 +0,0 @@ -'use client'; - -import React, { useState, useEffect, useRef } from 'react'; -import { ProgressBar } from 'primereact/progressbar'; -import { Button } from 'primereact/button'; -import { Badge } from 'primereact/badge'; -import { Tag } from 'primereact/tag'; -import { Avatar } from 'primereact/avatar'; -import { AvatarGroup } from 'primereact/avatargroup'; -import { Chip } from 'primereact/chip'; -import { Skeleton } from 'primereact/skeleton'; -import { ScrollPanel } from 'primereact/scrollpanel'; -import { ScrollTop } from 'primereact/scrolltop'; - -const MiscDemo = () => { - const [value, setValue] = useState(0); - const intervalRef = useRef(null); - - useEffect(() => { - const interval = setInterval(() => { - setValue((prevValue) => { - const newVal = prevValue + Math.floor(Math.random() * 10) + 1; - return newVal >= 100 ? 100 : newVal; - }); - }, 2000); - - intervalRef.current = interval; - - return () => { - clearInterval(intervalRef.current as NodeJS.Timeout); - intervalRef.current = null; - }; - }, []); - - return ( -
-
-
-
ProgressBar
-
-
- -
-
- -
-
-
-
-
-
-

Badge

-
Numbers
-
- - - - - -
- -
Positioned Badge
-
- - - - - - - - - -
- -
Button Badge
-
- - -
-
Sizes
-
- - - -
-
- -
-

Avatar

-
Avatar Group
- - - - - - - - - -
Label - Circle
-
- - - -
- -
Icon - Badge
- - - -
- -
-

ScrollTop

- -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vitae et leo duis ut diam. Ultricies mi quis hendrerit dolor magna eget est lorem. Amet - consectetur adipiscing elit ut. Nam libero justo laoreet sit amet. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Est ultricies integer quis auctor elit sed vulputate. Consequat ac felis donec et. Tellus - orci ac auctor augue mauris. Semper feugiat nibh sed pulvinar proin gravida hendrerit lectus a. Tincidunt arcu non sodales neque sodales. Metus aliquam eleifend mi in nulla posuere sollicitudin aliquam ultrices. Sodales ut - etiam sit amet nisl purus. Cursus sit amet dictum sit amet. Tristique senectus et netus et malesuada fames ac turpis egestas. Et tortor consequat id porta nibh venenatis cras sed. Diam maecenas ultricies mi eget mauris. - Eget egestas purus viverra accumsan in nisl nisi. Suscipit adipiscing bibendum est ultricies integer. Mattis aliquam faucibus purus in massa tempor nec. -

- -
-
-
-
-
-

Tag

-
Tags
-
- - - - - -
- -
Pills
-
- - - - - -
- -
Icons
-
- - - - - -
-
- -
-

Chip

-
Basic
-
- - - - -
- -
Icon
-
- - - - -
- -
Image
-
- - - - -
- -
Styling
-
- - - - -
-
- -
-

Skeleton

-
-
- -
- - - -
-
- -
- - -
-
-
-
-
- ); -}; - -export default MiscDemo; diff --git a/app/(main)/uikit/overlay/page.tsx b/app/(main)/uikit/overlay/page.tsx deleted file mode 100644 index 173512dd..00000000 --- a/app/(main)/uikit/overlay/page.tsx +++ /dev/null @@ -1,222 +0,0 @@ -'use client'; - -import { Button } from 'primereact/button'; -import { Column } from 'primereact/column'; -import { confirmPopup, ConfirmPopup } from 'primereact/confirmpopup'; -import { DataTable, DataTableSelectEvent } from 'primereact/datatable'; -import { Dialog } from 'primereact/dialog'; -import { InputText } from 'primereact/inputtext'; -import { OverlayPanel } from 'primereact/overlaypanel'; -import { Sidebar } from 'primereact/sidebar'; -import { Toast } from 'primereact/toast'; -import React, { useEffect, useRef, useState } from 'react'; -import { ProductService } from '../../../../demo/service/ProductService'; -import type { Demo } from '@/types'; - -type ButtonEvent = React.MouseEvent; -const OverlayDemo = () => { - const [displayBasic, setDisplayBasic] = useState(false); - const [displayConfirmation, setDisplayConfirmation] = useState(false); - const [visibleLeft, setVisibleLeft] = useState(false); - const [visibleRight, setVisibleRight] = useState(false); - const [visibleTop, setVisibleTop] = useState(false); - const [visibleBottom, setVisibleBottom] = useState(false); - const [visibleFullScreen, setVisibleFullScreen] = useState(false); - const [products, setProducts] = useState([]); - const [selectedProduct, setSelectedProduct] = useState(null); - const op = useRef(null); - const op2 = useRef(null); - const toast = useRef(null); - - const accept = () => { - toast.current?.show({ - severity: 'info', - summary: 'Confirmed', - detail: 'You have accepted', - life: 3000 - }); - }; - - const reject = () => { - toast.current?.show({ - severity: 'error', - summary: 'Rejected', - detail: 'You have rejected', - life: 3000 - }); - }; - - const confirm = (event: React.MouseEvent) => { - confirmPopup({ - target: event.currentTarget, - message: 'Are you sure you want to proceed?', - icon: 'pi pi-exclamation-triangle', - accept, - reject - }); - }; - - useEffect(() => { - ProductService.getProductsSmall().then((data) => setProducts(data)); - }, []); - - const toggle = (event: ButtonEvent) => { - op.current?.toggle(event); - }; - - const toggleDataTable = (event: ButtonEvent) => { - op2.current?.toggle(event); - }; - - const formatCurrency = (value: number) => { - return value.toLocaleString('en-US', { - style: 'currency', - currency: 'USD' - }); - }; - - const onProductSelect = (event: DataTableSelectEvent) => { - op2.current?.hide(); - toast.current?.show({ - severity: 'info', - summary: 'Product Selected', - detail: event.data.name, - life: 3000 - }); - }; - - const onSelectionChange = (e: any): void => { - setSelectedProduct(e.value as Demo.Product); - }; - - const basicDialogFooter =
-
-
-
-
Overlay Panel
-
-
-
-
-
-
-
-
- -
-
-
Confirmation
-
-
-
Sidebar
- setVisibleLeft(false)} baseZIndex={1000}> -

Left Sidebar

-
- - setVisibleRight(false)} baseZIndex={1000} position="right"> -

Right Sidebar

-
- - setVisibleTop(false)} baseZIndex={1000} position="top"> -

Top Sidebar

-
- - setVisibleBottom(false)} baseZIndex={1000} position="bottom"> -

Bottom Sidebar

-
- - setVisibleFullScreen(false)} baseZIndex={1000} fullScreen> -

Full Screen

-
- -
-
- -
-
-
Tooltip
-
- - - - -
-
-
-
- - -
-
ConfirmPopup
- - -
-
-
- - ); -}; - -export default OverlayDemo; diff --git a/app/(main)/uikit/panel/page.tsx b/app/(main)/uikit/panel/page.tsx deleted file mode 100644 index 5a852b75..00000000 --- a/app/(main)/uikit/panel/page.tsx +++ /dev/null @@ -1,233 +0,0 @@ -'use client'; - -import React, { useRef } from 'react'; -import { Toolbar } from 'primereact/toolbar'; -import { Button } from 'primereact/button'; -import { SplitButton } from 'primereact/splitbutton'; -import { Accordion, AccordionTab } from 'primereact/accordion'; -import { TabView, TabPanel } from 'primereact/tabview'; -import { Panel } from 'primereact/panel'; -import { Fieldset } from 'primereact/fieldset'; -import { Card } from 'primereact/card'; -import { Divider } from 'primereact/divider'; -import { InputText } from 'primereact/inputtext'; -import { Splitter, SplitterPanel } from 'primereact/splitter'; -import { Menu } from 'primereact/menu'; - -const PanelDemo = () => { - const menu1 = useRef(null); - const toolbarItems = [ - { - label: 'Save', - icon: 'pi pi-check' - }, - { - label: 'Update', - icon: 'pi pi-sync' - }, - { - label: 'Delete', - icon: 'pi pi-trash' - }, - { - label: 'Home Page', - icon: 'pi pi-home' - } - ]; - - const toolbarLeftTemplate = () => { - return ( - <> -
- ); - - return ( -
-
-
-
Toolbar
- -
-
-
-
-
AccordionPanel
- - -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea - commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim - id est laborum. -

-
- -

- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. - Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Consectetur, adipisci velit, sed quia non numquam eius modi. -

-
- -

- At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt - in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo - minus. -

-
-
-
-
-
TabView
- - -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea - commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim - id est laborum. -

-
- -

- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. - Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Consectetur, adipisci velit, sed quia non numquam eius modi. -

-
- -

- At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt - in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo - minus. -

-
-
-
-
-
-
-
Panel
- -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est - laborum. -

-
-
-
-
Fieldset
-
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est - laborum. -

-
-
- -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo - consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -

-
-
- -
-
-
Divider
-
-
-
-
- - -
-
- - -
- -
-
-
- - OR - -
-
-

- Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. - Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Consectetur, adipisci velit, sed quia non numquam eius modi. -

- - - Badge - - -

- At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt - in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo - minus. -

- - - - - -

- Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut - reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Donec vel volutpat ipsum. Integer nunc magna, posuere ut tincidunt eget, egestas vitae sapien. Morbi dapibus luctus odio. -

-
-
-
-
- -
-
-
Splitter
- - -
Panel 1
-
- - - -
Panel 2
-
- -
Panel 3
-
-
-
-
-
-
-
- ); -}; - -export default PanelDemo; diff --git a/app/(main)/uikit/table/page.tsx b/app/(main)/uikit/table/page.tsx deleted file mode 100644 index cb399065..00000000 --- a/app/(main)/uikit/table/page.tsx +++ /dev/null @@ -1,464 +0,0 @@ -'use client'; -import { CustomerService } from '../../../../demo/service/CustomerService'; -import { ProductService } from '../../../../demo/service/ProductService'; -import { FilterMatchMode, FilterOperator } from 'primereact/api'; -import { Button } from 'primereact/button'; -import { Calendar } from 'primereact/calendar'; -import { Column, ColumnFilterApplyTemplateOptions, ColumnFilterClearTemplateOptions, ColumnFilterElementTemplateOptions } from 'primereact/column'; -import { DataTable, DataTableExpandedRows, DataTableFilterMeta } from 'primereact/datatable'; -import { Dropdown } from 'primereact/dropdown'; -import { InputNumber } from 'primereact/inputnumber'; -import { InputText } from 'primereact/inputtext'; -import { MultiSelect } from 'primereact/multiselect'; -import { ProgressBar } from 'primereact/progressbar'; -import { Rating } from 'primereact/rating'; -import { Slider } from 'primereact/slider'; -import { ToggleButton } from 'primereact/togglebutton'; -import { TriStateCheckbox } from 'primereact/tristatecheckbox'; -import { classNames } from 'primereact/utils'; -import React, { useEffect, useState } from 'react'; -import type { Demo } from '@/types'; - -const TableDemo = () => { - const [customers1, setCustomers1] = useState([]); - const [customers2, setCustomers2] = useState([]); - const [customers3, setCustomers3] = useState([]); - const [filters1, setFilters1] = useState({}); - const [loading1, setLoading1] = useState(true); - const [loading2, setLoading2] = useState(true); - const [idFrozen, setIdFrozen] = useState(false); - const [products, setProducts] = useState([]); - const [globalFilterValue1, setGlobalFilterValue1] = useState(''); - const [expandedRows, setExpandedRows] = useState([]); - const [allExpanded, setAllExpanded] = useState(false); - - const representatives = [ - { name: 'Amy Elsner', image: 'amyelsner.png' }, - { name: 'Anna Fali', image: 'annafali.png' }, - { name: 'Asiya Javayant', image: 'asiyajavayant.png' }, - { name: 'Bernardo Dominic', image: 'bernardodominic.png' }, - { name: 'Elwin Sharvill', image: 'elwinsharvill.png' }, - { name: 'Ioni Bowcher', image: 'ionibowcher.png' }, - { name: 'Ivan Magalhaes', image: 'ivanmagalhaes.png' }, - { name: 'Onyama Limba', image: 'onyamalimba.png' }, - { name: 'Stephen Shaw', image: 'stephenshaw.png' }, - { name: 'XuXue Feng', image: 'xuxuefeng.png' } - ]; - - const statuses = ['unqualified', 'qualified', 'new', 'negotiation', 'renewal', 'proposal']; - - const clearFilter1 = () => { - initFilters1(); - }; - - const onGlobalFilterChange1 = (e: React.ChangeEvent) => { - const value = e.target.value; - let _filters1 = { ...filters1 }; - (_filters1['global'] as any).value = value; - - setFilters1(_filters1); - setGlobalFilterValue1(value); - }; - - const renderHeader1 = () => { - return ( -
-
- ); - }; - - useEffect(() => { - setLoading2(true); - - CustomerService.getCustomersLarge().then((data) => { - setCustomers1(getCustomers(data)); - setLoading1(false); - }); - CustomerService.getCustomersLarge().then((data) => { - setCustomers2(getCustomers(data)); - setLoading2(false); - }); - CustomerService.getCustomersMedium().then((data) => setCustomers3(data)); - ProductService.getProductsWithOrdersSmall().then((data) => setProducts(data)); - - initFilters1(); - }, []); - - const balanceTemplate = (rowData: Demo.Customer) => { - return ( -
- {formatCurrency(rowData.balance as number)} -
- ); - }; - - const getCustomers = (data: Demo.Customer[]) => { - return [...(data || [])].map((d) => { - d.date = new Date(d.date); - return d; - }); - }; - - const formatDate = (value: Date) => { - return value.toLocaleDateString('en-US', { - day: '2-digit', - month: '2-digit', - year: 'numeric' - }); - }; - - const formatCurrency = (value: number) => { - return value.toLocaleString('en-US', { - style: 'currency', - currency: 'USD' - }); - }; - - const initFilters1 = () => { - setFilters1({ - global: { value: null, matchMode: FilterMatchMode.CONTAINS }, - name: { - operator: FilterOperator.AND, - constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }] - }, - 'country.name': { - operator: FilterOperator.AND, - constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }] - }, - representative: { value: null, matchMode: FilterMatchMode.IN }, - date: { - operator: FilterOperator.AND, - constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] - }, - balance: { - operator: FilterOperator.AND, - constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] - }, - status: { - operator: FilterOperator.OR, - constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] - }, - activity: { value: null, matchMode: FilterMatchMode.BETWEEN }, - verified: { value: null, matchMode: FilterMatchMode.EQUALS } - }); - setGlobalFilterValue1(''); - }; - - const countryBodyTemplate = (rowData: Demo.Customer) => { - return ( - - flag - {rowData.country.name} - - ); - }; - - const filterClearTemplate = (options: ColumnFilterClearTemplateOptions) => { - return ; - }; - - const filterApplyTemplate = (options: ColumnFilterApplyTemplateOptions) => { - return ; - }; - - const representativeBodyTemplate = (rowData: Demo.Customer) => { - const representative = rowData.representative; - return ( - - {representative.name} ((e.target as HTMLImageElement).src = 'https://www.primefaces.org/wp-content/uploads/2020/05/placeholder.png')} - width={32} - style={{ verticalAlign: 'middle' }} - /> - {representative.name} - - ); - }; - - const representativeFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return ( - <> -
Agent Picker
- options.filterCallback(e.value)} optionLabel="name" placeholder="Any" className="p-column-filter" /> - - ); - }; - - const representativesItemTemplate = (option: any) => { - return ( -
- {option.name} - {option.name} -
- ); - }; - - const dateBodyTemplate = (rowData: Demo.Customer) => { - return formatDate(rowData.date); - }; - - const dateFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return options.filterCallback(e.value, options.index)} dateFormat="mm/dd/yy" placeholder="mm/dd/yyyy" mask="99/99/9999" />; - }; - - const balanceBodyTemplate = (rowData: Demo.Customer) => { - return formatCurrency(rowData.balance as number); - }; - - const balanceFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return options.filterCallback(e.value, options.index)} mode="currency" currency="USD" locale="en-US" />; - }; - - const statusBodyTemplate = (rowData: Demo.Customer) => { - return {rowData.status}; - }; - - const statusFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select a Status" className="p-column-filter" showClear />; - }; - - const statusItemTemplate = (option: any) => { - return {option}; - }; - - const activityBodyTemplate = (rowData: Demo.Customer) => { - return ; - }; - - const activityFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return ( - - options.filterCallback(e.value)} range className="m-3"> -
- {options.value ? options.value[0] : 0} - {options.value ? options.value[1] : 100} -
-
- ); - }; - - const verifiedBodyTemplate = (rowData: Demo.Customer) => { - return ( - - ); - }; - - const verifiedFilterTemplate = (options: ColumnFilterElementTemplateOptions) => { - return options.filterCallback(e.value)} />; - }; - - const toggleAll = () => { - if (allExpanded) collapseAll(); - else expandAll(); - }; - - const expandAll = () => { - let _expandedRows = {} as { [key: string]: boolean }; - products.forEach((p) => (_expandedRows[`${p.id}`] = true)); - - setExpandedRows(_expandedRows); - setAllExpanded(true); - }; - - const collapseAll = () => { - setExpandedRows([]); - setAllExpanded(false); - }; - - const amountBodyTemplate = (rowData: Demo.Customer) => { - return formatCurrency(rowData.amount as number); - }; - - const statusOrderBodyTemplate = (rowData: Demo.Customer) => { - return {rowData.status}; - }; - - const searchBodyTemplate = () => { - return
+ )} +
+
+ ); + }; + return (
{/* title section */} @@ -249,14 +286,15 @@ export default function CourseTheme() {

{themeInfo?.description}

- - {themeInfo?.created_at} + + {themeInfo?.created_at && new Date(themeInfo?.created_at).toISOString().slice(0, 10)}
- -
- -
+ {themeInfo?.image && ( +
+ +
+ )}
{breadcrumb}
@@ -309,6 +347,16 @@ export default function CourseTheme() {
{skeleton ? ( + ) : media ? ( + <> + + ) : ( rowIndex + 1} header="Номер" style={{ width: '20px' }}> diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 7996d588..2acca02b 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -29,6 +29,7 @@ import useShortText from '@/hooks/useShortText'; import { ProgressSpinner } from 'primereact/progressspinner'; import { RadioButton } from 'primereact/radiobutton'; import { DataView } from 'primereact/dataview'; +import { displayType } from '@/types/displayType'; export default function Course() { const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); @@ -36,10 +37,6 @@ export default function Course() { objectURL?: string; } - interface forDisplayType { - streamTitle: string; - } - const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); const [courseValue, setCourseValue] = useState({ title: '', description: '', video_url: '', image: '' }); @@ -56,7 +53,7 @@ export default function Course() { }); const [activeIndex, setActiveIndex] = useState(0); const [imageState, setImageState] = useState(null); - const [displayStrem, setDisplayStreams] = useState([]); + const [displayStrem, setDisplayStreams] = useState([]); const [editingLesson, setEditingLesson] = useState({ title: '', @@ -131,10 +128,6 @@ export default function Course() { }, 1000); }; - const handleDisplay = (value: forDisplayType[]) => { - setDisplayStreams(value); - }; - const handleFetchCourse = async (page = 1) => { const data = await fetchCourses(page, 0); toggleSkeleton(); @@ -308,6 +301,11 @@ export default function Course() { setActiveIndex(e.index); }; + const displayInfo = (value: displayType[]) => { + console.log('info ', value); + setDisplayStreams(value); + }; + useEffect(() => { contextFetchCourse(1); }, []); @@ -368,7 +366,7 @@ export default function Course() { const itemTemplate = (shablonData: any) => { return (
-
+
{/* Номер (rowIndex) можно добавить через внешний счетчик или props, но для DataView это сложнее */} {/* Заголовок */} @@ -530,6 +528,32 @@ export default function Course() {
+
+ {forStreamId?.title && ( +
+
+ + Тандалган курстун аталышы: {forStreamId?.title} +
+
+
+
+ {displayStrem?.length < 1 && Курска байлоо үчүн агымдарды тандаңыз} + {displayStrem.map((item, idx) => { + if (idx < 1) { + return ( + <> +
{item?.stream_title}...
+ + ); + } + // {displayStrem.length >= 3 && '...'} + })} +
+
+
+ )} +
{media ? ( <> {/* mobile table section */} {/* mobile table section */} - {false ? ( + {hasCourses ? ( <>
)} diff --git a/app/(main)/students/[connect_id]/[stream_id]/page.tsx b/app/(main)/students/[connect_id]/[stream_id]/page.tsx index 38c455a6..cdf33b14 100644 --- a/app/(main)/students/[connect_id]/[stream_id]/page.tsx +++ b/app/(main)/students/[connect_id]/[stream_id]/page.tsx @@ -56,7 +56,8 @@ export default function StudentList() { { id: 1, url: '/', - title: 'Башкы баракча', + title: '', + icon: true, parent_id: null }, { @@ -131,7 +132,6 @@ export default function StudentList() { <> {/* info section */}
-

{'Угуучулардын тизмеси'}

{breadcrumb}
diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index a008acf6..7d4e6efe 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -270,8 +270,9 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp {docShow ? ( ) : ( - documents.map((item: lessonType) => ( - <> + documents.map((item: lessonType) => { + console.log(item.created_at); + return <> selectedForEditing(id, type)} @@ -285,7 +286,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp urlForDownload="" /> - )) + }) )}
diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 2972a785..10fd2519 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -10,8 +10,9 @@ import { NotFound } from '../NotFound'; import GroupSkeleton from '../skeleton/GroupSkeleton'; import Link from 'next/link'; import { streamsType } from '@/types/streamType'; +import { displayType } from '@/types/displayType'; -export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: ()=> void }) { +export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id:displayType[]) => void }) { interface mainStreamsType { connect_id: number | null; stream_id: number; @@ -73,13 +74,13 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis id_period: 2, semester: { name_kg: 'test' }, edu_form: { name_kg: 'test' } - }, + } ]; const [streams, setStreams] = useState([]); const [streamValues, setStreamValues] = useState<{ stream: streamsType[] }>({ stream: [] }); - const [displayStreams, setDisplayStreams] = useState<{ course_id: number; stream_id: number; info: string | null; stream_title: string }[] | any>([]); + const [displayStreams, setDisplayStreams] = useState([]); const [hasStreams, setHasStreams] = useState(false); - + const [selectedStreams, setSelectedStreams] = useState([]); const [skeleton, setSkeleton] = useState(false); const { setMessage } = useContext(LayoutContext); @@ -92,15 +93,17 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis }, 1000); }; - const profilactor = (data: { connect_id: number; course_id: number; stream_id: number; info: string | null }[]) => { - const newStreams: { course_id: number; stream_id: number; info: string | null }[] = []; - + const profilactor = (data: { connect_id: number; course_id: number; stream_id: number; info: string | null, subject_name: {name_kg:string} }[]) => { + const newStreams: { course_id: number; stream_id: number; info: string | null, stream_title: string }[] = []; + console.log(data); + data.forEach((item) => { if (item?.connect_id) { newStreams.push({ course_id: item?.course_id, stream_id: item.stream_id, - info: '' + info: '', + stream_title: item?.subject_name.name_kg }); } }); @@ -175,7 +178,6 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } ); // const x = {streamTitle} - insideDisplayStreams(); } else { setStreamValues( (prev) => @@ -189,12 +191,10 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis useEffect(() => { console.log('отправляемый поток ', streamValues); - const forDisplay = streamValues.stream.map((item, idx) => { - if (idx <= 2) { + const forDisplay = streamValues.stream.filter((item, idx) => { + // if (idx <= 2) { return item; - } else { - return null; - } + // } }); setDisplayStreams(forDisplay); @@ -217,13 +217,15 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } }, [streams]); - useEffect(()=> { + useEffect(() => { console.log(displayStreams); - },[displayStreams]) + insideDisplayStreams(displayStreams); + }, [displayStreams]); const itemTemplate = (item: mainStreamsType, index: number) => { const bgClass = item.connect_id ? 'bg-[var(--greenBgColor)] border-b border-[gray]' : index % 2 == 1 ? 'bg-[#f5f5f5]' : ''; - + console.log(item); + return (
@@ -339,13 +341,13 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis )}
- {courseValue?.title && ( + {/* {courseValue?.title && (
Тандалган курстун аталышы: {courseValue?.title}
- {/*
+
{streamValues.stream?.length < 1 && Курска байлоо үчүн агымдарды тандаңыз} @@ -354,9 +356,9 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis })}
{displayStreams.length >= 3 && '...'}
-
*/} +
- )} + )} */}
)}
diff --git a/hooks/useBreadCrumbs.tsx b/hooks/useBreadCrumbs.tsx index 86d3372c..923a1d92 100644 --- a/hooks/useBreadCrumbs.tsx +++ b/hooks/useBreadCrumbs.tsx @@ -57,11 +57,11 @@ export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], curre
{index < breadCrumb.length - 1 ? ( - + {crumb.title} ) : ( - {crumb.title} + {crumb.title} )}
{index < breadCrumb.length - 1 && / } diff --git a/types/breadCrumbType.tsx b/types/breadCrumbType.tsx index 55c31ceb..a1cfb7a0 100644 --- a/types/breadCrumbType.tsx +++ b/types/breadCrumbType.tsx @@ -3,4 +3,5 @@ export interface breadCrumbType { url: string; title: string; parent_id: number | null; + icon?: boolean } diff --git a/types/displayType.tsx b/types/displayType.tsx new file mode 100644 index 00000000..1251a2b6 --- /dev/null +++ b/types/displayType.tsx @@ -0,0 +1,6 @@ +export interface displayType { + course_id: number; + stream_id: number; + info: string | null; + stream_title: string; +} From 1babdb1a49c5f7cbe841a121be3b4713b384d12f Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 29 Aug 2025 12:01:05 +0600 Subject: [PATCH 129/286] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 16 +-- app/components/tables/StreamList.tsx | 149 ++++++++++++++++++--------- services/streams.tsx | 1 + 3 files changed, 111 insertions(+), 55 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 2acca02b..c2721867 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -528,16 +528,16 @@ export default function Course() {
-
+
{forStreamId?.title && (
-
- - Тандалган курстун аталышы: {forStreamId?.title} +
+ + Тандалган курстун аталышы: {forStreamId?.title}
-
-
-
+
+
+
{displayStrem?.length < 1 && Курска байлоо үчүн агымдарды тандаңыз} {displayStrem.map((item, idx) => { if (idx < 1) { @@ -630,7 +630,7 @@ export default function Course() { className="p-tabview p-tabview-nav p-tabview-selected p-tabview-panels p-tabview-panel" >
- {}} /> + displayInfo(value)} />
diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 10fd2519..676ded19 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -12,7 +12,7 @@ import Link from 'next/link'; import { streamsType } from '@/types/streamType'; import { displayType } from '@/types/displayType'; -export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id:displayType[]) => void }) { +export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id: displayType[]) => void }) { interface mainStreamsType { connect_id: number | null; stream_id: number; @@ -24,6 +24,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis id_period: number; semester: { name_kg: string }; edu_form: { name_kg: string }; + courseValue?: number; } const shablon = [ @@ -82,6 +83,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis const [hasStreams, setHasStreams] = useState(false); const [selectedStreams, setSelectedStreams] = useState([]); const [skeleton, setSkeleton] = useState(false); + const [pendingChanges, setPendingChanges] = useState([]); const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); @@ -93,10 +95,10 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis }, 1000); }; - const profilactor = (data: { connect_id: number; course_id: number; stream_id: number; info: string | null, subject_name: {name_kg:string} }[]) => { - const newStreams: { course_id: number; stream_id: number; info: string | null, stream_title: string }[] = []; + const profilactor = (data: { connect_id: number; course_id: number; stream_id: number; info: string | null; subject_name: { name_kg: string } }[]) => { + const newStreams: { course_id: number; stream_id: number; info: string | null; stream_title: string }[] = []; console.log(data); - + data.forEach((item) => { if (item?.connect_id) { newStreams.push({ @@ -108,15 +110,23 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } }); - setStreamValues((prev) => ({ - ...prev, - stream: [...prev.stream, ...newStreams] - })); + // setStreamValues((prev) => ({ + // ...prev, + // stream: [...prev.stream, ...newStreams] + // })); + // setPendingChanges((prev)=> [...prev, ...newStreams]); + + setPendingChanges((prev) => { + const pendingIds = new Set(prev.map((p) => p.stream_id)); + const uniqueNewStreams = newStreams.filter((s) => !pendingIds.has(s.stream_id)); + return [...prev, ...uniqueNewStreams]; + }); }; const handleFetchStreams = async () => { const data = await fetchStreams(courseValue ? courseValue.id : null); - setStreamValues({ stream: [] }); + // setStreamValues({ stream: [] }); + setPendingChanges([]); if (data) { profilactor(data); @@ -140,7 +150,8 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis }; const handleConnect = async () => { - const data = await connectStreams(streamValues); + const data = await connectStreams({ stream: pendingChanges }); + // const data = await connectStreams(streamValues); if (data?.success) { toggleSkeleton(); @@ -160,48 +171,73 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } }; - const handleEdit = (e: { checked: boolean }, id: number, title: string) => { + const handleEdit = (e: { checked: boolean }, item: mainStreamsType) => { + const { stream_id, subject_name } = item; + const isChecked = e.checked; + const forSentStreams = { course_id: courseValue!.id, - stream_id: id, + stream_id: stream_id, info: '', - stream_title: title + stream_title: subject_name.name_kg }; - if (e.checked) { - // profilactor(); - setStreamValues( - (prev) => - prev && { - ...prev, - stream: [...prev.stream, forSentStreams] - } - ); - // const x = {streamTitle} - } else { - setStreamValues( - (prev) => - prev && { - ...prev, - stream: [...prev.stream.filter((item) => item?.stream_id !== id)] - } - ); - } - }; + setPendingChanges((prev) => { + const isCurrentlyPending = prev.some((s) => s.stream_id === stream_id); - useEffect(() => { - console.log('отправляемый поток ', streamValues); - const forDisplay = streamValues.stream.filter((item, idx) => { - // if (idx <= 2) { - return item; - // } + if (isChecked) { + // Если чекбокс отмечается + if (!isCurrentlyPending) { + return [...prev, forSentStreams]; + } + } else { + // Если чекбокс снимается, удаляем объект из временного состояния + return prev.filter((s) => s.stream_id !== stream_id); + } + + return prev; }); - setDisplayStreams(forDisplay); - }, [streamValues]); + // if (e.checked) { + // // profilactor(); + // setStreamValues( + // (prev) => + // prev && { + // ...prev, + // stream: [...prev.stream, forSentStreams] + // } + // ); + // // const x = {streamTitle} + // } else { + // setStreamValues( + // (prev) => + // prev && { + // ...prev, + // stream: [...prev.stream.filter((item) => item?.stream_id !== id)] + // } + // ); + // } + }; + + // useEffect(() => { + // console.log('отправляемый поток ', streamValues); + // // const forDisplay = streamValues.stream.filter((item, idx) => { + // // // if (idx <= 2) { + // // return item; + // // // } + // // }); + + // // setDisplayStreams(forDisplay); + + // }, [streamValues]); + + useEffect(() => { + console.log('отправляемый поток ', pendingChanges); + setDisplayStreams(pendingChanges); // Или filter/map по вашему усмотрению + }, [pendingChanges]); useEffect(() => { - setStreamValues({ stream: [] }); + // setStreamValues({ stream: [] }); setDisplayStreams([]); toggleSkeleton(); if (courseValue?.id) { @@ -224,8 +260,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis const itemTemplate = (item: mainStreamsType, index: number) => { const bgClass = item.connect_id ? 'bg-[var(--greenBgColor)] border-b border-[gray]' : index % 2 == 1 ? 'bg-[#f5f5f5]' : ''; - console.log(item); - + return (
@@ -235,10 +270,30 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis { + // handleEdit(e.target, item.stream_id, item?.subject_name.name_kg); + // setStreams((prev) => prev.map((el) => (el.stream_id === item.stream_id ? { ...el, connect_id: el.connect_id ? null : 1 } : el))); + // }} + // vtoroy gde obratno ne ot + // checked={ + // // Проверяем, есть ли этот элемент в вашем массиве для отправки (streamValues). + // // Это отвечает за "включение" чекбокса для новых элементов. + // streamValues?.stream?.some((s) => s.stream_id === item.stream_id) || + // // ...ИЛИ если этот элемент уже пришёл с сервера (есть connect_id), НО + // // его НЕТ в вашем массиве для отправки, что означает, что вы его не "отжали". + // (Boolean(item.connect_id) && !streamValues?.stream?.some((s) => s.stream_id === item.stream_id)) + // } + // checked={ + // // Проверяем, есть ли объект в нашем буфере + // pendingChanges.some((s) => s.stream_id === item.stream_id) || + // // ...ИЛИ если его нет в буфере, проверяем, есть ли он на сервере + // (Boolean(item.connect_id) && !pendingChanges.some((s) => s.stream_id === item.stream_id)) + // } + checked={pendingChanges.some((s) => s.stream_id === item.stream_id)} onChange={(e) => { - handleEdit(e.target, item.stream_id, item?.subject_name.name_kg); - setStreams((prev) => prev.map((el) => (el.stream_id === item.stream_id ? { ...el, connect_id: el.connect_id ? null : 1 } : el))); + handleEdit(e.target, item); }} /> diff --git a/services/streams.tsx b/services/streams.tsx index fe0a1e54..b69037c4 100644 --- a/services/streams.tsx +++ b/services/streams.tsx @@ -17,6 +17,7 @@ export const fetchStreams = async (id: number | null) => { } }; +// export const connectStreams = async (value: {stream: streamsType[]}) => { export const connectStreams = async (value: {stream: streamsType[]}) => { console.log(value); From 6288b8713deeb370ebed30e68ad67e663012a40b Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 29 Aug 2025 17:12:45 +0600 Subject: [PATCH 130/286] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20?= =?UTF-8?q?=D0=BA=D1=83=D1=80=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[courseTheme]/[lessons]/page.tsx | 8 +- app/(main)/course/page.tsx | 21 +- .../[studentThemeId]/[lesson_id]/page.tsx | 6 +- app/components/PDFBook.tsx | 245 +++++++++--------- app/components/cards/LessonCard.tsx | 5 +- app/components/lessons/LessonTyping.tsx | 22 +- app/components/tables/StreamList.tsx | 17 +- app/globals.css | 11 + hooks/useShortText.tsx | 2 +- layout/AppMenu.tsx | 4 - layout/AppTopbar.tsx | 3 +- schemas/authSchema.tsx | 17 +- services/courses.tsx | 2 +- 13 files changed, 190 insertions(+), 173 deletions(-) diff --git a/app/(main)/course/[courseTheme]/[lessons]/page.tsx b/app/(main)/course/[courseTheme]/[lessons]/page.tsx index f87161c4..8c91fe8a 100644 --- a/app/(main)/course/[courseTheme]/[lessons]/page.tsx +++ b/app/(main)/course/[courseTheme]/[lessons]/page.tsx @@ -241,7 +241,7 @@ export default function Lesson() { {/* CKEDITOR */} ) : ( <> -
+
- displayInfo(value)} /> + displayInfo(value)} toggleIndex={()=> setActiveIndex(0)}/>
@@ -726,7 +737,7 @@ export default function Course() {
{/* STREAMS SECTION */}
- displayInfo(value)} /> + displayInfo(value)} toggleIndex={()=> {}}/>
)} diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx index a97c4d0f..5cece8c4 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx @@ -244,7 +244,7 @@ export default function StudentLessons() { {/* DOC */} ([]); const [skeleton, setSkeleton] = useState(false); + const [hasPdf, setHasPdf] = useState(false); const containerRef = useRef(null); const [bookSize, setBookSize] = useState({ width: 0, height: 0, aspectRatio: 0 }); const FIXED_BOOK_HEIGHT = 800; // Фиксированная высота книги - const media = useMediaQuery('(max-width: 640px)'); useEffect(() => { @@ -52,6 +56,11 @@ export default function PDFViewer({ url }: { url: string }) { if (!context) { // в последний раз добавил эту строку если что + setHasPdf(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Документти жүктөө же көрсөтүү катасы' } + }); throw new Error('Canvas context is not supported.'); } @@ -75,16 +84,24 @@ export default function PDFViewer({ url }: { url: string }) { // Обновляем состояние с данными только после успешной загрузки setPages(tempPages); - if (containerRef.current) { // в последний раз добавил эту проверку если что + if (containerRef.current) { + // в последний раз добавил эту проверку если что setBookSize({ width: containerRef.current.offsetWidth, height: FIXED_BOOK_HEIGHT, aspectRatio: aspectRatio }); + setHasPdf(false); } setSkeleton(false); } catch (error) { console.error('Ошибка при загрузке или рендеринге PDF:', error); + setHasPdf(true); + setSkeleton(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Документти жүктөө же көрсөтүү катасы' } + }); } finally { setSkeleton(false); } @@ -102,37 +119,13 @@ export default function PDFViewer({ url }: { url: string }) { setBookSize({ width, height, aspectRatio: width / height }); } }; - - // Вызываем сразу после монтирования updateBookSize(); - window.addEventListener('resize', updateBookSize); return () => window.removeEventListener('resize', updateBookSize); }, [bookSize.aspectRatio]); - // useEffect(() => { - // const updateBookSize = () => { - // if (containerRef.current && bookSize.aspectRatio > 0) { - // const containerWidth = containerRef.current.offsetWidth; - // const bookHeight = containerWidth / bookSize.aspectRatio; // пропорциональная высота - - // setBookSize((prev) => ({ - // ...prev, - // width: containerWidth, - // height: bookHeight - // })); - // } - // }; - - // updateBookSize(); // сразу после монтирования - // window.addEventListener('resize', updateBookSize); - // return () => window.removeEventListener('resize', updateBookSize); - // }, [bookSize.aspectRatio]); - return ( - //
- {/* style={{ width: '100%', backgroundColor: 'red', maxWidth: 1000, margin: '0 auto', border: 'solid 1px' }} */} - {skeleton ? ( - - ) : // - // {pages.map((page, index) => ( - //
- //
- // {' '} - // {/* Добавляем класс для содержимого страницы */} - // {page} - //
- //
- // ))} - //
- media ? ( + {hasPdf ? ( + + ) : ( <> - {}} - onChangeOrientation={() => {}} - onChangeState={() => {}} - onInit={() => {}} - onUpdate={() => {}} - startPage={0} - drawShadow={true} - flippingTime={900} - showPageCorners={true} - disableFlipByClick={false} - > - {pages.map((page, index) => ( -
-
- {' '} - {/* Добавляем класс для содержимого страницы */} - {page} + {skeleton ? ( +
+ +
+ ) : media ? ( + <> + {}} + onChangeOrientation={() => {}} + onChangeState={() => {}} + onInit={() => {}} + onUpdate={() => {}} + startPage={0} + drawShadow={true} + flippingTime={900} + showPageCorners={true} + disableFlipByClick={false} + > + {pages.map((page, index) => ( +
+
+ {' '} + {/* Добавляем класс для содержимого страницы */} + {page} +
+
+ ))} +
+ + ) : ( + {}} + onChangeOrientation={() => {}} + onChangeState={() => {}} + onInit={() => {}} + onUpdate={() => {}} + startPage={0} + drawShadow={true} + flippingTime={900} + showPageCorners={true} + disableFlipByClick={false} + > + {pages.map((page, index) => ( +
+
+ {' '} + {/* Добавляем класс для содержимого страницы */} + {page} +
-
- ))} - + ))} + + )} - ) : ( - {}} - onChangeOrientation={() => {}} - onChangeState={() => {}} - onInit={() => {}} - onUpdate={() => {}} - startPage={0} - drawShadow={true} - flippingTime={900} - showPageCorners={true} - disableFlipByClick={false} - > - {pages.map((page, index) => ( -
-
- {' '} - {/* Добавляем класс для содержимого страницы */} - {page} -
-
- ))} -
)}
//
diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 7e7a679e..7d55c2fd 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -32,6 +32,7 @@ export default function LessonCard({ urlForDownload: string; }) { const shortTitle = useShortText(cardValue.title, 10); + const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 17); const [progressSpinner, setProgressSpinner] = useState(false); const toggleSpinner = () => { @@ -113,9 +114,9 @@ export default function LessonCard({
{/*
{!cardValue.photo && }
*/} -
{shortTitle}
+
{shortTitle}
{type.typeValue === 'link' && {cardValue?.url}} -
{cardValue?.desctiption && cardValue.desctiption}
+
{cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription}
{status === 'working' && type.typeValue !== 'video' && (
diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 7d4e6efe..b85f1c4e 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -22,6 +22,7 @@ import PDFViewer from '../PDFBook'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useRouter } from 'next/navigation'; import { ProgressSpinner } from 'primereact/progressspinner'; +import useShortText from '@/hooks/useShortText'; export default function LessonTyping({ mainType, courseId, lessonId }: { mainType: string; courseId: string | null; lessonId: string | null }) { // types @@ -103,7 +104,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const [visible, setVisisble] = useState(false); const [editingLesson, setEditingLesson] = useState(null); const [progressSpinner, setProgressSpinner] = useState(false); - + // functions const handleUpdate = () => { if (selectType === 'doc') { @@ -116,8 +117,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }; const selectedForEditing = (id: number, type: string) => { - console.log('Открытие окна... ', id, type); - setSelectId(id); setSelectType(type); editing(type, id); @@ -133,7 +132,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const lesson: editingType = type === 'doc' - ? { key: 'documents', file: 'document_path', url: '', link: '', video_type_id: 1 } + ? { key: 'documents', file: 'document', url: '', link: '', video_type_id: 1 } : type === 'url' ? { key: 'links', file: '', url: 'url', link: '', video_type_id: 1 } : type === 'video' @@ -149,7 +148,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp setEditingLesson({ title: arr.title, - description: arr?.description, + description: arr?.description, document: arr[lesson.file], url: arr[lesson.url], video_link: arr[lesson.link], @@ -271,7 +270,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp ) : ( documents.map((item: lessonType) => { - console.log(item.created_at); return <> { + console.log(documents); + },[documents]) + // update document const handleUpdateLesson = async () => { const token = getToken('access_token'); @@ -810,16 +812,14 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp return { name: item.title, status: item.is_link, id: item.id }; }); - setVideoSelect(forSelect); - console.log(forSelect); - + setVideoSelect(forSelect); setSelectedCity(forSelect[0]); } }, [videoTypes]); return (
- +
{selectType === 'doc' ? ( @@ -851,7 +851,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }} /> {errors.title?.message} - setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> ) : selectType === 'url' ? ( <> diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 676ded19..5387d0d1 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -12,7 +12,7 @@ import Link from 'next/link'; import { streamsType } from '@/types/streamType'; import { displayType } from '@/types/displayType'; -export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id: displayType[]) => void }) { +export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams, toggleIndex }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id: displayType[]) => void, toggleIndex: ()=> void }) { interface mainStreamsType { connect_id: number | null; stream_id: number; @@ -360,9 +360,6 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis icon="pi pi-link" onClick={() => { handleConnect(); - // setEditMode(false); - // clearValues(); - // setFormVisible(true); }} />
@@ -375,14 +372,24 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis ) : (
{isMobile && ( -
+
)} diff --git a/app/globals.css b/app/globals.css index 0879a4fb..122cec4b 100644 --- a/app/globals.css +++ b/app/globals.css @@ -567,4 +567,15 @@ h1, h2, h3, h4, h5, h6 { .p-fileupload-choose{ padding: 4px 5px; } +} + +/* menu item , sidebar */ +.p-menuitem-link, .p-menuitem-icon{ + font-size: 13px !important; +} + +@media screen and (max-width: 640px) { + .layout-menuitem-text{ + font-size: 13px !important; + } } \ No newline at end of file diff --git a/hooks/useShortText.tsx b/hooks/useShortText.tsx index c224d81b..2ee45c6d 100644 --- a/hooks/useShortText.tsx +++ b/hooks/useShortText.tsx @@ -21,7 +21,7 @@ export default function useShortText(text: string, textLength: number) { <> {isLength ? ( -
+
{resultText}
diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 64225a25..85d1f9d0 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -93,11 +93,7 @@ const AppMenu = () => { label: item.title, id: item.id, to: `/course/${clickedCourseId}/${item.id}`, - command: () => { - console.log('clicked theme', item.id); - } })); - console.log(newThemes); setCourseList((prev) => prev.map((course) => diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 04bb88ae..c2ab5c0b 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -39,7 +39,7 @@ const AppTopbar = forwardRef((props, ref) => { { label: '', template: ( -
+
{user?.last_name} {user?.name} @@ -51,6 +51,7 @@ const AppTopbar = forwardRef((props, ref) => { { label: 'Чыгуу', icon: 'pi pi-sign-out', + className: 'text-[12px]', items: [], command: () => { logout({ setUser, setGlobalLoading }); diff --git a/schemas/authSchema.tsx b/schemas/authSchema.tsx index 6d8159a5..28a7dc0b 100644 --- a/schemas/authSchema.tsx +++ b/schemas/authSchema.tsx @@ -8,15 +8,16 @@ export const schema = yup.object().shape({ /^[a-zA-Z0-9._%+-]+@oshsu\.kg$/, 'email "@oshsu.kg" форматында болуш керек' ) - .matches( - /^[a-zA-Z0-9._%+-]+@oshsu\.kg$/, // Стандартный формат email (только буквы, цифры, точки, подчеркивания и плюсы) - 'email "@oshsu.kg" форматында жана тыюу салынган символдор камтылбашы керек' - ), + // .matches( + // /^[a-zA-Z0-9._%+-]+@oshsu\.kg$/, // Стандартный формат email (только буквы, цифры, точки, подчеркивания и плюсы) + // 'email "@oshsu.kg" форматында жана тыюу салынган символдор камтылбашы керек' + // ) + , password: yup.string() .required('Сырсөз талап кылынат!') .max(20, 'Сырсөз эң көп дегенде 20 белгиден турушу керек') - .matches( - /^[^!@#$%^&*()_+={}[\]:;"'`<>,.?/\\|]*$/, - 'Сырсөздө тыюу салынган символдор камтылбашы керек' - ), + // .matches( + // /^[^!@#$%^&*()_+={}[\]:;"'`<>,.?/\\|]*$/, + // 'Сырсөздө тыюу салынган символдор камтылбашы керек' + // ), }); \ No newline at end of file diff --git a/services/courses.tsx b/services/courses.tsx index 12e7ad26..46fc15dc 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -281,7 +281,7 @@ export const updateLesson = async (type: string, token: string | null, course_id } else if(type === 'doc'){ url = `/v1/teacher/document/update?lesson_id=${lesson_id}&document_id=${contentId}&document=${value.file}`; formData.append('lesson_id', String(lesson_id)); - formData.append('document', value.file); + formData.append('document', value.file || ''); formData.append('document_id', String(contentId)); formData.append('title', String(value.title)); formData.append('description', String(value.description)); From 53add8334bc4fedb113149589acfcb4d1ab1582e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sat, 30 Aug 2025 10:41:12 +0600 Subject: [PATCH 131/286] =?UTF-8?q?=D0=92=D0=B8=D0=B4=D0=B5=D0=BE=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/VideoPlay.tsx | 29 +++++---- app/components/cards/LessonCard.tsx | 26 ++++---- app/components/lessons/LessonTyping.tsx | 84 ++++++++++++++++++------- app/globals.css | 5 +- services/courses.tsx | 2 +- types/lessonType.tsx | 1 + 6 files changed, 95 insertions(+), 52 deletions(-) diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index e38163d8..fb87d29f 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -1,21 +1,29 @@ 'use client'; -import { faPlay} from "@fortawesome/free-solid-svg-icons"; +import { faPlay } from '@fortawesome/free-solid-svg-icons'; -import Image from "next/image"; -import { useState } from "react"; +import Image from 'next/image'; +import { useState } from 'react'; import { Dialog } from 'primereact/dialog'; // import 'primereact/resources/themes/lara-light-blue/theme.css'; // или другая тема import 'primereact/resources/primereact.min.css'; import 'primeicons/primeicons.css'; -import MyFontAwesome from "./MyFontAwesome"; +import MyFontAwesome from './MyFontAwesome'; export default function VideoPlay() { const [videoCall, setVideoCall] = useState(false); return (
- {if (!videoCall) return; setVideoCall(false); }}> + { + if (!videoCall) return; + setVideoCall(false); + }} + >
+
+
{videoShow ? ( ) : ( @@ -670,7 +702,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp lessonDate={'xx-xx'} urlForPDF={() => ''} urlForDownload="" - /> + videoVisible={()=> handleVideoCall(String(item?.link))} + /> )) )} @@ -789,6 +822,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp if (mainType === 'doc') handleFetchDoc(); if (mainType === 'link') handleFetchLink(); if (mainType === 'video') { + console.log(video); + handleFetchVideo(); handleVideoType(); } @@ -812,7 +847,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp return { name: item.title, status: item.is_link, id: item.id }; }); - setVideoSelect(forSelect); + setVideoSelect(forSelect); setSelectedCity(forSelect[0]); } }, [videoTypes]); @@ -851,7 +886,12 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }} /> {errors.title?.message} - setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} + className="w-full" + /> ) : selectType === 'url' ? ( <> diff --git a/app/globals.css b/app/globals.css index 122cec4b..d23f6aac 100644 --- a/app/globals.css +++ b/app/globals.css @@ -539,8 +539,9 @@ h1, h2, h3, h4, h5, h6 { -moz-border-radius: 0px 0px 200px 200px; } -.udalismelo{ - background-color: #cde7e3; +.lesson-card-border { + border: solid 2px rgb(224, 224, 224); + } .poka{ diff --git a/services/courses.tsx b/services/courses.tsx index 46fc15dc..12e7ad26 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -281,7 +281,7 @@ export const updateLesson = async (type: string, token: string | null, course_id } else if(type === 'doc'){ url = `/v1/teacher/document/update?lesson_id=${lesson_id}&document_id=${contentId}&document=${value.file}`; formData.append('lesson_id', String(lesson_id)); - formData.append('document', value.file || ''); + formData.append('document', value.file); formData.append('document_id', String(contentId)); formData.append('title', String(value.title)); formData.append('description', String(value.description)); diff --git a/types/lessonType.tsx b/types/lessonType.tsx index 1ed6e5dd..514cc476 100644 --- a/types/lessonType.tsx +++ b/types/lessonType.tsx @@ -12,4 +12,5 @@ export interface lessonType { document_path?: string; url?: string; photo?: string; + link?:string; } From 9a26320cf8cf2c98696d4dda7202a0702557a5d7 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sat, 30 Aug 2025 11:07:36 +0600 Subject: [PATCH 132/286] =?UTF-8?q?=D0=92=D0=B8=D0=B4=D0=B5=D0=BE=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D0=B5=20=D1=81=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=BA=D0=B8=20=D1=8E=D1=82=D1=83=D0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonTyping.tsx | 39 +++++++++++++++++++++---- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index ca66dbca..a6d53a8a 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -579,10 +579,37 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }; const handleVideoCall = (value: string | null) => { - console.log('value', value); - setVideoLink(typeof value === 'string' ? value : ''); + if (!value) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + } + + const url = new URL(typeof value === 'string' ? value : ''); + let videoId = null; + + if (url.hostname === 'youtu.be') { + // короткая ссылка, видео ID — в пути + videoId = url.pathname.slice(1); // убираем первый слеш + } else if (url.hostname === 'www.youtube.com' || url.hostname === 'youtube.com') { + // стандартная ссылка, видео ID в параметре v + videoId = url.searchParams.get('v'); + } + + if (!videoId) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + return null; // не удалось получить ID + } + // return `https://www.youtube.com/embed/${videoId}`; + + console.log('value', videoId); + setVideoLink(`https://www.youtube.com/embed/${videoId}`); setVideoCall(true); - } + }; const videoSection = () => { return ( @@ -702,8 +729,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp lessonDate={'xx-xx'} urlForPDF={() => ''} urlForDownload="" - videoVisible={()=> handleVideoCall(String(item?.link))} - /> + videoVisible={() => handleVideoCall(String(item?.link))} + /> )) )} @@ -823,7 +850,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp if (mainType === 'link') handleFetchLink(); if (mainType === 'video') { console.log(video); - + handleFetchVideo(); handleVideoType(); } From 33877ad95665023c349ef0a931acec24f6c915ca Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sat, 30 Aug 2025 12:53:13 +0600 Subject: [PATCH 133/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2,=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=BD=D0=BF=D1=83=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 5 +- app/components/lessons/LessonTyping.tsx | 70 ++++++++++++++++++++----- app/components/popUp/Redacting.tsx | 2 +- app/components/tables/StreamList.tsx | 5 +- app/globals.css | 15 +++++- types/fileuploadPreview.tsx | 3 ++ 6 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 types/fileuploadPreview.tsx diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 41f8dd1f..fe352508 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -30,13 +30,10 @@ import { ProgressSpinner } from 'primereact/progressspinner'; import { RadioButton } from 'primereact/radiobutton'; import { DataView } from 'primereact/dataview'; import { displayType } from '@/types/displayType'; +import { FileWithPreview } from '@/types/fileuploadPreview'; export default function Course() { const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); - interface FileWithPreview extends File { - objectURL?: string; - } - const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); const [courseValue, setCourseValue] = useState({ title: '', description: '', video_url: '', image: '' }); diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index a6d53a8a..128b92ca 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -2,7 +2,7 @@ import { LayoutContext } from '@/layout/context/layoutcontext'; import { Button } from 'primereact/button'; -import { FileUpload } from 'primereact/fileupload'; +import { FileUpload, FileUploadSelectEvent } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; import React, { useContext, useEffect, useRef, useState } from 'react'; import LessonCard from '../cards/LessonCard'; @@ -24,6 +24,7 @@ import { useRouter } from 'next/navigation'; import { ProgressSpinner } from 'primereact/progressspinner'; import useShortText from '@/hooks/useShortText'; import { Dialog } from 'primereact/dialog'; +import { FileWithPreview } from '@/types/fileuploadPreview'; export default function LessonTyping({ mainType, courseId, lessonId }: { mainType: string; courseId: string | null; lessonId: string | null }) { // types @@ -98,6 +99,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp video_link: '' }); const [videoShow, setVideoShow] = useState(false); + const [imageState, setImageState] = useState(null); // auxiliary const showError = useErrorMessage(); @@ -107,6 +109,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const [visible, setVisisble] = useState(false); const [editingLesson, setEditingLesson] = useState(null); const [progressSpinner, setProgressSpinner] = useState(false); + const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); // functions const handleUpdate = () => { @@ -164,6 +167,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const fileUploadRef = useRef(null); const clearFile = () => { fileUploadRef.current?.clear(); + setImageState(null); if (visible) { setEditingLesson( (prev) => @@ -257,11 +261,16 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }} /> {errors.title?.message} + {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} - setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> -
+
{/*
@@ -433,12 +442,20 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }} /> {errors.title?.message} - - setLinksValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> -
-
-
@@ -611,6 +628,12 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp setVideoCall(true); }; + const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { + if (e.files.length > 0) { + setImageState(e.files[0].objectURL); + } + }; + const videoSection = () => { return (
@@ -675,10 +698,29 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp }} /> {errors.title?.message} - - setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> -
-
+ {additional.video && ( +
+ setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> +
+
+ + {imageState &&
+
+ {imageState ? : } +
+
+
+ )} + +
+ {/*
diff --git a/app/components/popUp/Redacting.tsx b/app/components/popUp/Redacting.tsx index 20acd346..39988e4f 100644 --- a/app/components/popUp/Redacting.tsx +++ b/app/components/popUp/Redacting.tsx @@ -8,7 +8,7 @@ export default function Redacting({ redactor, textSize }: {redactor: MenuItem[], return (
- menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> + menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> {item?.teacher?.name} */}
- Үйрөтүлүү тили: + Окутуу тили: {item?.language?.name}
@@ -315,7 +316,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis
Период: - {item?.id_period} + {item?.period.name_kg}
diff --git a/app/globals.css b/app/globals.css index d23f6aac..a7321de2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -4,8 +4,10 @@ :root { --bodyFonts: "Jost", sans-serif; --mainColor: #08A9E6; - /* --mainBgColor: #e6eef1; */ - --mainBgColor: #fff; + --mainBorder: #83d6f4; + --mainBgColor: #e6eef1; + /* --mainBgColor: #fff; */ + --redColor: #EC272F; --redBgColor: #EC272F1A; --greenColor: rgb(46, 192, 46); @@ -579,4 +581,13 @@ h1, h2, h3, h4, h5, h6 { .layout-menuitem-text{ font-size: 13px !important; } +} + +/* input */ + +@media screen and (max-width: 640px) { + .p-inputtext{ + font-size: 14px !important; + padding: 8px; + } } \ No newline at end of file diff --git a/types/fileuploadPreview.tsx b/types/fileuploadPreview.tsx new file mode 100644 index 00000000..f1b5d78c --- /dev/null +++ b/types/fileuploadPreview.tsx @@ -0,0 +1,3 @@ +export interface FileWithPreview extends File { + objectURL?: string; +} From 0f15eca0d3c2c112ff458bbe4e235fe87e6e76ac Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Sat, 30 Aug 2025 16:39:12 +0600 Subject: [PATCH 134/286] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[studentThemeId]/[lesson_id]/page.tsx | 5 ++++- app/(student)/teaching/page.tsx | 5 ++++- app/components/cards/ItemCard.tsx | 17 +++++++++-------- app/components/tables/StreamList.tsx | 2 +- layout/AppMenu.tsx | 4 ++-- services/streams.tsx | 2 +- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx index 5cece8c4..6a301832 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx @@ -19,6 +19,9 @@ import { useContext, useEffect, useState } from 'react'; export default function StudentLessons() { const { lesson_id } = useParams(); + const params = useParams(); + console.log(params); + const router = useRouter(); const [activeIndex, setActiveIndex] = useState(0); @@ -119,7 +122,7 @@ export default function StudentLessons() { const navigateMainLesson = async (id: number | null) => { setSkeleton(true); - router.push(`/teaching/lesson/${id}`); + router.push(`/teaching/lesson/${lesson_id}/${id}`); }; const handleTabChange = (e: TabViewChange) => { diff --git a/app/(student)/teaching/page.tsx b/app/(student)/teaching/page.tsx index 3cffc3d0..6dfa66af 100644 --- a/app/(student)/teaching/page.tsx +++ b/app/(student)/teaching/page.tsx @@ -47,6 +47,7 @@ export default function Teaching() { toggleSkeleton(); if (data) { // валидность проверить + console.log(data); setLessons(data); setHasLessons(false); } else { @@ -104,7 +105,9 @@ export default function Teaching() { const selected = lessons[selectedSort.code]; displayData = selected && selected.semester ? [selected] : []; } - + console.log('streams', displayData); + console.log('connection', connection); + // превращаем в jsx const x = displayData.map((semester: any, sIdx: number) => (
diff --git a/app/components/cards/ItemCard.tsx b/app/components/cards/ItemCard.tsx index ecb2a13a..2bd46194 100644 --- a/app/components/cards/ItemCard.tsx +++ b/app/components/cards/ItemCard.tsx @@ -12,15 +12,14 @@ export default function ItemCard({ streams: { id: number; teacher?: { name: string; last_name?: string }; subject_type_name?: { name_kg: string; short_name_kg: string } }[]; connection: { id: number; course_id: number; id_myedu_stream: number }[]; }) { - const [activeStreamIdx, setActiveStreamIdx] = useState(null); + const [activeStreamIds, setActiveStreamIds] = useState([]); const matchedIdx = streams.findIndex((stream) => connection.some((item) => item.id_myedu_stream === stream.id)); useEffect(() => { - if (matchedIdx !== -1) { - setActiveStreamIdx(matchedIdx); - } - }, [streams, connection]); + const matchedIds = streams.filter((stream) => connection.some((item) => item.id_myedu_stream === stream.id)).map((stream) => stream.id); + setActiveStreamIds(matchedIds); + }, [streams, connection]); return (
@@ -29,12 +28,12 @@ export default function ItemCard({
{streams.map((stream, idx) => { - const isActive = idx === activeStreamIdx; + const isActive = activeStreamIds.includes(stream.id); return ( -
+
Окутуучу: -
+
{stream.teacher?.name} {stream.teacher?.last_name}
@@ -46,12 +45,14 @@ export default function ItemCard({
{connection.map((item) => { if (item.id_myedu_stream === stream.id) { + console.log('Здесь кнопка должна появиться:', item.id_myedu_stream + '=' + stream.id); return (
diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 97c5607e..c591ad10 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -151,7 +151,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis }; const handleConnect = async () => { - const data = await connectStreams({ stream: pendingChanges }); + const data = await connectStreams({course_id: courseValue?.id ? courseValue?.id : null, stream: pendingChanges }); // const data = await connectStreams(streamValues); if (data?.success) { diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 85d1f9d0..ce36299b 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -37,7 +37,7 @@ const AppMenu = () => { : user?.is_student ? [ { label: 'Окуу планы', icon: 'pi pi-fw pi-calendar-clock', to: '/teaching' }, - pathname.startsWith('/teaching/') ? { label: 'Темалар', icon: 'pi pi-fw pi-calendar-lessons', items: themesStudentList?.length > 0 ? themesStudentList : [] } : { label: '' } + pathname.startsWith('/teaching/') ? { label: 'Темалар', icon: 'pi pi-fw pi-book', items: themesStudentList?.length > 0 ? themesStudentList : [] } : { label: '' } ] : []; @@ -114,7 +114,7 @@ const AppMenu = () => { forThemes.push({ label: item.title, id: item.id, - to: `/teaching/lesson/${item.id}` + to: `/teaching/lesson/${studentThemeCourse}/${item.id}` }) ); if (forThemes.length > 0) { diff --git a/services/streams.tsx b/services/streams.tsx index b69037c4..6d6de776 100644 --- a/services/streams.tsx +++ b/services/streams.tsx @@ -18,7 +18,7 @@ export const fetchStreams = async (id: number | null) => { }; // export const connectStreams = async (value: {stream: streamsType[]}) => { -export const connectStreams = async (value: {stream: streamsType[]}) => { +export const connectStreams = async (value: {course_id: number | null, stream: streamsType[]}) => { console.log(value); // const formData = new FormData(); From 45ae7e7e3c75389f4fd042390c93bb25fc58f513 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 1 Sep 2025 14:47:36 +0600 Subject: [PATCH 135/286] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=20=D0=BA=20=D0=B2=D0=B8=D0=B4=D0=B5=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 62 ++++-- .../[studentThemeId]/[lesson_id]/page.tsx | 203 +++++++++++++++--- .../[studentThemeId]/page.tsx | 71 ++++-- app/(student)/teaching/page.tsx | 8 +- app/components/SessionManager.tsx | 4 +- app/components/cards/ItemCard.tsx | 2 +- app/components/cards/LessonCard.tsx | 9 +- app/components/lessons/LessonTyping.tsx | 22 +- app/components/tables/StreamList.tsx | 1 - hooks/useShortText.tsx | 2 +- layout/AppMenu.tsx | 4 +- layout/AppTopbar.tsx | 9 +- layout/context/layoutcontext.tsx | 31 ++- services/courses.tsx | 8 +- services/studentLessons.tsx | 15 ++ types/layout.d.ts | 3 + types/lessonStateType.tsx | 1 + types/lessonType.tsx | 2 +- utils/axiosInstance.tsx | 4 +- 19 files changed, 368 insertions(+), 93 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index fe352508..d9c7dc6c 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -51,6 +51,7 @@ export default function Course() { const [activeIndex, setActiveIndex] = useState(0); const [imageState, setImageState] = useState(null); const [displayStrem, setDisplayStreams] = useState([]); + const [visible, setVisisble] = useState(false); const [editingLesson, setEditingLesson] = useState({ title: '', @@ -125,6 +126,27 @@ export default function Course() { }, 1000); }; + const fileUploadRef = useRef(null); + const clearFile = () => { + fileUploadRef.current?.clear(); + setImageState(null); + if (editMode) { + setEditingLesson( + (prev) => + prev && { + ...prev, + image: '' + } + ); + // query + } else { + setCourseValue((prev) => ({ + ...prev, + image: '' + })); + } + }; + const handleFetchCourse = async (page = 1) => { const data = await fetchCourses(page, 0); toggleSkeleton(); @@ -299,7 +321,6 @@ export default function Course() { }; const displayInfo = (value: displayType[]) => { - console.log('info ', value); setDisplayStreams(value); }; @@ -339,6 +360,8 @@ export default function Course() { const data = await fetchCourseInfo(selectedCourse); if (data?.success) { + console.log('udali', data); + setProgressSpinner(false); setEditingLesson({ title: data.course.title || '', @@ -415,8 +438,8 @@ export default function Course() { ); }; - const imagestateStyle = imageState ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; - const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 30); + const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; + const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); return (
@@ -424,14 +447,18 @@ export default function Course() {
- {imagestateStyle && ( + {/* {imagestateStyle && ( */}
- {typeof imageState === 'string' && } + {/* {typeof imageState === 'string' && } */} + {typeof imageState === 'string' ? + + : + }
- )} + {/* )} */}
- + {courseValue.image || editingLesson.image ? (
{typeof editingLesson.image === 'string' && ( @@ -443,6 +470,7 @@ export default function Course() { ) : ( jpeg, png, jpg )} +
{(editingLesson.image || imageState) &&
{/*
*/} @@ -530,9 +558,11 @@ export default function Course() {
- Тандалган курстун аталышы: {forStreamId?.title} + + Тандалган курстун аталышы: {forStreamId?.title} +
-
+
{displayStrem?.length < 1 && Курска байлоо үчүн агымдарды тандаңыз} @@ -547,7 +577,7 @@ export default function Course() { // {displayStrem.length >= 3 && '...'} })}
-
+
)}
@@ -593,8 +623,8 @@ export default function Course() {
{/* STREAMS SECTION */}
- displayInfo(value)} toggleIndex={()=> {}}/> + displayInfo(value)} toggleIndex={() => {}} />
)} diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx index 6a301832..bbd10872 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx @@ -3,31 +3,34 @@ import LessonCard from '@/app/components/cards/LessonCard'; import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; +import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import useShortText from '@/hooks/useShortText'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { fetchDocuments, fetchLinks } from '@/services/studentLessons'; +import { fetchDocuments, fetchLinks, fetchVideo } from '@/services/studentLessons'; import { fetchMainLesson } from '@/services/studentMain'; import { lessonType } from '@/types/lessonType'; import { TabViewChange } from '@/types/tabViewChange'; -import { useParams, useRouter } from 'next/navigation'; +import { useParams, usePathname, useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; +import { Dialog } from 'primereact/dialog'; import { ProgressBar } from 'primereact/progressbar'; import { TabPanel, TabView } from 'primereact/tabview'; import { useContext, useEffect, useState } from 'react'; export default function StudentLessons() { - const { lesson_id } = useParams(); + const { lesson_id, studentThemeId } = useParams(); const params = useParams(); - console.log(params); - const router = useRouter(); const [activeIndex, setActiveIndex] = useState(0); - const [mainLesson, setMainLesson] = useState<{title: string}>({title: ''}); + const [mainLesson, setMainLesson] = useState<{ title: string }>({ title: '' }); const [hasLessons, setHasLessons] = useState(false); const [skeleton, setSkeleton] = useState(false); + const x = localStorage.getItem('currentBreadCrumb'); + const parseX = JSON.parse(x); + const [streamId, setStreamId] = useState(parseX.studentStream || ''); // doc const [documents, setDocuments] = useState([]); @@ -37,13 +40,49 @@ export default function StudentLessons() { const [link, setLink] = useState([]); const [linkShow, setLinkShow] = useState(false); - const [navigaion, setNavigation] = useState<{prev: number | null,next: number | null}>({ prev: null, next: null }); + // video + const [video, setVideo] = useState([]); + const [videoShow, setVideoShow] = useState(false); + const [videoCall, setVideoCall] = useState(false); + const [videoLink, setVideoLink] = useState(''); + const [navigaion, setNavigation] = useState<{ prev: number | null; next: number | null }>({ prev: null, next: null }); - const { setMessage, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); + const { setMessage, contextFetchStudentThemes, contextStudentThemes, crumbUrls } = useContext(LayoutContext); const showError = useErrorMessage(); + const teachingBreadCrumb = [ + { + id: 1, + url: '/', + title: '', + icon: true, + parent_id: null + }, + { + id: 2, + url: '/teaching', + title: 'Окуу план', + parent_id: 1 + }, + { + id: 3, + url: `/teaching/${studentThemeId}/${streamId && streamId}`, + title: 'Темалар', + parent_id: 2 + }, + { + id: 4, + url: '/teaching/lesson/:course_id/:lesson_id', + title: 'Сабактар', + parent_id: 3 + } + ]; + + const pathname = usePathname(); + const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); + const media = useMediaQuery('(max-width: 640px)'); - const titleShort = useShortText(mainLesson?.title, 25); + const titleShort = useShortText(mainLesson?.title, 35); const toggleSkeleton = () => { setSkeleton(true); @@ -52,9 +91,41 @@ export default function StudentLessons() { }, 1000); }; + const handleVideoCall = (value: string | null) => { + if (!value) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + } + + const url = new URL(typeof value === 'string' ? value : ''); + let videoId = null; + + if (url.hostname === 'youtu.be') { + // короткая ссылка, видео ID — в пути + videoId = url.pathname.slice(1); // убираем первый слеш + } else if (url.hostname === 'www.youtube.com' || url.hostname === 'youtube.com') { + // стандартная ссылка, видео ID в параметре v + videoId = url.searchParams.get('v'); + } + + if (!videoId) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + return null; // не удалось получить ID + } + // return `https://www.youtube.com/embed/${videoId}`; + + console.log('value', videoId); + setVideoLink(`https://www.youtube.com/embed/${videoId}`); + setVideoCall(true); + }; + const handleMainLesson = async () => { const data = await fetchMainLesson(lesson_id ? Number(lesson_id) : null); - console.log(data); if (data && data?.id) { if (data.next_id) { setNavigation((prev) => ({ ...prev, next: data.next_id })); @@ -120,6 +191,27 @@ export default function StudentLessons() { } }; + // fetch link + const handleFetchVideo = async () => { + const data = await fetchVideo(lesson_id ? Number(lesson_id) : null); + setSkeleton(true); + if (data && Array.isArray(data)) { + setVideo(data); + setVideoShow(false); + setSkeleton(false); + } else { + setSkeleton(false); + setVideoShow(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Проблема с соединением. Повторите заново' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + const navigateMainLesson = async (id: number | null) => { setSkeleton(true); router.push(`/teaching/lesson/${lesson_id}/${id}`); @@ -130,23 +222,35 @@ export default function StudentLessons() { handleFetchDoc(); } else if (e.index === 1) { handleFetchLink(); + } else if (e.index === 2) { + handleFetchVideo(); } setActiveIndex(e.index); }; + useEffect(() => { + const x = localStorage.getItem('currentBreadCrumb'); + const parseX = JSON.parse(x); + console.log('Eto x', parseX); + console.log('Eto x', x); + + setStreamId(parseX.studentStream); + }, [pathname]); + useEffect(() => { handleMainLesson(); handleFetchDoc(); }, []); useEffect(() => { - console.log('Навигация ', navigaion); - }, [navigaion]); + console.log('streamId ', streamId); + }, [streamId]); useEffect(() => { link.length < 1 ? setLinkShow(true) : setLinkShow(false); documents.length < 1 ? setDocShow(true) : setDocShow(false); - }, [link, documents]); + video.length < 1 ? setVideoShow(true) : setVideoShow(false); + }, [link, documents, video]); // doc section const sentToPDF = (url: string) => { @@ -159,7 +263,7 @@ export default function StudentLessons() {
{docShow ? ( - + ) : ( documents.map((item: lessonType) => ( <> @@ -188,8 +292,8 @@ export default function StudentLessons() {
- {docShow ? ( - + {linkShow ? ( + ) : ( link.map((item: lessonType) => ( <> @@ -197,7 +301,7 @@ export default function StudentLessons() { status="student" // onSelected={(id: number, type: string) => selectedForEditing(id, type)} // onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: item?.title, id: item.id, type: 'doc', url: item?.url && item.url }} + cardValue={{ title: item?.title, id: item.id, type: 'link', url: item?.url && item.url }} cardBg={'#ddc4f51a'} type={{ typeValue: 'link', icon: 'pi pi-file' }} typeColor={'var(--mainColor)'} @@ -213,17 +317,69 @@ export default function StudentLessons() {
); + // video section + const videoSecion = ( +
+
+
+ { + if (!videoCall) return; + setVideoCall(false); + }} + > +
+ +
+
+ {videoShow ? ( + + ) : ( + video.map((item: lessonType) => ( + <> + selectedForEditing(id, type)} + // onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: item?.title, id: item.id, type: 'video', url: item?.url && item.url, photo: item?.cover_url }} + cardBg={'#fff'} + type={{ typeValue: 'video', icon: 'pi pi-video' }} + typeColor={'var(--mainColor)'} + lessonDate={'xx-xx'} + urlForPDF={() => {}} + urlForDownload={item?.document_path || ''} + videoVisible={() => handleVideoCall(String(item?.link))} + /> + + )) + )} +
+
+
+ ); + return (
{/* info section */} {skeleton ? ( ) : ( -
+

{titleShort}

-
Home/theme
+
{breadcrumb}
)} @@ -274,14 +430,7 @@ export default function StudentLessons() { header="Видео" className="p-tabview p-tabview-nav p-tabview-selected p-tabview-panels p-tabview-panel" > - {/* {contentShow && } */} - {/* && ( -
-
- -
-
- ) */} + {skeleton ? : videoSecion}
diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/page.tsx index fe3347db..a6c0a59b 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/page.tsx @@ -2,31 +2,55 @@ import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; +import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import useShortText from '@/hooks/useShortText'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { itemsCourseInfo } from '@/services/studentMain'; import Link from 'next/link'; -import { useParams } from 'next/navigation'; +import { useParams, usePathname } from 'next/navigation'; import { useContext, useEffect, useState } from 'react'; export default function StudentThemes() { - const [themes, setThemes] = useState<{image: string, description: string, title: string,}>({image: '', description: '', title: ''}); + const [themes, setThemes] = useState<{ image: string; description: string; title: string }>({ image: '', description: '', title: '' }); const [hasCourses, setHasCourses] = useState(false); const [skeleton, setSkeleton] = useState(false); const [themesStudentList, setThemesStudentList] = useState([]); const params = useParams(); - // console.log(params); const courseId = params.studentThemeCourse; const streamId = params.studentThemeId; + const teachingBreadCrumb = [ + { + id: 1, + url: '/', + title: '', + icon: true, + parent_id: null + }, + { + id: 2, + url: '/teaching', + title: 'Окуу план', + parent_id: 1 + }, + { + id: 3, + url: `/teaching/:course_id/:lesson_id`, + title: 'Темалар', + parent_id: 2 + } + ]; + + const pathname = usePathname(); + const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); - const { setMessage, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); + const { setMessage, contextFetchStudentThemes, contextStudentThemes, crumbUrls, contextAddCrumb } = useContext(LayoutContext); const showError = useErrorMessage(); const media = useMediaQuery('(max-width: 640px)'); - const titleShort = useShortText(themes?.title, 20); + const titleShort = useShortText(themes?.title, 35); const titleInfoClass = `${themes?.image ? 'items-center justify-between' : 'justify-center'}`; const titleImageClass = `${true ? 'md:w-1/3' : ''}`; @@ -38,6 +62,15 @@ export default function StudentThemes() { }, 1000); }; + useEffect(()=> { + const isTopicsChildPage = /^\/teaching\/[^/]+\/[^/]+$/.test(pathname); + console.log(streamId); + + if(isTopicsChildPage && streamId){ + contextAddCrumb({type: 'studentStream', crumbUrl: streamId }) + } + },[]) + const handleCourseInfo = async () => { const data = await itemsCourseInfo(courseId ? Number(courseId) : null, streamId ? Number(streamId) : null); @@ -58,7 +91,7 @@ export default function StudentThemes() { useEffect(() => { handleCourseInfo(); - if(courseId){ + if (courseId) { console.log(courseId); contextFetchStudentThemes(courseId); } @@ -78,20 +111,24 @@ export default function StudentThemes() { {skeleton ? ( ) : ( -
-
+
+
-

{titleShort}

+

+ {titleShort} +

{themes?.description}

-
Home/theme
-
- Фото -
+ {themes?.image && ( +
+ Фото +
+ )}
+
{breadcrumb}
)} @@ -104,15 +141,17 @@ export default function StudentThemes() { ) : (
- {themesStudentList?.map((item: {id: number, title: string}) => ( + {themesStudentList?.map((item: { id: number; title: string }) => (
- Сабактын аталышы: + Теманын аталышы:
- {item.title} + + {item.title} +
diff --git a/app/(student)/teaching/page.tsx b/app/(student)/teaching/page.tsx index 6dfa66af..fce8e21a 100644 --- a/app/(student)/teaching/page.tsx +++ b/app/(student)/teaching/page.tsx @@ -44,12 +44,15 @@ export default function Teaching() { // fetch lessons const handleFetchLessons = async () => { const data = await fetchItemsLessons(); - toggleSkeleton(); + setSkeleton(true) + console.log(data); + if (data) { // валидность проверить console.log(data); setLessons(data); setHasLessons(false); + setSkeleton(false) } else { setHasLessons(true); setMessage({ @@ -59,6 +62,7 @@ export default function Teaching() { if (data?.response?.status) { showError(data.response.status); } + setSkeleton(false); } }; @@ -126,6 +130,8 @@ export default function Teaching() { }, [lessons, selectedSort]); useEffect(() => { + console.log('kfjlsdj;'); + handleFetchLessons(); handleFetchConnectId(); }, []); diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 91eb9ead..baa126e3 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -69,7 +69,9 @@ const SessionManager = () => { }, []); useEffect(() => { - setGlobalLoading(true); + if(!pathname.startsWith('/teaching/lesson/')){ + setGlobalLoading(true); + } console.log('Переход в', pathname); const token = getToken('access_token'); diff --git a/app/components/cards/ItemCard.tsx b/app/components/cards/ItemCard.tsx index 2bd46194..0ff8b466 100644 --- a/app/components/cards/ItemCard.tsx +++ b/app/components/cards/ItemCard.tsx @@ -45,7 +45,7 @@ export default function ItemCard({
{connection.map((item) => { if (item.id_myedu_stream === stream.id) { - console.log('Здесь кнопка должна появиться:', item.id_myedu_stream + '=' + stream.id); + // console.log('Здесь кнопка должна появиться:', item.id_myedu_stream + '=' + stream.id); return (
+ )}
- )} - /> - + ); + })} +
)}
)} diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 1aa937c9..15471116 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -78,7 +78,7 @@ const AppMenu = () => { to: `/course/${clickedCourseId}`, items: [], // пока пусто command: () => { - contextFetchThemes(item.id); + contextFetchThemes(item.id); setClickedCourseId(item.id); } }) From 8d3566c95fbd2f5cd94e2ca8812726d890f09033 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 5 Sep 2025 09:16:37 +0600 Subject: [PATCH 139/286] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[course_id]/[lesson_id]/page.tsx | 304 +++++++++-- .../[studentThemeId]/[lesson_id]/page.tsx | 2 +- app/components/cards/LessonCard.tsx | 160 +++--- app/components/lessons/LessonDocument.tsx | 395 ++++++++++++++ app/components/lessons/LessonTyping.tsx | 4 - app/components/lessons/LessonVideo.tsx | 510 ++++++++++++++++++ app/globals.css | 26 + hooks/useBreadCrumbs.tsx | 3 +- schemas/lessonSchema.tsx | 3 +- services/courses.tsx | 2 +- services/query-tests.http | 17 +- services/steps.tsx | 221 ++++++++ styles/layout/_button.scss | 4 + styles/layout/layout.scss | 1 + styles/layout/steps.css | 11 + types/mainStepType.tsx | 10 + utils/axiosInstance.tsx | 6 +- 17 files changed, 1555 insertions(+), 124 deletions(-) create mode 100644 app/components/lessons/LessonDocument.tsx create mode 100644 app/components/lessons/LessonVideo.tsx create mode 100644 services/steps.tsx create mode 100644 styles/layout/steps.css create mode 100644 types/mainStepType.tsx diff --git a/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx b/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx index 8ffd5eff..915bc6c5 100644 --- a/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx @@ -1,14 +1,52 @@ 'use client'; +import LessonDocument from '@/app/components/lessons/LessonDocument'; +import LessonVideo from '@/app/components/lessons/LessonVideo'; +import PDFViewer from '@/app/components/PDFBook'; +import FormModal from '@/app/components/popUp/FormModal'; import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; +import { lessonSchema } from '@/schemas/lessonSchema'; import { fetchLessonShow } from '@/services/courses'; -import { useParams, usePathname } from 'next/navigation'; +import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; +import { lessonStateType } from '@/types/lessonStateType'; +import { mainStepsType } from '@/types/mainStepType'; +import { getConfirmOptions } from '@/utils/getConfirmOptions'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useParams, usePathname, useRouter } from 'next/navigation'; +import { BreadCrumb } from 'primereact/breadcrumb'; +import { Button } from 'primereact/button'; +import { confirmDialog } from 'primereact/confirmdialog'; +import { Dialog } from 'primereact/dialog'; +import { InputText } from 'primereact/inputtext'; import { useContext, useEffect, useState } from 'react'; +import { useForm } from 'react-hook-form'; export default function LessonStep() { + // types + interface editingType { + key: string; + file: string; + url: string; + link: string; + video_type_id?: number | null; + } + + interface videoType { + name: string; + status: boolean; + id: number; + } + + interface videoInsideType { + id: number; + is_link: boolean; + short_title: string; + title: string; + } + const { course_id, lesson_id } = useParams(); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); @@ -16,6 +54,13 @@ export default function LessonStep() { const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); + const [formVisible, setFormVisible] = useState(false); + const [types, setTypes] = useState<{ id: number; title: string; name: string; logo: string }[]>([]); + const [steps, setSteps] = useState([]); + const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); + const [selectedId, setSelectId] = useState(null); + const [hasSteps, setHasSteps] = useState(false); + const teachingBreadCrumb = [ { id: 1, @@ -30,35 +75,27 @@ export default function LessonStep() { title: 'Курстар', parent_id: 1 }, - { - id: 3, - url: `/course/${''}`, - title: 'Темалар', - parent_id: 2 - }, - { - id: 4, - url: '/course/:course_id/:lesson_id', - title: 'Сабактар', - parent_id: 3 - }, - { - id: 5, - url: '/students/:course_id/:stream_id', - title: 'Студенттер', - parent_id: 2 - } + // { + // id: 3, + // url: `/course/${''}`, + // title: 'Темалар', + // parent_id: 2 + // }, + // { + // id: 4, + // url: '/course/:course_id/:lesson_id', + // title: 'Сабактар', + // parent_id: 3 + // } ]; const pathname = usePathname(); const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); + + const clearValues = () => {}; const handleShow = async () => { - // skeleton = false - const data = await fetchLessonShow(lesson_id ? Number(lesson_id) : null); - console.log(data); - if (data?.lesson) { setLessonInfoState({ title: data.lesson.title, videos_count: data.lesson.videos_count, usefullinks_count: data.lesson.usefullinks_count, documents_count: data.lesson.documents_count }); } else { @@ -73,46 +110,219 @@ export default function LessonStep() { } }; + const handleFetchTypes = async () => { + const data = await fetchTypes(); + + if (data && Array.isArray(data)) { + setTypes(data); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + setFormVisible(true); + }; + + const handleFetchSteps = async () => { + const data = await fetchSteps(Number(lesson_id)); + + if (data.success) { + console.log(data.steps); + + if (data.steps.length < 1) { + setHasSteps(true); + } else { + setHasSteps(false); + setSteps(data.steps); + } + } else { + setHasSteps(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleAddLesson = async (lessonId: number, typeId: number) => { + const data = await addLesson({ lesson_id: lessonId, type_id: typeId }); + if (data.success) { + handleFetchSteps(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + setFormVisible(false); + }; + + const handleFetchElement = async (stepId: number) => { + const data = await fetchElement(Number(lesson_id), stepId); + if (data.success) { + setElement({ content: data.content, step: data.step }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleDeleteStep = async () => { + const data = await deleteStep(Number(lesson_id), Number(selectedId)); + console.log(data); + + if (data.success) { + handleFetchSteps(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + const lessonInfo = (
-
- +
-

{lessonInfoState?.title}

-
- - - - {/* Документтердин саны: {lessonInfoState?.documents_count} */} - - - - - - {/* Шилтемелердин саны: {lessonInfoState?.usefullinks_count} */} - - - - - - {/* Видеолордун саны: {lessonInfoState?.videos_count} */} - - -
+

{lessonInfoState?.title}

{breadcrumb}
); + const step = (icon: string, step: number) => ( +
{ + setSelectId(step); + handleFetchElement(step); + }} + > +
+ +
+
+ ); + + useEffect(() => { + if (Array.isArray(steps) && steps.length > 0) { + const firstStep = steps[0]?.id; + setSelectId(steps[0]?.id); + handleFetchElement(firstStep); + } + }, [steps]); + useEffect(() => { handleShow(); + handleFetchSteps(); + // handleAddLesson(lesson_id, ); }, []); + useEffect(() => { + console.log('element', element); + }, [element]); + return ( -
+
+ {/* modal sectoin */} + { + if (!formVisible) return; + setFormVisible(false); + clearValues(); + }} + // footer={footerContent} + > +
+ {types.map((item) => { + console.log(item); + const iconClass = item.name === 'link' ? 'pi pi-link' : item.name === 'video' ? 'pi pi-video' : item.name === 'document' ? 'pi pi-folder' : ''; + + return ( +
+
+ + handleAddLesson(Number(lesson_id), item.id)}> + {item.title} + +
+
+ ); + })} +
+
+ {/* info section */} {lessonInfo} + + {/* steps section */} +
+ {hasSteps ? ( +
+

Азырынча кадамдар жок

+
+
+ ) : ( +
+ {steps.map((item, idx) => { + return ( +
+ {step(item.type.logo, item.id)} +
+ ); + })} +
+ )} + +
+ + {/* {lessonDisplay} */} + {element?.step.type.name === 'document' && {}} />} + {element?.step.type.name === 'video' && {}} />}
); } diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx index bbd10872..9aac122b 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx @@ -265,7 +265,7 @@ export default function StudentLessons() { {docShow ? ( ) : ( - documents.map((item: lessonType) => ( + documents.map((item: lessonType) => ( <> void; onDelete?: (id: number) => void; - cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string }; + cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string; document?: string }; cardBg: string; type: { typeValue: string; icon: string }; typeColor: string; lessonDate: string; urlForPDF: () => void; urlForDownload: string; - videoVisible?: (id: string | null)=> void; + videoVisible?: (id: string | null) => void; }) { - const shortTitle = useShortText(cardValue.title, 20); - const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 17); + const shortTitle = useShortText(cardValue.title, 90); + const shortDoc = useShortText(cardValue?.document || '', 70); + const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 90); const shortUrl = useShortText(cardValue?.url ? cardValue?.url : '', 17); const [progressSpinner, setProgressSpinner] = useState(false); + // useEffect(()=> { + // console.log(cardValue.photo); + // },[cardValue]); + const media = useMediaQuery('(max-width: 640px)'); + const toggleSpinner = () => { setProgressSpinner(true); setInterval(() => { @@ -74,76 +82,102 @@ export default function LessonCard({
); - const videoPreviw = - type.typeValue === 'video' && ( -
-
-
videoVisible?.(type.typeValue)}> - {/* Волна */} - {/* */} + const videoPreviw = type.typeValue === 'video' && ( +
+
+
videoVisible?.(type.typeValue)}> + {/* Волна */} + {/* */} - {/* Иконка-кнопка */} -
- -
+ {/* Иконка-кнопка */} +
+
- Видео
- ) + Видео +
+ ); const btnLabel = type.typeValue === 'doc' && status === 'working' ? 'Көчүрүү' : type.typeValue === 'doc' && status === 'student' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; return ( -
- {status === 'working' && ( -
-
{status === 'working' && }
- {/* {cardHeader} */} -
- )} -
-
- {/*
{!cardValue.photo && }
*/} -
{shortTitle}
- {type.typeValue === 'link' && {shortUrl}} -
{cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription}
- {status === 'working' && type.typeValue !== 'video' && ( -
- - {lessonDate} -
- )} -
+
+
- {status === 'student' && type.typeValue === 'doc' ? ( -
-
-
- - {' '} -
+ + {/* video preview */} + {videoPreviw} + + {/* button */} + {( + <> + {status === 'student' && type.typeValue === 'doc' ? ( +
+
+
+ + {' '} +
+ ) : ( +
+ {btnLabel &&
+
+ )} +
+ )} + + )} +
); diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx new file mode 100644 index 00000000..be2c4627 --- /dev/null +++ b/app/components/lessons/LessonDocument.tsx @@ -0,0 +1,395 @@ +'use client'; + +import { lessonSchema } from '@/schemas/lessonSchema'; +import { EditableLesson } from '@/types/editableLesson'; +import { lessonStateType } from '@/types/lessonStateType'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useParams, useRouter } from 'next/navigation'; +import { Button } from 'primereact/button'; +import { FileUpload } from 'primereact/fileupload'; +import { InputText } from 'primereact/inputtext'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { NotFound } from '../NotFound'; +import { lessonType } from '@/types/lessonType'; +import LessonCard from '../cards/LessonCard'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { log } from 'node:console'; +import { getToken } from '@/utils/auth'; +import { addDocument, deleteDocument, fetchElement, updateDocument } from '@/services/steps'; +import { mainStepsType } from '@/types/mainStepType'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import FormModal from '../popUp/FormModal'; + +export default function LessonDocument({ element, content, fetchPropElement, deleteElement }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; deleteElement: (id: number) => void }) { + interface docValueType { + title: string; + description: string; + file: File | null; + document?: string; + } + + interface contentType { + course_id: number | null; + created_at: string; + description: string | null; + document: string; + id: number; + lesson_id: number; + status: true; + title: string; + updated_at: string; + user_id: number; + } + + const { course_id } = useParams(); + + const router = useRouter(); + const media = useMediaQuery('(max-width: 640px)'); + const fileUploadRef = useRef(null); + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + + const [editingLesson, setEditingLesson] = useState({ title: 'string', description: '', file: null }); + const [visible, setVisisble] = useState(false); + const [imageState, setImageState] = useState(null); + const [contentShow, setContentShow] = useState(false); + // doc + const [document, setDocuments] = useState(); + const [docValue, setDocValue] = useState({ + title: '', + description: '', + file: null + }); + const [docShow, setDocShow] = useState(false); + const [urlPDF, setUrlPDF] = useState(''); + const [PDFVisible, setPDFVisible] = useState(false); + + const [progressSpinner, setProgressSpinner] = useState(false); + const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); + const [selectType, setSelectType] = useState(''); + const [selectId, setSelectId] = useState(null); + + const clearFile = () => { + fileUploadRef.current?.clear(); + setAdditional((prev) => ({ ...prev, video: false })); + setImageState(null); + if (visible) { + setEditingLesson( + (prev) => + prev && { + ...prev, + file: null + } + ); + } else { + setDocValue((prev) => ({ + ...prev, + file: null + })); + } + }; + + const clearValues = () => { + clearFile(); + setDocValue({ title: '', description: '', file: null }); + setEditingLesson(null); + setSelectId(null); + setSelectType(''); + }; + + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 1000); + }; + + // validate + const { + setValue, + formState: { errors } + } = useForm({ + resolver: yupResolver(lessonSchema), + mode: 'onChange' + }); + + const documentView = ( + <> +
+ setPDFVisible(false)}> +
{/* */}
+
+ + ); + const selectedForEditing = (id: number, type: string) => { + setSelectType(type); + setSelectId(id); + setVisisble(true); + editing(); + }; + + const sentToPDF = (url: string) => { + setUrlPDF(url); + if (media) { + router.push(`/pdf/${url}`); + } else { + setPDFVisible(true); + } + }; + + const editing = async () => { + const data = await fetchElement(element.lesson_id, element.id); + if (data.success) { + // setElement({ content: data.content, step: data.step }); + setEditingLesson({title: data.content.title, file:null, document: data.content.document, description: data.content.description}) + console.log(data); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleAddDoc = async () => { + toggleSpinner(); + const data = await addDocument(docValue, element.lesson_id, element.type_id, element.id); + console.log(data); + + if (data.success) { + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при добавлении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + // delete document + const handleDeleteDoc = async (id: number) => { + console.log(id); + + // const token = getToken('access_token'); + const data = await deleteDocument(Number(document?.lesson_id), id); + if (data.success) { + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + // update document + const handleUpdateDoc = async () => { + const token = getToken('access_token'); + const data = await updateDocument(token, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.type.id, editingLesson); + console.log(data); + + if (data?.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + }); + } else { + setDocValue({ title: '', description: '', file: null }); + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const documentSection = () => { + return ( +
+ {PDFVisible ? ( + documentView + ) : contentShow ? ( +
+
+ {docShow ? ( + + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'doc', document: document.document }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'doc', icon: 'pi pi-doc' }} + typeColor={'var(--mainColor)'} + lessonDate={'xx-xx'} + urlForPDF={() => sentToPDF(document.document || '')} + urlForDownload="" + /> + ) + )} +
+
+ ) : ( +
+
+ {}} + accept="application/pdf" + onSelect={(e) => + setDocValue((prev) => ({ + ...prev, + file: e.files[0] + })) + } + /> +
+ + { + setDocValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + +
+ {/*
+
+
+ )} +
+ ); + }; + + useEffect(() => { + console.log('content', content); + if (content) { + setContentShow(true); + setDocuments(content); + } else { + setContentShow(false); + } + }, [content]); + + useEffect(() => { + console.log('edititing', editingLesson); + }, [editingLesson]); + + return ( +
+ { + handleUpdateDoc(); + }} + clearValues={clearValues} + visible={visible} + setVisible={setVisisble} + start={false} + > +
+
+ {selectType === 'doc' ? ( + <> +
+ {}} + accept="application/pdf" + onSelect={(e) => { + if (e.files[0]) setEditingLesson((prev) => prev && { ...prev, file: e.files[0] }); + }} + /> +
+ {/* {String(editingLesson?.file[0].objectURL)} */} + { + console.log(editingLesson); + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} + className="w-full" + /> + + ) : selectType === 'video' ? ( + <> + + ) : ( + '' + )} +
+
+
+ {documentSection()} +
+ ); +} diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index b6122a05..50af7542 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -641,10 +641,6 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp } }; - useEffect(() => { - console.log(imageState); - }, [imageState]); - const videoSection = () => { return (
diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx new file mode 100644 index 00000000..cc40f3e4 --- /dev/null +++ b/app/components/lessons/LessonVideo.tsx @@ -0,0 +1,510 @@ +'use client'; + +import { lessonSchema } from '@/schemas/lessonSchema'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useParams, useRouter } from 'next/navigation'; +import { Button } from 'primereact/button'; +import { FileUpload, FileUploadSelectEvent } from 'primereact/fileupload'; +import { InputText } from 'primereact/inputtext'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { NotFound } from '../NotFound'; +import LessonCard from '../cards/LessonCard'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { getToken } from '@/utils/auth'; +import { addDocument, addVideo, deleteDocument, deleteVideo, fetchElement, updateDocument, updateVideo } from '@/services/steps'; +import { mainStepsType } from '@/types/mainStepType'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import FormModal from '../popUp/FormModal'; +import { Dropdown } from 'primereact/dropdown'; +import { Dialog } from 'primereact/dialog'; +import { FileWithPreview } from '@/types/fileuploadPreview'; + +export default function LessonVideo({ element, content, fetchPropElement, deleteElement }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; deleteElement: (id: number) => void }) { + interface docValueType { + title: string; + description: string; + file: File | null; + document?: string; + } + + interface contentType { + course_id: number | null; + created_at: string; + description: string | null; + document: string; + id: number; + lesson_id: number; + status: true; + title: string; + updated_at: string; + user_id: number; + link: File | null; + cover: string; + cover_url: string; + } + + interface videoType { + name: string; + status: boolean; + id: number; + } + + interface videoInsideType { + id: number; + is_link: boolean; + short_title: string; + title: string; + } + + interface videoValueType { + title: string; + description?: string; + document?: File | null; + url?: string | null; + video_link: string; + video_type_id: number | null; + file?: File | null; + } + + const { course_id } = useParams(); + + const router = useRouter(); + const media = useMediaQuery('(max-width: 640px)'); + const fileUploadRef = useRef(null); + + // videos + const [video, setVideo] = useState(); + const [selectedCity, setSelectedCity] = useState({ name: '', status: true, id: 1 }); + const [videoSelect, setVideoSelect] = useState([]); + const [videoTypes, setVideoTypes] = useState([]); + const [videoCall, setVideoCall] = useState(false); + const [videoLink, setVideoLink] = useState(''); + const [videoValue, setVideoValue] = useState({ + title: '', + description: '', + file: null, + url: '', + video_link: '', + cover: null, + link: null + }); + const [videoShow, setVideoShow] = useState(false); + const [imageState, setImageState] = useState(null); + + // auxiliary + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + const [visible, setVisisble] = useState(false); + const [editingLesson, setEditingLesson] = useState(null); + const [progressSpinner, setProgressSpinner] = useState(false); + const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); + const [selectType, setSelectType] = useState(''); + const [selectId, setSelectId] = useState(null); + const [contentShow, setContentShow] = useState(false); + + const clearFile = () => { + fileUploadRef.current?.clear(); + setAdditional((prev) => ({ ...prev, video: false })); + setImageState(null); + setVideoValue((prev) => ({ + ...prev, + cover: null + })); + }; + + const clearValues = () => { + clearFile(); + setEditingLesson(null); + setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); + setSelectId(null); + setSelectType(''); + }; + + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 1000); + }; + + const handleVideoCall = (value: string | null) => { + console.log(value); + + if (!value) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + } + + const url = new URL(typeof value === 'string' ? value : ''); + let videoId = null; + + if (url.hostname === 'youtu.be') { + // короткая ссылка, видео ID — в пути + videoId = url.pathname.slice(1); // убираем первый слеш + } else if (url.hostname === 'www.youtube.com' || url.hostname === 'youtube.com') { + // стандартная ссылка, видео ID в параметре v + videoId = url.searchParams.get('v'); + } + + if (!videoId) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + }); + return null; // не удалось получить ID + } + // return `https://www.youtube.com/embed/${videoId}`; + setVideoLink(`https://www.youtube.com/embed/${videoId}`); + setVideoCall(true); + }; + + // validate + const { + setValue, + formState: { errors } + } = useForm({ + resolver: yupResolver(lessonSchema), + mode: 'onChange' + }); + + const toggleVideoType = (e: videoType) => { + setSelectedCity(e); + setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); + }; + + const selectedForEditing = (id: number, type: string) => { + console.log(id, type); + setSelectType(type); + setSelectId(id); + setVisisble(true); + editing(); + }; + + const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { + if (e.files.length > 0) { + setImageState(e.files[0].objectURL); + setVideoValue((prev) => ({ + ...prev, + cover: e.files[0] + })); + } + }; + + const editing = async () => { + const data = await fetchElement(element.lesson_id, element.id); + if (data.success) { + // setElement({ content: data.content, step: data.step }); + setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id , video_link: data.content.link, description: data.content.description, }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleAddVideo = async () => { + toggleSpinner(); + const data = await addVideo(videoValue, element.lesson_id, 1, element.type_id, element.id); + console.log(data); + + if (data.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при добавлении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + // delete video + const handleDeleteVideo = async (id: number) => { + const data = await deleteVideo(element.lesson_id, id); + console.log(data); + + if (data.success) { + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + // update document + const handleUpdateVideo = async () => { + const token = getToken('access_token'); + const data = await updateVideo(token, editingLesson, video?.lesson_id ? Number(video?.lesson_id) : null, Number(selectId), 1, element.type.id, element.type.id); + console.log(data); + + if (data?.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + }); + } else { + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const videoSection = () => { + return ( +
+ {!contentShow ? ( +
+
+ { + toggleVideoType(e.value); + }} + options={videoSelect} + optionLabel="name" + placeholder="Танданыз" + // style={{backgroundColor: 'var(--mainColor', color: 'white'}} + panelStyle={{ color: 'white' }} + className="w-[213px] sm:w-full md:w-14rem" + /> +
+ {selectedCity?.status ? ( +
+ { + setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
+ ) : ( +
+ {}} + accept="video/" + onSelect={(e) => + setVideoValue((prev) => ({ + ...prev, + file: e.files[0] + })) + } + /> +
+ )} +
+
+
+ { + setVideoValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + {additional.video && ( +
+ setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> +
+
+ + {imageState &&
+
+ {imageState ? : } +
+
+
+ )} + +
+ {/*
+
+
+
+ ) : ( +
+
+ { + if (!videoCall) return; + setVideoCall(false); + }} + > +
+ +
+
+ {videoShow ? ( + + ) : ( + video && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteVideo(id)} + cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} + cardBg={'white'} + type={{ typeValue: 'video', icon: 'pi pi-video' }} + typeColor={'var(--mainColor)'} + lessonDate={'xx-xx'} + urlForPDF={() => ''} + urlForDownload="" + videoVisible={() => handleVideoCall(String(video?.link))} + /> + ) + )} +
+
+ )} +
+ ); + }; + + useEffect(() => { + console.log('content', content); + if (content) { + setContentShow(true); + setVideo(content); + } else { + setContentShow(false); + } + }, [content]); + + useEffect(()=> { + console.log('video', video); + },[video]); + + useEffect(() => { + console.log('edititing', editingLesson); + }, [editingLesson]); + + return ( +
+ handleUpdateVideo()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}> +
+
+ { + <> + {/* {editingLesson?.video_type_id ? ( */} +
+ { + setEditingLesson((prev) => prev && { ...prev, video_link: e.target.value }); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
+ {/* ) : ( */} + <> + {/* {}} + accept="video/" + onSelect={(e) => + setEditingLesson( + (prev) => + prev && { + ...prev, + file: e.files[0] + } + ) + } + /> + {String(editingLesson?.video_link)} */} + + {/* )} */} + { + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> + + } +
+
+
+ {videoSection()} +
+ ); +} diff --git a/app/globals.css b/app/globals.css index a7321de2..d758e31e 100644 --- a/app/globals.css +++ b/app/globals.css @@ -590,4 +590,30 @@ h1, h2, h3, h4, h5, h6 { font-size: 14px !important; padding: 8px; } +} + +.step{ + background-color: rgb(209, 210, 208); + transition: .5s; +} +.step:hover{ + background-color: var(--greenColor); +} + +.activeStep{ + background-color: var(--greenColor); +} + +.animate-step { + animation: bacgroundAnimate 2s ease infinite; +} + +@keyframes bacgroundAnimate { + 0%{ + background-color: rgb(209, 210, 208); + } 50%{ + background-color: var(--greenColor); + } 100%{ + background-color: rgb(209, 210, 208); + } } \ No newline at end of file diff --git a/hooks/useBreadCrumbs.tsx b/hooks/useBreadCrumbs.tsx index 8011116d..78ae2408 100644 --- a/hooks/useBreadCrumbs.tsx +++ b/hooks/useBreadCrumbs.tsx @@ -20,7 +20,6 @@ export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], curre // 1. Находим текущую страницу по URL (с учётом динамики) const currentPage = data.find((item) => matchUrl(item.url, currentUrl)); - if (!currentPage) return []; const breadcrumbs = []; @@ -45,6 +44,8 @@ export default function useBreadCrumbs(insideBreadCrumb: breadCrumbType[], curre }; useEffect(() => { + console.log(insideBreadCrumb, currentUrl); + const forBreadcrumb = getBreadcrumbs(insideBreadCrumb, currentUrl); setBreadCrumb(forBreadcrumb); }, [pathname]); diff --git a/schemas/lessonSchema.tsx b/schemas/lessonSchema.tsx index 562bbecf..095fbdf0 100644 --- a/schemas/lessonSchema.tsx +++ b/schemas/lessonSchema.tsx @@ -9,5 +9,6 @@ export const lessonSchema = yup.object().shape({ .string() .required('Талап кылынат!') .matches(/^https?:\/\/.+/, 'Шилтеме "http://" "https://" форматында болуш керек'), - title: yup.string().required('Талап кылынат!').max(30, 'Аталыштын узундугу макс 30 тамга') + title: yup.string().required('Талап кылынат!') + // .max(50, 'Аталыштын узундугу макс 50 тамга') }); \ No newline at end of file diff --git a/services/courses.tsx b/services/courses.tsx index 54c172a2..f438662a 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -39,7 +39,7 @@ export const addCourse = async (value: CourseCreateType) => { } }; -export const deleteCourse = async (id: number) => { +export const deleteCourse = async (id: number) => { url = process.env.NEXT_PUBLIC_BASE_URL + `/v1/teacher/courses/delete?course_id=${id}`; try { diff --git a/services/query-tests.http b/services/query-tests.http index 4a310be7..7b6b28ce 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,4 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTY3MTY2MTEsImV4cCI6MTc1Njc0NTQ3MSwibmJmIjoxNzU2NzE2NjExLCJqdGkiOiJ3bkhsY0ZpQXJGVGo4a0QyIiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.dbla0J7wZzEwZh2NnVgI8uXeXNbPX3X5U5HP69Uq8LM +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTY5MDE3MTksImV4cCI6MTc1NjkzMDU3OSwibmJmIjoxNzU2OTAxNzE5LCJqdGkiOiJDMlRGa3hFT3RITERWWmVsIiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.DPG-hM-6ZB1Bed7J0XmYBCT216l45PMnKUzx6Zlv4MQ # ### @@ -15,12 +15,23 @@ # ### # test -GET https://api.mooc.oshsu.kg/public/api/v1/student/course/lesson/show?lesson_id=${lessonId}` +GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons/step?lesson_id=77 Authorization: Bearer {{token}} Content-Type: application/json { - "lesson_id": 57 + "lesson_id": 77 +} + +# test + +POST https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons/step?lesson_id=77&type_id=3 +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "lesson_id": 77, + "type_id":3 } diff --git a/services/steps.tsx b/services/steps.tsx new file mode 100644 index 00000000..98ebabf5 --- /dev/null +++ b/services/steps.tsx @@ -0,0 +1,221 @@ +import { CourseCreateType } from '@/types/courseCreateType'; +import { lessonStateType } from '@/types/lessonStateType'; +import axiosInstance from '@/utils/axiosInstance'; + +let url = ''; + +export const fetchTypes = async () => { + try { + const res = await axiosInstance.get(`/v1/teacher/courses/content/types`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchSteps = async (lesson_id: number) => { + try { + const res = await axiosInstance.get(`/v1/teacher/lessons/step?lesson_id=${lesson_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const addLesson = async (value: { lesson_id: number; type_id: number }) => { + const formData = new FormData(); + formData.append('lesson_id', String(value.lesson_id)); + formData.append('type_id', String(value.type_id)); + + try { + const res = await axiosInstance.post(`/v1/teacher/lessons/step`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +// fetch steps content + +export const fetchElement = async (lesson_id: number, step_id: number) => { + console.log(lesson_id, step_id); + + try { + const res = await axiosInstance.get(`/v1/teacher/lessons/step/content?lesson_id=${lesson_id}&step_id=${step_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const addDocument = async (value: { file: File | null; title: string; description: string }, lesson_id: number, type_id: number, step_id: number) => { + const formData = new FormData(); + formData.append('lesson_id', String(lesson_id)); + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + if (value.file) { + formData.append('document', value.file && value.file); + } + formData.append('title', String(value.title)); + formData.append('description', String(value?.description)); + + try { + const res = await axiosInstance.post(`/v1/teacher/document/store`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +export const deleteDocument = async (lesson_id: number, content_id: number) => { + console.log(lesson_id, content_id); + + try { + const res = await axiosInstance.delete(`/v1/teacher/document/delete?lesson_id=${lesson_id}&document_id=${content_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; + +export const updateDocument = async (token: string | null, lesson_id: number | null, contentId: number | null, type_id: number, step_id: number, value: any) => { + console.log(contentId, value); + let headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; + let formData = new FormData(); + let url = `/v1/teacher/document/update?lesson_id=${lesson_id}&document_id=${contentId}&document=${value.file}`; + + formData.append('lesson_id', String(lesson_id)); + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('document', value.file); + formData.append('document_id', String(contentId)); + formData.append('title', String(value.title)); + formData.append('description', String(value.description)); + + try { + const res = await axiosInstance.post(url, formData, { + headers + }); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при обновлении урока', err); + return err; + } +}; + +// video + +export const addVideo = async (value: { file: File | null; title: string; description: string; video_link: string; cover: string | null }, lesson_id: number, videoType: number, type_id: number, step_id: number) => { + const formData = new FormData(); + url = `v1/teacher/video/store?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${videoType}`; + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('video_link', String(value?.video_link)); + formData.append('title', String(value?.title)); + formData.append('description', String(value?.description)); + if (value.cover) { + formData.append('cover', value?.cover && value?.cover); + } + try { + const res = await axiosInstance.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +export const deleteVideo = async (lesson_id: number, content_id: number) => { + console.log(lesson_id, content_id); + + try { + const res = await axiosInstance.delete(`/v1/teacher/video/delete?lesson_id=${lesson_id}&video_id=${content_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; + +export const updateVideo = async ( + token: string | null, + value: { file: File | null; title: string; description: string; video_link: string; cover: string | null, video_type_id: number }, + lesson_id: number, + contentId: number, + videoType: number, + type_id: number, + step_id: number +) => { + let headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; + let formData = new FormData(); + url = `/v1/teacher/video/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${value.video_type_id}&video_id=${contentId}`; + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('video_link', value.video_link); + formData.append('video_type_id', String(value.video_type_id)); + formData.append('video_id', String(contentId)); + formData.append('title', String(value.title)); + formData.append('description', String(value.description)); + + try { + const res = await axiosInstance.post(url, formData, { + headers + }); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при обновлении урока', err); + return err; + } +}; + +export const deleteStep = async (lesson_id: number, step_id: number) => { + console.log(lesson_id, step_id); + + try { + const res = await axiosInstance.delete(`/v1/teacher/lessons/step/delete?lesson_id=${lesson_id}&step_id=${step_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; diff --git a/styles/layout/_button.scss b/styles/layout/_button.scss index 980c20d2..ae4b859c 100644 --- a/styles/layout/_button.scss +++ b/styles/layout/_button.scss @@ -61,6 +61,10 @@ button { } } +.p-button .mini-button { + padding: 5px 10px; +} + .reject-button { background-color: transparent; color: var(--bodyColor); diff --git a/styles/layout/layout.scss b/styles/layout/layout.scss index da7e8e94..7348af10 100644 --- a/styles/layout/layout.scss +++ b/styles/layout/layout.scss @@ -1,4 +1,5 @@ @import './_variables'; +@import "./steps.css"; @import "./_mixins"; @import "./_main"; @import "./_topbar"; diff --git a/styles/layout/steps.css b/styles/layout/steps.css new file mode 100644 index 00000000..fed44317 --- /dev/null +++ b/styles/layout/steps.css @@ -0,0 +1,11 @@ +.step-type-grid{ + display: grid; + grid-template-columns: 1fr 1fr; + gap: 6px; +} +@media screen and (max-width: 640px) { + .step-type-grid { + display: grid; + grid-template-columns: 1fr; + } +} diff --git a/types/mainStepType.tsx b/types/mainStepType.tsx new file mode 100644 index 00000000..bdf9a7d1 --- /dev/null +++ b/types/mainStepType.tsx @@ -0,0 +1,10 @@ +export interface mainStepsType { + id: number; + id_parent: number | null; + type_id: number; + user_id: number; + lesson_id: number; + step: number; + type: { active: true; created_at: string; id: 1; logo: string; modelName: string; name: string; title: string; updated_at: string }; + updated_at: string; +} diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index fe10a242..2aa919a3 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -37,9 +37,9 @@ axiosInstance.interceptors.response.use( if (status === 404) { console.warn('404 - Перенаправляю...'); - window.location.href = '/pages/notfound'; - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - localStorage.removeItem('userVisit'); + // window.location.href = '/pages/notfound'; + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // localStorage.removeItem('userVisit'); } return Promise.reject(error); From 3a7e7aa3a754616140f4ad73a9f9f37c26839bf9 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 8 Sep 2025 12:57:20 +0600 Subject: [PATCH 140/286] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D1=82=D0=B8=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=BE?= =?UTF-8?q?=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[courseTheme] => }/[lessons]/page.tsx | 0 app/(main)/course/[courseTheme]/page.tsx | 399 ----------------- .../[lesson_id]/page.tsx | 151 ++++--- app/(main)/course/page.tsx | 12 +- app/components/HomeClient.tsx | 2 +- app/components/SessionManager.tsx | 4 +- app/components/cards/LessonCard.tsx | 51 ++- app/components/lessons/LessonDocument.tsx | 19 +- app/components/lessons/LessonTest.tsx | 405 ++++++++++++++++++ app/components/lessons/LessonVideo.tsx | 74 +--- app/globals.css | 8 + layout/AppMenu.tsx | 249 +++++++++-- layout/AppMenuitem.tsx | 39 +- layout/context/layoutcontext.tsx | 3 + services/auth.tsx | 1 - services/courses.tsx | 2 + services/query-tests.http | 7 +- services/steps.tsx | 69 ++- styles/layout/_menu.scss | 4 +- types/layout.d.ts | 7 + utils/axiosInstance.tsx | 8 +- 21 files changed, 935 insertions(+), 579 deletions(-) rename app/(main)/{course/[courseTheme] => }/[lessons]/page.tsx (100%) delete mode 100644 app/(main)/course/[courseTheme]/page.tsx rename app/(main)/course/{[courseTheme]/lessonStep/[course_id] => [course_Id]}/[lesson_id]/page.tsx (71%) create mode 100644 app/components/lessons/LessonTest.tsx diff --git a/app/(main)/course/[courseTheme]/[lessons]/page.tsx b/app/(main)/[lessons]/page.tsx similarity index 100% rename from app/(main)/course/[courseTheme]/[lessons]/page.tsx rename to app/(main)/[lessons]/page.tsx diff --git a/app/(main)/course/[courseTheme]/page.tsx b/app/(main)/course/[courseTheme]/page.tsx deleted file mode 100644 index ba411c07..00000000 --- a/app/(main)/course/[courseTheme]/page.tsx +++ /dev/null @@ -1,399 +0,0 @@ -'use client'; - -import ConfirmModal from '@/app/components/popUp/ConfirmModal'; -import FormModal from '@/app/components/popUp/FormModal'; -import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; -import Link from 'next/link'; -import { Button } from 'primereact/button'; -import { Column } from 'primereact/column'; -import { DataTable } from 'primereact/datatable'; -import { InputText } from 'primereact/inputtext'; -import { LayoutContext } from '@/layout/context/layoutcontext'; -import React, { useContext, useEffect, useState } from 'react'; -import { useParams, usePathname } from 'next/navigation'; -import { addThemes, deleteTheme, fetchCourseInfo, fetchThemes, updateTheme } from '@/services/courses'; -import useErrorMessage from '@/hooks/useErrorMessage'; -import { CourseCreateType } from '@/types/courseCreateType'; -import { NotFound } from '@/app/components/NotFound'; -import Redacting from '@/app/components/popUp/Redacting'; -import { getRedactor } from '@/utils/getRedactor'; -import { getConfirmOptions } from '@/utils/getConfirmOptions'; -import { ProgressSpinner } from 'primereact/progressspinner'; -import useBreadCrumbs from '@/hooks/useBreadCrumbs'; -import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { DataView } from 'primereact/dataview'; - -export default function CourseTheme() { - const [hasThemes, setHasThemes] = useState(false); - const [themes, setThemes] = useState([]); - const [themeValue, setThemeValue] = useState({ title: '', description: '', video_url: '' }); - const [themeInfo, setThemeInfo] = useState(); - const [selectedCourse, setSelectedCourse] = useState<{ id: number | null }>({ id: null }); - const [formVisible, setFormVisible] = useState(false); - const [editMode, setEditMode] = useState(false); - const [forStart, setForStart] = useState(true); - const [skeleton, setSkeleton] = useState(false); - const [progressSpinner, setProgressSpinner] = useState(false); - const [editingThemes, setEditingThemes] = useState<{ title: string }>({ - title: '' - }); - - const { setMessage, contextFetchThemes } = useContext(LayoutContext); - - const { courseTheme } = useParams() as { courseTheme: string }; - - const teachingBreadCrumb = [ - { - id: 1, - url: '/', - title: '', - icon: true, - parent_id: null - }, - { - id: 2, - url: '/course', - title: 'Курстар', - parent_id: 1 - }, - { - id: 3, - url: `/course/:id`, - title: 'Темалар', - parent_id: 2 - }, - { - id: 4, - url: '/course/:course_id/:lesson_id', - title: 'Сабактар', - parent_id: 3 - }, - { - id: 5, - url: '/students/:course_id/:stream_id', - title: 'Студенттер', - parent_id: 2 - } - ]; - - const showError = useErrorMessage(); - const pathname = usePathname(); - const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); - const media = useMediaQuery('(max-width: 640px)'); - const tableMedia = useMediaQuery('(max-width: 577px)'); - - const toggleSkeleton = () => { - setSkeleton(true); - setTimeout(() => { - setSkeleton(false); - }, 1000); - }; - - const handleFetchThemes = async () => { - const data = await fetchThemes(Number(courseTheme)); - - toggleSkeleton(); - - contextFetchThemes(Number(courseTheme)); - if (data?.lessons) { - setHasThemes(false); - console.log(data.lessons); - - setThemes(data.lessons.data); - } else { - setHasThemes(true); - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Проблема с соединением. Повторите заново' } - }); // messege - Ошибка загрузки курсов - if (data?.response?.status) { - showError(data.response.status); - } - } - }; - - const handleFetchInfo = async () => { - const data = await fetchCourseInfo(Number(courseTheme)); - - if (data.success) { - setThemeInfo(data.course); - } - }; - - const handleAddTheme = async () => { - if (themeValue.title.length < 1) { - return null; - } - const data = await addThemes(Number(courseTheme), themeValue.title); - if (data.success) { - toggleSkeleton(); - handleFetchThemes(); - setMessage({ - state: true, - value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } - }); // messege - Успех! - } else { - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при добавлении' } - }); // messege - Ошибка при добавлении - if (data.response.status) { - showError(data.response.status); - } - } - }; - - const handleDeleteCourse = async (id: number) => { - const data = await deleteTheme(id); - if (data.success) { - toggleSkeleton(); - handleFetchThemes(); - setMessage({ - state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } - }); // messege - Успех! - } else { - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } - }); // messege - Ошибка при добавлении - if (data.response.status) { - showError(data.response.status); - } - } - }; - - const handleUpdateTheme = async () => { - const data = await updateTheme(Number(courseTheme), selectedCourse.id, editingThemes.title); - if (data.success) { - toggleSkeleton(); - handleFetchThemes(); - clearValues(); - setEditMode(false); - setSelectedCourse({ id: null }); - setMessage({ - state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } - }); // messege - Успех! - } else { - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка при при изменении темы', detail: 'Заполняйте поля правильно' } - }); // messege - Ошибка при изменении курса - if (data.response.status) { - showError(data.response.status); - } - } - }; - - const edit = (rowData: number | null) => { - setEditMode(true); - setSelectedCourse({ id: rowData }); - // setThemeValue({ title: rowData.title || '' }); - setFormVisible(true); - }; - - const clearValues = () => { - setThemeValue({ title: '', description: '', video_url: '' }); - setEditingThemes({ title: '' }); - setEditMode(false); - setSelectedCourse({ id: null }); - }; - - useEffect(() => { - handleFetchInfo(); - handleFetchThemes(); - }, []); - - useEffect(() => { - const handleShow = async () => { - setProgressSpinner(true); - const data: { lessons: { data: { id: number; title: string }[] } } = await fetchThemes(Number(courseTheme)); - - if (data?.lessons) { - setProgressSpinner(false); - const forEditing = data.lessons.data.find((item) => item.id === selectedCourse.id); - - setEditingThemes({ - title: forEditing?.title || '' - }); - } else { - setProgressSpinner(false); - } - }; - - if (editMode) { - handleShow(); - } - }, [editMode]); - - useEffect(() => { - const title = editMode ? editingThemes.title.trim() : themeValue.title.trim(); - if (title.length > 0) { - setForStart(false); - } else { - setForStart(true); - } - }, [themeValue.title, editingThemes.title]); - - useEffect(() => { - console.log(themeInfo); - themes.length < 1 ? setHasThemes(true) : setHasThemes(false); - }, [themes]); - - const titleInfoClass = `${!themeInfo?.image ? 'items-center' : 'w-full'} ${themeInfo?.image ? 'w-1/2' : 'w-full'}`; - const titleImageClass = `${themeInfo?.image ? 'md:w-1/3' : ''}`; - - const itemTemplate = (shablonData: any) => { - return ( -
-
- {/* Заголовок */} -
-
- - {shablonData.title} {/* Используем subject_name из вашего шаблона */} - -
- {tableMedia && ( -
- -
- )} -
- - {/* Кнопки действий */} - {!tableMedia && ( -
- {/*
- )} -
-
- ); - }; - - return ( -
- {/* title section */} -
-
-
-

- {themeInfo?.title} -

-

{themeInfo?.description}

-
- - {themeInfo?.created_at && new Date(themeInfo?.created_at).toISOString().slice(0, 10)} -
-
- {themeInfo?.image && ( -
- -
- )} -
-
{breadcrumb}
-
- - {/* add button*/} -
- )} -
-
- ); - })} -
- )} -
- )} -
- ); -} diff --git a/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx similarity index 71% rename from app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx rename to app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 915bc6c5..ddd8e933 100644 --- a/app/(main)/course/[courseTheme]/lessonStep/[course_id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -1,7 +1,9 @@ 'use client'; import LessonDocument from '@/app/components/lessons/LessonDocument'; +import LessonTest from '@/app/components/lessons/LessonTest'; import LessonVideo from '@/app/components/lessons/LessonVideo'; +import { NotFound } from '@/app/components/NotFound'; import PDFViewer from '@/app/components/PDFBook'; import FormModal from '@/app/components/popUp/FormModal'; import useBreadCrumbs from '@/hooks/useBreadCrumbs'; @@ -21,7 +23,7 @@ import { Button } from 'primereact/button'; import { confirmDialog } from 'primereact/confirmdialog'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; -import { useContext, useEffect, useState } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; export default function LessonStep() { @@ -47,11 +49,13 @@ export default function LessonStep() { title: string; } - const { course_id, lesson_id } = useParams(); + const param = useParams(); + const course_id = param.course_Id; + console.log('step param ', param); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); const media = useMediaQuery('(max-width: 640px)'); - const { setMessage } = useContext(LayoutContext); + const { setMessage, contextFetchThemes, contextThemes } = useContext(LayoutContext); const showError = useErrorMessage(); const [formVisible, setFormVisible] = useState(false); @@ -60,6 +64,8 @@ export default function LessonStep() { const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [selectedId, setSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); + const [themeNull, setThemeNull] = useState(false); + const [lesson_id, setLesson_id] = useState((param.lesson_id && Number(param.lesson_id)) || null); const teachingBreadCrumb = [ { @@ -74,7 +80,7 @@ export default function LessonStep() { url: '/course', title: 'Курстар', parent_id: 1 - }, + } // { // id: 3, // url: `/course/${''}`, @@ -91,11 +97,15 @@ export default function LessonStep() { const pathname = usePathname(); const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); - + const clearValues = () => {}; - const handleShow = async () => { - const data = await fetchLessonShow(lesson_id ? Number(lesson_id) : null); + const handleShow = async (LessonId: number) => { + // alert('lessson_id: ' + lesson_id); + + const data = await fetchLessonShow(LessonId); + console.log(data?.lesson); + if (data?.lesson) { setLessonInfoState({ title: data.lesson.title, videos_count: data.lesson.videos_count, usefullinks_count: data.lesson.usefullinks_count, documents_count: data.lesson.documents_count }); } else { @@ -111,8 +121,9 @@ export default function LessonStep() { }; const handleFetchTypes = async () => { + setFormVisible(true); const data = await fetchTypes(); - + if (data && Array.isArray(data)) { setTypes(data); } else { @@ -124,15 +135,13 @@ export default function LessonStep() { showError(data.response.status); } } - setFormVisible(true); }; - const handleFetchSteps = async () => { + const handleFetchSteps = async (lesson_id: number) => { const data = await fetchSteps(Number(lesson_id)); - - if (data.success) { - console.log(data.steps); + console.log('steps', data); + if (data.success) { if (data.steps.length < 1) { setHasSteps(true); } else { @@ -154,7 +163,7 @@ export default function LessonStep() { const handleAddLesson = async (lessonId: number, typeId: number) => { const data = await addLesson({ lesson_id: lessonId, type_id: typeId }); if (data.success) { - handleFetchSteps(); + handleFetchSteps(lessonId); setMessage({ state: true, value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } @@ -172,26 +181,28 @@ export default function LessonStep() { }; const handleFetchElement = async (stepId: number) => { - const data = await fetchElement(Number(lesson_id), stepId); - if (data.success) { - setElement({ content: data.content, step: data.step }); - } else { - setMessage({ - state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } - }); - if (data?.response?.status) { - showError(data.response.status); + console.log('sendStep 404', stepId); + + if (lesson_id) { + const data = await fetchElement(Number(lesson_id), stepId); + if (data.success) { + setElement({ content: data.content, step: data.step }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } } } }; const handleDeleteStep = async () => { const data = await deleteStep(Number(lesson_id), Number(selectedId)); - console.log(data); - if (data.success) { - handleFetchSteps(); + handleFetchSteps(Number(lesson_id)); setMessage({ state: true, value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } @@ -241,15 +252,51 @@ export default function LessonStep() { }, [steps]); useEffect(() => { - handleShow(); - handleFetchSteps(); - // handleAddLesson(lesson_id, ); - }, []); + if (lesson_id) { + handleShow(lesson_id); + } + }, [lesson_id]); useEffect(() => { - console.log('element', element); + // console.log('element', element); }, [element]); + useEffect(() => { + contextFetchThemes(Number(course_id)); + }, []); + + useEffect(() => { + console.log('Тема ', contextThemes); + console.log('variant 1'); + + if (contextThemes?.lessons?.data?.length > 0) { + console.log('variant 2'); + setThemeNull(false); + if (param.lesson_id == 'null') { + handleShow(contextThemes.lessons.data[0].id); + console.log('variant 4', contextThemes.lessons.data[0].id); + handleFetchSteps(contextThemes.lessons.data[0].id); + setLesson_id(contextThemes.lessons.data[0].id); + } else { + console.log('variant 5'); + handleShow(Number(param.lesson_id)); + setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); + handleFetchSteps(Number(param.lesson_id)); + } + } else { + setThemeNull(true); + console.log('variant 3'); + } + }, [contextThemes]); + + // if (themeNull) { + // return ( + //
+ // + //
+ // ); + // } + return (
{/* modal sectoin */} @@ -262,22 +309,20 @@ export default function LessonStep() { setFormVisible(false); clearValues(); }} - // footer={footerContent} >
{types.map((item) => { console.log(item); - const iconClass = item.name === 'link' ? 'pi pi-link' : item.name === 'video' ? 'pi pi-video' : item.name === 'document' ? 'pi pi-folder' : ''; return ( -
+
- + handleAddLesson(Number(lesson_id), item.id)}> {item.title}
-
+ ); })}
@@ -289,8 +334,7 @@ export default function LessonStep() { {/* steps section */}
{hasSteps ? ( -
-

Азырынча кадамдар жок

+
) : ( @@ -310,19 +354,26 @@ export default function LessonStep() { > + -
- {/* {lessonDisplay} */} - {element?.step.type.name === 'document' && {}} />} - {element?.step.type.name === 'video' && {}} />} + {hasSteps && ( +
+ +
+ )} + {element?.step.type.name === 'document' && } + {element?.step.type.name === 'video' && } + {element?.step.type.name === 'test' && }
); } diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 298518a4..914d70fb 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -33,7 +33,7 @@ import { displayType } from '@/types/displayType'; import { FileWithPreview } from '@/types/fileuploadPreview'; export default function Course() { - const { setMessage, course, setCourses, contextFetchCourse } = useContext(LayoutContext); + const { setMessage, course, setCourses, contextFetchCourse, setMainCourseId} = useContext(LayoutContext); const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); const [courseValue, setCourseValue] = useState({ title: '', description: '', video_url: '', image: '' }); @@ -410,7 +410,7 @@ export default function Course() { {/* Заголовок */}
- + setMainCourseId(shablonData.id)}> {shablonData.title} {/* Используем subject_name из вашего шаблона */}
@@ -690,7 +690,7 @@ export default function Course() { ) : (
-
+
{/* info section */} {skeleton ? ( @@ -725,7 +725,7 @@ export default function Course() { header="Аталышы" style={{ width: '80%' }} body={(rowData) => ( - + setMainCourseId(rowData.id)} key={rowData.id}> {rowData.title} )} @@ -778,9 +778,9 @@ export default function Course() { )}
{/* STREAMS SECTION */} - {/*
+
displayInfo(value)} toggleIndex={() => {}} /> -
*/} +
)}
diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 0a8e0902..09bfb4a2 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -18,7 +18,7 @@ export default function HomeClient() { return (
- {/* {"Уроки"} */} + {/* {"Уроки"} */}
diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index baa126e3..0e519760 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -78,8 +78,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - logout({ setUser, setGlobalLoading }); - window.location.href = '/auth/login'; + // logout({ setUser, setGlobalLoading }); + // window.location.href = '/auth/login'; return; } setTimeout(() => { diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index a1e41227..a080b1c1 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -21,12 +21,13 @@ export default function LessonCard({ lessonDate, urlForPDF, urlForDownload, - videoVisible + videoVisible, + answers }: { status: string; onSelected?: (id: number, type: string) => void; onDelete?: (id: number) => void; - cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string; document?: string }; + cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string; document?: string; score?: number }; cardBg: string; type: { typeValue: string; icon: string }; typeColor: string; @@ -34,6 +35,7 @@ export default function LessonCard({ urlForPDF: () => void; urlForDownload: string; videoVisible?: (id: string | null) => void; + answers?: { id?: number | null; text: string; is_correct: boolean }[]; }) { const shortTitle = useShortText(cardValue.title, 90); const shortDoc = useShortText(cardValue?.document || '', 70); @@ -99,7 +101,7 @@ export default function LessonCard({
); - const btnLabel = type.typeValue === 'doc' && status === 'working' ? 'Көчүрүү' : type.typeValue === 'doc' && status === 'student' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; + const btnLabel = type.typeValue === 'doc' && status === 'working' ? 'Ачуу' : type.typeValue === 'doc' && status === 'student' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; return (
@@ -111,6 +113,8 @@ export default function LessonCard({ ${type.typeValue === 'video' ? 'w-full' : ''} flex flex-col justify-evenly lesson-card-border rounded p-2 ${type.typeValue === 'doc' ? 'w-full min-h-[160px] bg-black' : ''} + + ${type.typeValue === 'test' ? 'w-full min-h-[160px] bg-black' : ''} `} style={{ backgroundColor: cardBg }} @@ -118,9 +122,27 @@ export default function LessonCard({
{/*
{!cardValue.photo && }
*/} - {shortTitle} +
+ {shortTitle} + {cardValue.score ? {`/ Балл: ${cardValue.score}`} : ''} +
{shortDoc}
{type.typeValue === 'link' && {shortUrl}} + {answers && ( +
+ {answers.map((item) => { + return ( +
+ +
+ ); + })} +
+ )}
{cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription}
{status === 'working' && (
@@ -134,7 +156,7 @@ export default function LessonCard({ {videoPreviw} {/* button */} - {( + { <> {status === 'student' && type.typeValue === 'doc' ? (
@@ -148,10 +170,21 @@ export default function LessonCard({
) : ( -
- {btnLabel &&
+ + {' '} +
+ )} {status === 'working' && ( -
+
diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index be2c4627..315840cc 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -22,8 +22,9 @@ import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; +import PDFViewer from '../PDFBook'; -export default function LessonDocument({ element, content, fetchPropElement, deleteElement }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; deleteElement: (id: number) => void }) { +export default function LessonDocument({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean}) { interface docValueType { title: string; description: string; @@ -42,6 +43,7 @@ export default function LessonDocument({ element, content, fetchPropElement, del title: string; updated_at: string; user_id: number; + document_path:string; } const { course_id } = useParams(); @@ -120,7 +122,7 @@ export default function LessonDocument({ element, content, fetchPropElement, del <>
setPDFVisible(false)}> -
{/* */}
+
); @@ -143,9 +145,7 @@ export default function LessonDocument({ element, content, fetchPropElement, del const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); if (data.success) { - // setElement({ content: data.content, step: data.step }); setEditingLesson({title: data.content.title, file:null, document: data.content.document, description: data.content.description}) - console.log(data); } else { setMessage({ state: true, @@ -248,9 +248,9 @@ export default function LessonDocument({ element, content, fetchPropElement, del cardBg={'#ddc4f51a'} type={{ typeValue: 'doc', icon: 'pi pi-doc' }} typeColor={'var(--mainColor)'} - lessonDate={'xx-xx'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} urlForPDF={() => sentToPDF(document.document || '')} - urlForDownload="" + urlForDownload={document.document_path || ''} /> ) )} @@ -326,8 +326,9 @@ export default function LessonDocument({ element, content, fetchPropElement, del }, [content]); useEffect(() => { - console.log('edititing', editingLesson); - }, [editingLesson]); + console.log('edititing', element); + setDocValue({ title: '', description: '', file: null }); + }, [element]); return (
@@ -389,7 +390,7 @@ export default function LessonDocument({ element, content, fetchPropElement, del
- {documentSection()} + {!clearProp && documentSection()}
); } diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx new file mode 100644 index 00000000..f19473d7 --- /dev/null +++ b/app/components/lessons/LessonTest.tsx @@ -0,0 +1,405 @@ +'use client'; + +import { lessonSchema } from '@/schemas/lessonSchema'; +import { EditableLesson } from '@/types/editableLesson'; +import { lessonStateType } from '@/types/lessonStateType'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useParams, useRouter } from 'next/navigation'; +import { Button } from 'primereact/button'; +import { FileUpload } from 'primereact/fileupload'; +import { InputText } from 'primereact/inputtext'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { NotFound } from '../NotFound'; +import { lessonType } from '@/types/lessonType'; +import LessonCard from '../cards/LessonCard'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { log } from 'node:console'; +import { getToken } from '@/utils/auth'; +import { addDocument, addTest, deleteDocument, deleteTest, fetchElement, updateDocument, updateTest } from '@/services/steps'; +import { mainStepsType } from '@/types/mainStepType'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import FormModal from '../popUp/FormModal'; +import PDFViewer from '../PDFBook'; +import { InputTextarea } from 'primereact/inputtextarea'; + +export default function LessonTest({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { + interface contentType { + course_id: number | null; + created_at: string; + description: string | null; + document: string; + id: number | null; + lesson_id: number; + status: true; + title: string; + updated_at: string; + user_id: number; + answers: { id: number | null; text: string; is_correct: boolean }[]; + content: string; + score: number; + image: null | string; + } + + const { course_id } = useParams(); + + const router = useRouter(); + const media = useMediaQuery('(max-width: 640px)'); + const fileUploadRef = useRef(null); + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + + const [editingLesson, setEditingLesson] = useState<{ title: string; score: number } | null>({ title: '', score: 0 }); + const [visible, setVisisble] = useState(false); + const [imageState, setImageState] = useState(null); + const [contentShow, setContentShow] = useState(false); + // doc + const [answer, setAnswer] = useState<{ id: number | null; text: string; is_correct: boolean }[]>([ + { text: '', is_correct: false, id: null }, + { text: '', is_correct: false, id: null } + ]); + const [test, setTests] = useState({ answers: { id: null, text: '', is_correct: false }, content: '', score: 0, image: null, title: '' }); + const [testValue, setTestValue] = useState<{ title: string; score: number }>({ title: '', score: 0 }); + const [testShow, setTestShow] = useState(false); + const [urlPDF, setUrlPDF] = useState(''); + + const [progressSpinner, setProgressSpinner] = useState(false); + const [selectType, setSelectType] = useState(''); + const [selectId, setSelectId] = useState(null); + + const clearValues = () => { + setTestValue({ title: '', score: 0 }); + setAnswer([]); + setEditingLesson(null); + setSelectId(null); + setSelectType(''); + }; + + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 1000); + }; + + // validate + const { + setValue, + formState: { errors } + } = useForm({ + resolver: yupResolver(lessonSchema), + mode: 'onChange' + }); + + const selectedForEditing = (id: number) => { + setSelectId(id); + setVisisble(true); + editing(); + }; + + const editing = async () => { + const data = await fetchElement(element.lesson_id, element.id); + console.log(data); + + if (data.success) { + setEditingLesson({ title: data.content.content, score: data.content.score}); + if(data.content.answers && Array.isArray(data.content.answers)){ + console.log('DA! ', ); + + setAnswer(data.content.answers); + } + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + // update document + const handleAddTest = async () => { + console.log(answer); + + const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score); + console.log(data); + + if (data?.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + }); + } else { + setTestValue({ title: '', score: 0 }); + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const addOption = () => { + setAnswer((prev) => [...prev, { text: '', is_correct: false, id: null }]); + }; + + const deleteOption = (index: number) => { + setAnswer((prev) => prev.filter((_, i) => i !== index)); + }; + + // update test + const handleUpdateTest = async () => { + const data = await updateTest(answer, editingLesson?.title || '', element.lesson_id, Number(selectId), element.type.id, element.id, 1); + console.log(data); + + // if (data?.success) { + // fetchPropElement(element.id); + // clearValues(); + // setMessage({ + // state: true, + // value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + // }); + // } else { + // // setDocValue({ title: '', description: '', file: null }); + // setEditingLesson(null); + // setMessage({ + // state: true, + // value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + // }); + // if (data?.response?.status) { + // showError(data.response.status); + // } + // } + }; + + // delete document + const handleDeleteTest = async (id: number) => { + console.log(element.lesson_id, id, element.type.id, element.id); + + const data = await deleteTest(element.lesson_id, id, element.type.id, element.id); + console.log(data); + + if (data.success) { + console.log(element.id); + clearValues(); + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + const optionAddBtn = answer.length > 2 && answer[answer.length - 1].text.length < 1; + const testSection = () => { + return ( +
+ {contentShow ? ( +
+
+ {testShow ? ( + + ) : ( + test && ( + selectedForEditing(id)} + onDelete={(id: number) => handleDeleteTest(id)} + cardValue={{ title: test?.content || '', id: Number(test!.id), desctiption: test?.description || '', type: 'test', score: test.score }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'test', icon: 'pi pi-doc' }} + typeColor={'var(--mainColor)'} + lessonDate={test.created_at && new Date(test.created_at).toISOString().slice(0, 10)} + urlForPDF={() => {}} + urlForDownload={''} + answers={test.answers} + /> + ) + )} +
+
+ ) : ( +
+
+
+
+ { + setTestValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
+
+ Балл + { + setTestValue((prev) => ({ ...prev, score: Number(e.target.value) })); + }} + /> +
+
+
+ {answer.map((item, index) => { + return ( +
+ { + setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, is_correct: true } : { ...ans, is_correct: false }))); + }} + /> + { + setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); + }} + /> +
+ ); + })} + +
+
+
+
+
+
+
+ )} +
+ ); + }; + + useEffect(() => { + console.log('ANSWER ', answer); + }, [answer]); + + useEffect(() => { + console.log('content', content); + if (content) { + setContentShow(true); + setTests(content); + } else { + setContentShow(false); + } + }, [content]); + + useEffect(() => { + console.log('element', element); + setTestValue({ title: '', score: 0 }); + }, [element]); + + return ( +
+ { + handleUpdateTest(); + }} + clearValues={clearValues} + visible={visible} + setVisible={setVisisble} + start={false} + > +
+
+
+
+ { + setEditingLesson((prev) => prev && ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
+
+ Балл + { + setEditingLesson((prev) => prev && ({ ...prev, score: Number(e.target.value) })); + }} + /> +
+
+
+ {answer.map((item, index) => { + console.log(item); + + return ( +
+ { + setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, is_correct: true } : { ...ans, is_correct: false }))); + }} + /> + { + setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); + }} + /> +
+ ); + })} + +
+
+
+
+ {!clearProp && testSection()} +
+ ); +} diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index cc40f3e4..d095b219 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -22,7 +22,7 @@ import { Dropdown } from 'primereact/dropdown'; import { Dialog } from 'primereact/dialog'; import { FileWithPreview } from '@/types/fileuploadPreview'; -export default function LessonVideo({ element, content, fetchPropElement, deleteElement }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; deleteElement: (id: number) => void }) { +export default function LessonVideo({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface docValueType { title: string; description: string; @@ -199,7 +199,7 @@ export default function LessonVideo({ element, content, fetchPropElement, delete const data = await fetchElement(element.lesson_id, element.id); if (data.success) { // setElement({ content: data.content, step: data.step }); - setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id , video_link: data.content.link, description: data.content.description, }); + setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id, video_link: data.content.link, description: data.content.description }); } else { setMessage({ state: true, @@ -287,52 +287,21 @@ export default function LessonVideo({ element, content, fetchPropElement, delete {!contentShow ? (
- { - toggleVideoType(e.value); - }} - options={videoSelect} - optionLabel="name" - placeholder="Танданыз" - // style={{backgroundColor: 'var(--mainColor', color: 'white'}} - panelStyle={{ color: 'white' }} - className="w-[213px] sm:w-full md:w-14rem" - />
- {selectedCity?.status ? ( -
- { - setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); - setValue('usefulLink', e.target.value, { shouldValidate: true }); - }} - /> - {errors.usefulLink?.message} -
- ) : ( -
- {}} - accept="video/" - onSelect={(e) => - setVideoValue((prev) => ({ - ...prev, - file: e.files[0] - })) - } - /> -
- )} +
+ { + setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
@@ -412,7 +381,7 @@ export default function LessonVideo({ element, content, fetchPropElement, delete cardBg={'white'} type={{ typeValue: 'video', icon: 'pi pi-video' }} typeColor={'var(--mainColor)'} - lessonDate={'xx-xx'} + lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} urlForPDF={() => ''} urlForDownload="" videoVisible={() => handleVideoCall(String(video?.link))} @@ -436,9 +405,10 @@ export default function LessonVideo({ element, content, fetchPropElement, delete } }, [content]); - useEffect(()=> { - console.log('video', video); - },[video]); + useEffect(() => { + console.log('video', element); + setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); + }, [element]); useEffect(() => { console.log('edititing', editingLesson); @@ -504,7 +474,7 @@ export default function LessonVideo({ element, content, fetchPropElement, delete
- {videoSection()} + {!clearProp && videoSection()}
); } diff --git a/app/globals.css b/app/globals.css index d758e31e..103579f4 100644 --- a/app/globals.css +++ b/app/globals.css @@ -616,4 +616,12 @@ h1, h2, h3, h4, h5, h6 { } 100%{ background-color: rgb(209, 210, 208); } +} + +/* texterea */ + +@media screen and (max-width: 640px){ + .p-inputtextarea{ + /* padding: 3px; */ + } } \ No newline at end of file diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 15471116..f4c0e42a 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -5,10 +5,20 @@ import AppMenuitem from './AppMenuitem'; import { LayoutContext } from './context/layoutcontext'; import { MenuProvider } from './context/menucontext'; import { AppMenuItem } from '@/types'; -import { useParams, usePathname } from 'next/navigation'; +import { useParams, usePathname, useRouter } from 'next/navigation'; +import { getConfirmOptions } from '@/utils/getConfirmOptions'; +import { confirmDialog } from 'primereact/confirmdialog'; +import { addThemes, deleteTheme, fetchLessonShow, updateTheme } from '@/services/courses'; +import FormModal from '@/app/components/popUp/FormModal'; +import { InputText } from 'primereact/inputtext'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { lessonSchema } from '@/schemas/lessonSchema'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { Button } from 'primereact/button'; const AppMenu = () => { - const { layoutConfig, user, course, contextFetchCourse, contextFetchThemes, contextThemes, setContextThemes, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); + const { layoutConfig, user, course, mainCourseId, setMainCourseId, contextFetchCourse, contextFetchThemes, contextThemes, setContextThemes, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); interface test { label: string; id: number; @@ -17,28 +27,55 @@ const AppMenu = () => { command?: () => void; } + // validate + const { + setValue, + formState: { errors } + } = useForm({ + resolver: yupResolver(lessonSchema), + mode: 'onChange' + }); + const location = usePathname(); const pathname = location; const { studentThemeCourse } = useParams(); + const params = useParams(); + const course_Id = params.course_Id; + + const router = useRouter(); const [courseList, setCourseList] = useState([]); - const [clickedCourseId, setClickedCourseId] = useState(null); + const [selectId, setSelectId] = useState(null); + const [visible, setVisisble] = useState(false); + const [themeAddvisible, setThemeAddVisisble] = useState(false); + const [editingLesson, setEditingLesson] = useState<{ title: string } | null>(null); + const [themeValue, setThemeValue] = useState<{ title: string }>({title: ''}); const [themesStudentList, setThemesStudentList] = useState<{ label: string; id: number; to: string; items?: AppMenuItem[] }[]>([]); + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + const byStatus: AppMenuItem[] = user?.is_working - ? [ - { - label: 'Курстар', - icon: 'pi pi-fw pi-calendar-clock', - items: courseList?.length > 0 ? courseList : [] - } - ] + ? pathname.startsWith('/course/') + ? [ + { + label: 'Артка', + icon: 'pi pi-fw pi-arrow-left', + to: '/course' + }, + { + label: 'Темалар', + icon: 'pi pi-fw pi-calendar-clock', + items: courseList?.length > 0 ? courseList : [] + } + ] + : [] : user?.is_student ? [ { label: 'Окуу планы', icon: 'pi pi-fw pi-calendar-clock', to: '/teaching' }, pathname.startsWith('/teaching/lesson/') ? { label: 'Темалар', icon: 'pi pi-fw pi-book', items: themesStudentList?.length > 0 ? themesStudentList : [] } : { label: '' } - ] + ] : []; const model: AppMenuItem[] = [ @@ -52,6 +89,102 @@ const AppMenu = () => { } ]; + const selectedForEditing = (id: number) => { + setSelectId(id); + setVisisble(true); + editing(id); + }; + + const editing = async (id: number) => { + console.log(selectId); + + const data = await fetchLessonShow(id); + console.log(data); + if (data.lesson) { + setEditingLesson({ title: data.lesson.title }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const clearValues = () => { + setThemeValue({title: ''}) + setEditingLesson(null); + setSelectId(null); + }; + + // add theme + const handleAddTheme = async () => { + console.log(course_Id); + + const data = await addThemes(Number(course_Id), themeValue?.title ? themeValue?.title : ''); + console.log(data); + + if (data?.success) { + contextFetchThemes(Number(course_Id)); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + }); + } else { + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при добавлении темы' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleDeleteTheme = async (id: number) => { + const data = await deleteTheme(id); + console.log(data); + if (data.success) { + contextFetchThemes(Number(course_Id)); + } + }; + + // update document + const handleUpdate = async () => { + console.log(selectId, course_Id); + + const data = await updateTheme(Number(course_Id), selectId, editingLesson?.title ? editingLesson?.title : ''); + console.log(data); + + if (data?.success) { + contextFetchThemes(Number(course_Id)); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + }); + } else { + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const sentDelete = (item: any) => { + console.log('Delete theme ID:', item.id); + const options = getConfirmOptions(Number(), () => handleDeleteTheme(item.id)); + confirmDialog(options); + }; + useEffect(() => { if (user?.is_working) { contextFetchCourse(1); @@ -68,40 +201,19 @@ const AppMenu = () => { } }, [user, studentThemeCourse]); - useEffect(() => { - if (course) { - const forCourse: test[] = [{ label: 'Курс', id: 0, to: '/course' }]; - course.data?.map((item) => - forCourse.push({ - label: item.title, - id: item.id, - to: `/course/${clickedCourseId}`, - items: [], // пока пусто - command: () => { - contextFetchThemes(item.id); - setClickedCourseId(item.id); - } - }) - ); - setCourseList(forCourse); - } - }, [course]); - useEffect(() => { if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any) => ({ label: item.title, id: item.id, - to: `/course/${clickedCourseId}/${item.id}`, + to: `/course/${course_Id}/${item.id}`, + onEdit: () => { + selectedForEditing(item.id); + }, + onDelete: () => sentDelete(item) })); - setCourseList((prev) => - prev.map((course) => - course.id === clickedCourseId - ? { ...course, items: newThemes } // добавляем темы - : course - ) - ); + setCourseList(newThemes); } }, [contextThemes]); @@ -125,11 +237,72 @@ const AppMenu = () => { return ( + { + handleUpdate(); + }} + clearValues={clearValues} + visible={visible} + setVisible={setVisisble} + start={false} + > +
+
+ { + console.log(editingLesson); + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
+
+
+ + { + handleAddTheme(); + }} + clearValues={clearValues} + visible={themeAddvisible} + setVisible={setThemeAddVisisble} + start={false} + > +
+
+ { + console.log(e.target.value, themeValue); + setThemeValue((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
+
+
+
    {model.map((item, i) => { return !item?.seperator ? :
  • ; })}
+ {pathname.startsWith('/course/') &&
+ +
}
); }; diff --git a/layout/AppMenuitem.tsx b/layout/AppMenuitem.tsx index de7c7630..2e3bc7ca 100644 --- a/layout/AppMenuitem.tsx +++ b/layout/AppMenuitem.tsx @@ -67,13 +67,50 @@ const AppMenuitem = (props: AppMenuItemProps) => { ) : null} - {item!.to && !item!.items && item!.visible !== false ? ( + {/* {item!.to && !item!.items && item!.visible !== false ? ( itemClick(e)} className={classNames(item!.class, 'p-ripple', { 'active-route': isActiveRoute })} tabIndex={0}> {item!.label} {item!.items && } + ) : null} */} + {item!.to && !item!.items && item!.visible !== false ? ( +
+ itemClick(e)} className={classNames(item!.class, 'p-ripple', { 'active-route': isActiveRoute })} tabIndex={0} style={{ flexGrow: 1 }}> + + {item!.label} + + + +
+ {/* Кнопки редактирования и удаления */} + {item!.onEdit && ( + + )} + {item!.onDelete && ( + + )} +
+
) : null} {subMenu} diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 8edf3d8f..fbae4f8d 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -83,6 +83,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { },[crumbUrls]); // fetch course + const [mainCourseId, setMainCourseId] = useState(null); const [course, setCourses] = useState<{ current_page: number; total: number; per_page: number; data: myMainCourseType[] }>({ current_page: 1, total: 0, per_page: 10, data: [] }); const contextFetchCourse = async (page: number) => { @@ -138,6 +139,8 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { crumbUrls, contextAddCrumb, + mainCourseId, + setMainCourseId }; return ( diff --git a/services/auth.tsx b/services/auth.tsx index 67fe48f9..d549e43d 100644 --- a/services/auth.tsx +++ b/services/auth.tsx @@ -11,7 +11,6 @@ let url = ''; export const login = async (value:LoginType) => { url = process.env.NEXT_PUBLIC_BASE_URL + '/login?'; - console.log(url); try { const res = await axiosInstance.post('/login?', value); diff --git a/services/courses.tsx b/services/courses.tsx index f438662a..1b00890a 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -116,6 +116,8 @@ export const addThemes = async (id: number, value: string) => { }; export const fetchThemes = async (id: number | null) => { + console.log('Вызываемая тема ',id); + try { const res = await axiosInstance(`/v1/teacher/lessons?course_id=${id}`); diff --git a/services/query-tests.http b/services/query-tests.http index 7b6b28ce..588454e0 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -15,12 +15,12 @@ # ### # test -GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons/step?lesson_id=77 -Authorization: Bearer {{token}} +POST https://api.mooc.oshsu.kg/public/api/v1/login?email=ajaparkulov@oshsu.kg&password=010270Ja Content-Type: application/json { - "lesson_id": 77 + "email": "ajaparkulov@oshsu.kg", + "password": "010270Ja" } # test @@ -35,3 +35,4 @@ Content-Type: application/json } + diff --git a/services/steps.tsx b/services/steps.tsx index 98ebabf5..8ce8d69d 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -51,7 +51,7 @@ export const addLesson = async (value: { lesson_id: number; type_id: number }) = export const fetchElement = async (lesson_id: number, step_id: number) => { console.log(lesson_id, step_id); - + try { const res = await axiosInstance.get(`/v1/teacher/lessons/step/content?lesson_id=${lesson_id}&step_id=${step_id}`); const data = await res.data; @@ -174,7 +174,7 @@ export const deleteVideo = async (lesson_id: number, content_id: number) => { export const updateVideo = async ( token: string | null, - value: { file: File | null; title: string; description: string; video_link: string; cover: string | null, video_type_id: number }, + value: { file: File | null; title: string; description: string; video_link: string; cover: string | null; video_type_id: number }, lesson_id: number, contentId: number, videoType: number, @@ -219,3 +219,68 @@ export const deleteStep = async (lesson_id: number, step_id: number) => { return err; } }; + +// test +export const addTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, type_id: number, step_id: number, score: number) => { + console.log(score); + + const payload = { + lesson_id, + type_id, + step_id, + answers, // массив уходит как есть + content: title, + img: null, // если файла нет, можно null или пустую строку + score + }; + + try { + const res = await axiosInstance.post(`/v1/teacher/test/store`, payload); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +export const updateTest = async ( + answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, test_id:number, type_id: number, step_id: number, score: number +) => { + url = `/v1/teacher/test/update`; + + const payload = { + lesson_id, + test_id, + type_id, + step_id, + answers, // массив уходит как есть + content: title, + img: null, // если файла нет, можно null или пустую строку + score + }; + + try { + const res = await axiosInstance.post(url, payload); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при обновлении урока', err); + return err; + } +}; + +export const deleteTest = async (lesson_id: number, test_id: number, type_id: number, step_id: number) => { + console.log(lesson_id, test_id, type_id,step_id); + + try { + const res = await axiosInstance.delete(`/v1/teacher/test/delete?lesson_id=${lesson_id}&test_id=${test_id}&type_id=${type_id}&step_id=${step_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; \ No newline at end of file diff --git a/styles/layout/_menu.scss b/styles/layout/_menu.scss index cb7bef2f..8266dbe7 100644 --- a/styles/layout/_menu.scss +++ b/styles/layout/_menu.scss @@ -1,6 +1,6 @@ .layout-sidebar { position: fixed; - width: 300px; + width: 320px; height: calc(100vh - 9rem); z-index: 999; overflow-y: auto; @@ -10,7 +10,7 @@ transition: transform $transitionDuration, left $transitionDuration; background-color: var(--surface-overlay); border-radius: $borderRadius; - padding: 0.5rem 1.5rem; + padding: 0.5rem 1.2rem; box-shadow: 0px 3px 5px rgba(0, 0, 0, .02), 0px 0px 2px rgba(0, 0, 0, .05), 0px 1px 4px rgba(0, 0, 0, .08); } diff --git a/types/layout.d.ts b/types/layout.d.ts index 80a81c4c..468e2973 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -71,6 +71,9 @@ export interface LayoutContextProps { crumbUrls: {type: string; crumbUrl: string }[]; contextAddCrumb: (id)=> void + + mainCourseId: number | null, + setMainCourseId // message: { state: boolean; value: MessageType }; // setMessage: React.Dispatch>; } @@ -123,6 +126,10 @@ export interface AppMenuItem extends MenuModel { disabled?: boolean; replaceUrl?: boolean; command?: ({ originalEvent, item }: CommandProps) => void; + + // + onEdit?: () => void; + onDelete?: () => void; } export interface AppMenuItemProps { diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 2aa919a3..739fc847 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -25,14 +25,14 @@ axiosInstance.interceptors.response.use( if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - window.location.href = '/auth/login'; - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - localStorage.removeItem('userVisit'); + // window.location.href = '/auth/login'; + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // localStorage.removeItem('userVisit'); } if (status === 403) { - window.location.href = '/'; console.warn('Не имеет доступ. Перенаправляю...'); + // window.location.href = '/'; } if (status === 404) { From 3e8346a8613422b64b8ff433ab62731dd045847c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 8 Sep 2025 13:30:19 +0600 Subject: [PATCH 141/286] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=B4=D1=84=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/pdf/[pdfUrl]/page.tsx | 9 ++++++++- app/components/lessons/LessonDocument.tsx | 11 ++++++----- app/components/lessons/LessonTest.tsx | 1 - app/components/lessons/LessonTyping.tsx | 18 ++---------------- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 6fb1a851..02c8e582 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -1,6 +1,13 @@ 'use client'; -import PDFViewer from '@/app/components/PDFBook'; +// import PDFViewer from '@/app/components/PDFBook'; +// import PDFViewer from '../PDFBook'; +import dynamic from "next/dynamic"; + +const PDFViewer = dynamic(()=> import('@/app/components/PDFBook'), { + ssr: false, +}) + import { useParams } from 'next/navigation'; export default function PdfUrlViewer() { diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 315840cc..e907a6c1 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -1,8 +1,6 @@ 'use client'; import { lessonSchema } from '@/schemas/lessonSchema'; -import { EditableLesson } from '@/types/editableLesson'; -import { lessonStateType } from '@/types/lessonStateType'; import { yupResolver } from '@hookform/resolvers/yup'; import { useParams, useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; @@ -12,17 +10,20 @@ import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; -import { lessonType } from '@/types/lessonType'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { log } from 'node:console'; import { getToken } from '@/utils/auth'; import { addDocument, deleteDocument, fetchElement, updateDocument } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; -import PDFViewer from '../PDFBook'; +// import PDFViewer from '../PDFBook'; +import dynamic from "next/dynamic"; + +const PDFViewer = dynamic(()=> import('../PDFBook'), { + ssr: false, +}) export default function LessonDocument({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean}) { interface docValueType { diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index f19473d7..2b78b7c7 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -22,7 +22,6 @@ import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; -import PDFViewer from '../PDFBook'; import { InputTextarea } from 'primereact/inputtextarea'; export default function LessonTest({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 50af7542..3b4acb42 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -18,7 +18,6 @@ import { lessonType } from '@/types/lessonType'; import { NotFound } from '../NotFound'; import { EditableLesson } from '@/types/editableLesson'; import { Dropdown } from 'primereact/dropdown'; -import PDFViewer from '../PDFBook'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useRouter } from 'next/navigation'; import { ProgressSpinner } from 'primereact/progressspinner'; @@ -213,23 +212,10 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp } }; - const documentView = ( - <> -
- setPDFVisible(false)}> -
- -
-
- - ); - const docSection = () => { return (
- {PDFVisible ? ( - documentView - ) : ( + ( <>
@@ -305,7 +291,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp
- )} + )
); }; From d9d3c4e56d31c18e81331ec60e7502ac0d356725 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 8 Sep 2025 15:06:25 +0600 Subject: [PATCH 142/286] =?UTF-8?q?=D0=BA=D1=80=D1=83=D0=B4=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B0=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5?= =?UTF-8?q?=D0=BD,=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=88=D0=B0=D0=B3=D0=B8=20=D0=BD=D0=B0=D1=87=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE?= =?UTF-8?q?=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20=D1=81=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 29 ++++++---- .../[studentThemeId]/[lesson_id]/page.tsx | 10 ++-- app/components/cards/LessonCard.tsx | 5 +- app/components/lessons/LessonTest.tsx | 56 ++++++++----------- app/components/lessons/LessonVideo.tsx | 15 +++-- services/steps.tsx | 16 +++--- 6 files changed, 65 insertions(+), 66 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index ddd8e933..6b896455 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -63,6 +63,7 @@ export default function LessonStep() { const [steps, setSteps] = useState([]); const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [selectedId, setSelectId] = useState(null); + const [lastSelectedId, setLastSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); const [themeNull, setThemeNull] = useState(false); const [lesson_id, setLesson_id] = useState((param.lesson_id && Number(param.lesson_id)) || null); @@ -162,6 +163,8 @@ export default function LessonStep() { const handleAddLesson = async (lessonId: number, typeId: number) => { const data = await addLesson({ lesson_id: lessonId, type_id: typeId }); + console.log(data); + if (data.success) { handleFetchSteps(lessonId); setMessage({ @@ -243,10 +246,16 @@ export default function LessonStep() {
); + useEffect(()=> { + console.log('last', lastSelectedId); + + },[lastSelectedId]) + useEffect(() => { if (Array.isArray(steps) && steps.length > 0) { - const firstStep = steps[0]?.id; - setSelectId(steps[0]?.id); + // const firstStep = steps[0]?.id; + const firstStep = steps[steps.length - 1]?.id; + setSelectId(firstStep); handleFetchElement(firstStep); } }, [steps]); @@ -289,13 +298,13 @@ export default function LessonStep() { } }, [contextThemes]); - // if (themeNull) { - // return ( - //
- // - //
- // ); - // } + if (themeNull) { + return ( +
+ +
+ ); + } return (
@@ -312,8 +321,6 @@ export default function LessonStep() { >
{types.map((item) => { - console.log(item); - return (
diff --git a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx index 9aac122b..ab54083e 100644 --- a/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx +++ b/app/(student)/teaching/[studentThemeCourse]/[studentThemeId]/[lesson_id]/page.tsx @@ -29,7 +29,7 @@ export default function StudentLessons() { const [hasLessons, setHasLessons] = useState(false); const [skeleton, setSkeleton] = useState(false); const x = localStorage.getItem('currentBreadCrumb'); - const parseX = JSON.parse(x); + const parseX = JSON.parse('x'); const [streamId, setStreamId] = useState(parseX.studentStream || ''); // doc @@ -229,10 +229,10 @@ export default function StudentLessons() { }; useEffect(() => { - const x = localStorage.getItem('currentBreadCrumb'); - const parseX = JSON.parse(x); - console.log('Eto x', parseX); - console.log('Eto x', x); + // const x = localStorage.getItem('currentBreadCrumb'); + // const parseX = JSON.parse(x); + // console.log('Eto x', parseX); + // console.log('Eto x', x); setStreamId(parseX.studentStream); }, [pathname]); diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index a080b1c1..af8d6b2c 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -124,7 +124,10 @@ export default function LessonCard({ {/*
{!cardValue.photo && }
*/}
{shortTitle} - {cardValue.score ? {`/ Балл: ${cardValue.score}`} : ''} + {cardValue.score ?
+ / Балл: + {`${cardValue.score}`} +
: ''}
{shortDoc}
{type.typeValue === 'link' && {shortUrl}} diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 2b78b7c7..51d99e7a 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -42,27 +42,24 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr image: null | string; } + interface testType { answers: { id: number | null, text: string, is_correct: boolean }[], id: number | null, content: string, score: number, image: string | null, title: string, created_at: string } + const { course_id } = useParams(); - - const router = useRouter(); const media = useMediaQuery('(max-width: 640px)'); - const fileUploadRef = useRef(null); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); const [editingLesson, setEditingLesson] = useState<{ title: string; score: number } | null>({ title: '', score: 0 }); const [visible, setVisisble] = useState(false); - const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); // doc const [answer, setAnswer] = useState<{ id: number | null; text: string; is_correct: boolean }[]>([ { text: '', is_correct: false, id: null }, { text: '', is_correct: false, id: null } ]); - const [test, setTests] = useState({ answers: { id: null, text: '', is_correct: false }, content: '', score: 0, image: null, title: '' }); + const [test, setTests] = useState({ answers: [{ id: null, text: '', is_correct: false }], id: null, content: '', score: 0, image: null, title: '', created_at:'' }); const [testValue, setTestValue] = useState<{ title: string; score: number }>({ title: '', score: 0 }); const [testShow, setTestShow] = useState(false); - const [urlPDF, setUrlPDF] = useState(''); const [progressSpinner, setProgressSpinner] = useState(false); const [selectType, setSelectType] = useState(''); @@ -100,13 +97,9 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); - console.log(data); - if (data.success) { setEditingLesson({ title: data.content.content, score: data.content.score}); - if(data.content.answers && Array.isArray(data.content.answers)){ - console.log('DA! ', ); - + if(data.content.answers && Array.isArray(data.content.answers)){ setAnswer(data.content.answers); } } else { @@ -125,8 +118,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr console.log(answer); const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score); - console.log(data); - if (data?.success) { fetchPropElement(element.id); clearValues(); @@ -160,24 +151,24 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const data = await updateTest(answer, editingLesson?.title || '', element.lesson_id, Number(selectId), element.type.id, element.id, 1); console.log(data); - // if (data?.success) { - // fetchPropElement(element.id); - // clearValues(); - // setMessage({ - // state: true, - // value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } - // }); - // } else { - // // setDocValue({ title: '', description: '', file: null }); - // setEditingLesson(null); - // setMessage({ - // state: true, - // value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } - // }); - // if (data?.response?.status) { - // showError(data.response.status); - // } - // } + if (data?.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + }); + } else { + // setDocValue({ title: '', description: '', file: null }); + setEditingLesson(null); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } }; // delete document @@ -188,7 +179,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr console.log(data); if (data.success) { - console.log(element.id); clearValues(); fetchPropElement(element.id); setMessage({ @@ -221,7 +211,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr status="working" onSelected={(id: number, type: string) => selectedForEditing(id)} onDelete={(id: number) => handleDeleteTest(id)} - cardValue={{ title: test?.content || '', id: Number(test!.id), desctiption: test?.description || '', type: 'test', score: test.score }} + cardValue={{ title: test?.content || '', id: Number(test!.id), desctiption: '', type: 'test', score: test.score }} cardBg={'#ddc4f51a'} type={{ typeValue: 'test', icon: 'pi pi-doc' }} typeColor={'var(--mainColor)'} diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index d095b219..67e70ed1 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -42,7 +42,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP updated_at: string; user_id: number; link: File | null; - cover: string; + cover: string | null; cover_url: string; } @@ -61,12 +61,12 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP interface videoValueType { title: string; - description?: string; + description: string | null; // вместо ? → строго string | null document?: File | null; url?: string | null; video_link: string; - video_type_id: number | null; - file?: File | null; + video_type_id: number; // без null + cover: File | null; } const { course_id } = useParams(); @@ -82,7 +82,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const [videoTypes, setVideoTypes] = useState([]); const [videoCall, setVideoCall] = useState(false); const [videoLink, setVideoLink] = useState(''); - const [videoValue, setVideoValue] = useState({ + const [videoValue, setVideoValue] = useState<{ title: string; description: string; file: null; url: string; video_link: string; cover: File | null; link: null }>({ title: '', description: '', file: null, @@ -199,7 +199,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const data = await fetchElement(element.lesson_id, element.id); if (data.success) { // setElement({ content: data.content, step: data.step }); - setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id, video_link: data.content.link, description: data.content.description }); + setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id, video_link: data.content.link, cover: null, description: data.content.description }); } else { setMessage({ state: true, @@ -260,7 +260,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const handleUpdateVideo = async () => { const token = getToken('access_token'); const data = await updateVideo(token, editingLesson, video?.lesson_id ? Number(video?.lesson_id) : null, Number(selectId), 1, element.type.id, element.type.id); - console.log(data); if (data?.success) { fetchPropElement(element.id); @@ -426,7 +425,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP { setEditingLesson((prev) => prev && { ...prev, video_link: e.target.value }); diff --git a/services/steps.tsx b/services/steps.tsx index 8ce8d69d..6e41341f 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -132,7 +132,7 @@ export const updateDocument = async (token: string | null, lesson_id: number | n // video -export const addVideo = async (value: { file: File | null; title: string; description: string; video_link: string; cover: string | null }, lesson_id: number, videoType: number, type_id: number, step_id: number) => { +export const addVideo = async (value: { file: File | null; title: string; description: string; video_link: string; cover: File | null }, lesson_id: number, videoType: number, type_id: number, step_id: number) => { const formData = new FormData(); url = `v1/teacher/video/store?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${videoType}`; formData.append('type_id', String(type_id)); @@ -174,8 +174,8 @@ export const deleteVideo = async (lesson_id: number, content_id: number) => { export const updateVideo = async ( token: string | null, - value: { file: File | null; title: string; description: string; video_link: string; cover: string | null; video_type_id: number }, - lesson_id: number, + value: { title: string; description: string | null; video_link: string; cover: File | null; video_type_id: number } | null, + lesson_id: number | null, contentId: number, videoType: number, type_id: number, @@ -183,15 +183,15 @@ export const updateVideo = async ( ) => { let headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; let formData = new FormData(); - url = `/v1/teacher/video/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${value.video_type_id}&video_id=${contentId}`; + url = `/v1/teacher/video/update?lesson_id=${lesson_id}&title=${value?.title}&description=${value?.description}&video_link=${value?.video_link}&video_type_id=${value?.video_type_id}&video_id=${contentId}`; formData.append('type_id', String(type_id)); formData.append('step_id', String(step_id)); formData.append('lesson_id', String(lesson_id)); - formData.append('video_link', value.video_link); - formData.append('video_type_id', String(value.video_type_id)); + formData.append('video_link', value?.video_link || ''); + formData.append('video_type_id', String(value?.video_type_id)); formData.append('video_id', String(contentId)); - formData.append('title', String(value.title)); - formData.append('description', String(value.description)); + formData.append('title', String(value?.title)); + formData.append('description', String(value?.description)); try { const res = await axiosInstance.post(url, formData, { From c793a3af6d8eb9ff8067270fc0299f0bfc6af35e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 8 Sep 2025 18:01:42 +0600 Subject: [PATCH 143/286] =?UTF-8?q?=D0=A3=D1=81=D0=BF=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D1=80=D1=83=D0=B4=20=D1=82=D0=B5=D0=BC.?= =?UTF-8?q?=20=D0=94=D0=B8=D0=B7=D0=B0=D0=B9=D0=BD=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 45 ++---- app/(main)/course/page.tsx | 4 +- app/components/cards/LessonCard.tsx | 14 +- app/components/lessons/LessonTest.tsx | 136 ++++++++++-------- layout/AppMenu.tsx | 33 +++-- layout/context/layoutcontext.tsx | 5 +- styles/layout/forms.css | 2 +- types/layout.d.ts | 2 + 8 files changed, 128 insertions(+), 113 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 6b896455..c8380e91 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -11,7 +11,7 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { lessonSchema } from '@/schemas/lessonSchema'; -import { fetchLessonShow } from '@/services/courses'; +import { deleteLesson, fetchLessonShow } from '@/services/courses'; import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; import { lessonStateType } from '@/types/lessonStateType'; import { mainStepsType } from '@/types/mainStepType'; @@ -27,35 +27,13 @@ import React, { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; export default function LessonStep() { - // types - interface editingType { - key: string; - file: string; - url: string; - link: string; - video_type_id?: number | null; - } - - interface videoType { - name: string; - status: boolean; - id: number; - } - - interface videoInsideType { - id: number; - is_link: boolean; - short_title: string; - title: string; - } - const param = useParams(); const course_id = param.course_Id; console.log('step param ', param); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); const media = useMediaQuery('(max-width: 640px)'); - const { setMessage, contextFetchThemes, contextThemes } = useContext(LayoutContext); + const { setMessage, contextFetchThemes, contextThemes, setDeleteQuery, deleteQuery } = useContext(LayoutContext); const showError = useErrorMessage(); const [formVisible, setFormVisible] = useState(false); @@ -96,14 +74,17 @@ export default function LessonStep() { // } ]; + const router = useRouter(); const pathname = usePathname(); const breadcrumb = useBreadCrumbs(teachingBreadCrumb, pathname); const clearValues = () => {}; - const handleShow = async (LessonId: number) => { - // alert('lessson_id: ' + lesson_id); + const changeUrl = (lessonId: number) => { + router.replace(`/course/${course_id}/${lessonId ? lessonId : null}`); + }; + const handleShow = async (LessonId: number) => { const data = await fetchLessonShow(LessonId); console.log(data?.lesson); @@ -246,11 +227,6 @@ export default function LessonStep() {
); - useEffect(()=> { - console.log('last', lastSelectedId); - - },[lastSelectedId]) - useEffect(() => { if (Array.isArray(steps) && steps.length > 0) { // const firstStep = steps[0]?.id; @@ -263,6 +239,7 @@ export default function LessonStep() { useEffect(() => { if (lesson_id) { handleShow(lesson_id); + changeUrl(lesson_id); } }, [lesson_id]); @@ -275,17 +252,17 @@ export default function LessonStep() { }, []); useEffect(() => { - console.log('Тема ', contextThemes); - console.log('variant 1'); + console.log('Тема ', contextThemes, deleteQuery); if (contextThemes?.lessons?.data?.length > 0) { console.log('variant 2'); setThemeNull(false); - if (param.lesson_id == 'null') { + if (param.lesson_id == 'null' || deleteQuery) { handleShow(contextThemes.lessons.data[0].id); console.log('variant 4', contextThemes.lessons.data[0].id); handleFetchSteps(contextThemes.lessons.data[0].id); setLesson_id(contextThemes.lessons.data[0].id); + setDeleteQuery(false); } else { console.log('variant 5'); handleShow(Number(param.lesson_id)); diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 914d70fb..508b1b20 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -410,7 +410,7 @@ export default function Course() { {/* Заголовок */}
- setMainCourseId(shablonData.id)}> + setMainCourseId(shablonData.id)}> {shablonData.title} {/* Используем subject_name из вашего шаблона */}
@@ -725,7 +725,7 @@ export default function Course() { header="Аталышы" style={{ width: '80%' }} body={(rowData) => ( - setMainCourseId(rowData.id)} key={rowData.id}> + setMainCourseId(rowData.id)} key={rowData.id}> {rowData.title} )} diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index af8d6b2c..11dd2f14 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -122,12 +122,16 @@ export default function LessonCard({
{/*
{!cardValue.photo && }
*/} -
+
{shortTitle} - {cardValue.score ?
- / Балл: - {`${cardValue.score}`} -
: ''} + {cardValue.score ? ( +
+ {!media && '/'} Балл: + {`${cardValue.score}`} +
+ ) : ( + '' + )}
{shortDoc}
{type.typeValue === 'link' && {shortUrl}} diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 51d99e7a..a5bf7610 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -42,8 +42,16 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr image: null | string; } - interface testType { answers: { id: number | null, text: string, is_correct: boolean }[], id: number | null, content: string, score: number, image: string | null, title: string, created_at: string } - + interface testType { + answers: { id: number | null; text: string; is_correct: boolean }[]; + id: number | null; + content: string; + score: number; + image: string | null; + title: string; + created_at: string; + } + const { course_id } = useParams(); const media = useMediaQuery('(max-width: 640px)'); const showError = useErrorMessage(); @@ -57,20 +65,21 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr { text: '', is_correct: false, id: null }, { text: '', is_correct: false, id: null } ]); - const [test, setTests] = useState({ answers: [{ id: null, text: '', is_correct: false }], id: null, content: '', score: 0, image: null, title: '', created_at:'' }); + const [test, setTests] = useState({ answers: [{ id: null, text: '', is_correct: false }], id: null, content: '', score: 0, image: null, title: '', created_at: '' }); const [testValue, setTestValue] = useState<{ title: string; score: number }>({ title: '', score: 0 }); const [testShow, setTestShow] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); - const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const clearValues = () => { setTestValue({ title: '', score: 0 }); - setAnswer([]); + setAnswer([ + { text: '', is_correct: false, id: null }, + { text: '', is_correct: false, id: null } + ]); setEditingLesson(null); setSelectId(null); - setSelectType(''); }; const toggleSpinner = () => { @@ -98,8 +107,8 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); if (data.success) { - setEditingLesson({ title: data.content.content, score: data.content.score}); - if(data.content.answers && Array.isArray(data.content.answers)){ + setEditingLesson({ title: data.content.content, score: data.content.score }); + if (data.content.answers && Array.isArray(data.content.answers)) { setAnswer(data.content.answers); } } else { @@ -226,57 +235,64 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr
) : (
-
-
-
- { - setTestValue((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} -
-
- Балл - { - setTestValue((prev) => ({ ...prev, score: Number(e.target.value) })); - }} - /> +
+
+
+
+ { + setTestValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
+
+ Балл + { + setTestValue((prev) => ({ ...prev, score: Number(e.target.value) })); + }} + /> +
-
-
- {answer.map((item, index) => { - return ( -
- { - setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, is_correct: true } : { ...ans, is_correct: false }))); - }} - /> - { - setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); - }} - /> -
- ); - })} +
+ {answer.map((item, index) => { + return ( +
+ + { + setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); + }} + /> +
+ ); + })} -
@@ -338,7 +354,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr value={editingLesson?.title && editingLesson.title} style={{ resize: 'none', width: '100%' }} onChange={(e) => { - setEditingLesson((prev) => prev && ({ ...prev, title: e.target.value })); + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); setValue('title', e.target.value, { shouldValidate: true }); }} /> @@ -351,7 +367,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr className="w-[70px]" value={String(editingLesson?.score)} onChange={(e) => { - setEditingLesson((prev) => prev && ({ ...prev, score: Number(e.target.value) })); + setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); }} />
@@ -359,7 +375,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr
{answer.map((item, index) => { console.log(item); - + return (
{ - const { layoutConfig, user, course, mainCourseId, setMainCourseId, contextFetchCourse, contextFetchThemes, contextThemes, setContextThemes, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); + const { layoutConfig, user, setDeleteQuery, course, mainCourseId, setMainCourseId, contextFetchCourse, contextFetchThemes, contextThemes, setContextThemes, contextFetchStudentThemes, contextStudentThemes } = useContext(LayoutContext); interface test { label: string; id: number; @@ -49,7 +50,7 @@ const AppMenu = () => { const [visible, setVisisble] = useState(false); const [themeAddvisible, setThemeAddVisisble] = useState(false); const [editingLesson, setEditingLesson] = useState<{ title: string } | null>(null); - const [themeValue, setThemeValue] = useState<{ title: string }>({title: ''}); + const [themeValue, setThemeValue] = useState<{ title: string }>({ title: '' }); const [themesStudentList, setThemesStudentList] = useState<{ label: string; id: number; to: string; items?: AppMenuItem[] }[]>([]); @@ -114,12 +115,12 @@ const AppMenu = () => { }; const clearValues = () => { - setThemeValue({title: ''}) + setThemeValue({ title: '' }); setEditingLesson(null); setSelectId(null); }; - // add theme + // add theme const handleAddTheme = async () => { console.log(course_Id); @@ -147,9 +148,21 @@ const AppMenu = () => { const handleDeleteTheme = async (id: number) => { const data = await deleteTheme(id); - console.log(data); if (data.success) { contextFetchThemes(Number(course_Id)); + setDeleteQuery(true); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при удалении темы' } + }); + if (data?.response?.status) { + showError(data.response.status); + } } }; @@ -298,11 +311,11 @@ const AppMenu = () => { return !item?.seperator ? :
  • ; })} - {pathname.startsWith('/course/') &&
    - -
    } + {pathname.startsWith('/course/') && ( +
    + +
    + )} ); }; diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index fbae4f8d..c7f1e832 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -96,6 +96,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { }; // fetch themes + const [deleteQuery, setDeleteQuery] = useState(false); const [contextThemes, setContextThemes] = useState([]); const contextFetchThemes = async (id: number | null) => { const data = await fetchThemes(Number(id) || null); @@ -132,6 +133,8 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { contextFetchThemes, contextThemes, setContextThemes, + deleteQuery, + setDeleteQuery, contextFetchStudentThemes, contextStudentThemes, @@ -140,7 +143,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { crumbUrls, contextAddCrumb, mainCourseId, - setMainCourseId + setMainCourseId, }; return ( diff --git a/styles/layout/forms.css b/styles/layout/forms.css index d20cf888..a457ddc6 100644 --- a/styles/layout/forms.css +++ b/styles/layout/forms.css @@ -16,7 +16,7 @@ font-size: 14px; gap: 8px; position: relative; - padding: 6px 10px; + padding: 4px 7px; transition: color 0.3s; } diff --git a/types/layout.d.ts b/types/layout.d.ts index 468e2973..fc111287 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -64,6 +64,8 @@ export interface LayoutContextProps { contextFetchThemes: (id: number)=> void; contextThemes; setContextThemes; + deleteQuery: boolean; + setDeleteQuery; contextFetchStudentThemes: (id)=> void; contextStudentThemes; From 6a012d2afbb7a2df18ab5b91a167302708a2d5aa Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 9 Sep 2025 08:53:56 +0600 Subject: [PATCH 144/286] =?UTF-8?q?=D0=A1=D0=B2=D1=8F=D0=B7=D1=8C=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=BA=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/tables/StreamList.tsx | 19 +++++++++++++++---- types/layout.d.ts | 2 +- types/streamType.tsx | 8 ++++++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index c30277c5..d97138bf 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -16,8 +16,9 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis interface mainStreamsType { connect_id: number | null; stream_id: number; - subject_name: { name_kg: string }; - subject_type_name: { name_kg: string }; + id_curricula: number; + subject_name: { name_kg: string, id: number }; + subject_type_name: { name_kg: string, id: number }; teacher: { name: string }; language: { name: string }; id_edu_year: number; @@ -26,6 +27,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis edu_form: { name_kg: string }; period: {name_kg: string}, courseValue?: number; + speciality: {id: number, id_faculty: number}; } const shablon = [ @@ -151,7 +153,6 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis const handleConnect = async () => { const data = await connectStreams({course_id: courseValue?.id ? courseValue?.id : null, stream: pendingChanges }); - // const data = await connectStreams(streamValues); if (data?.success) { toggleSkeleton(); @@ -171,13 +172,23 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } }; - const handleEdit = (e: { checked: boolean }, item: mainStreamsType) => { + const handleEdit = (e: { checked: boolean }, item: mainStreamsType) => { + console.log(item); + const { stream_id, subject_name } = item; const isChecked = e.checked; const forSentStreams = { course_id: courseValue!.id, stream_id: stream_id, + id_curricula: item.id_curricula, + id_subject: item.subject_name.id, + subject_type: item.subject_type_name.name_kg, + id_subject_type: item.subject_type_name.id, + id_edu_year: item.id_edu_year, + id_period: item.id_period, + id_speciality: item.speciality.id, + id_faculty: item.speciality.id_faculty, info: '', stream_title: subject_name.name_kg }; diff --git a/types/layout.d.ts b/types/layout.d.ts index fc111287..eca3b1be 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -71,7 +71,7 @@ export interface LayoutContextProps { contextStudentThemes; setContextStudentThemes; - crumbUrls: {type: string; crumbUrl: string }[]; + crumbUrls: {type: string; crumbUrl: string }; contextAddCrumb: (id)=> void mainCourseId: number | null, diff --git a/types/streamType.tsx b/types/streamType.tsx index 5cf141cf..8a8c2e9e 100644 --- a/types/streamType.tsx +++ b/types/streamType.tsx @@ -1,2 +1,6 @@ -export interface streamsType { course_id: number | null; stream_id: number; info: string | null, stream_title?:string } - \ No newline at end of file +export interface streamsType { + course_id: number | null; + stream_id: number; + info: string | null; + stream_title?: string; +} From 6e9f3dad94220bd69fcc638c7603145d7fc67e62 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 9 Sep 2025 10:18:23 +0600 Subject: [PATCH 145/286] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D0=B0=D0=B9=D0=B4=D0=B1=D0=B0=D1=80=20=D0=B2=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=B5.=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE=D1=88?= =?UTF-8?q?=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2=20=D1=83=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 13 ++++----- layout/AppMenu.tsx | 2 ++ layout/context/layoutcontext.tsx | 29 +++++++++++++++---- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index c8380e91..329689a7 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -238,24 +238,20 @@ export default function LessonStep() { useEffect(() => { if (lesson_id) { + console.warn('LESSONID ', lesson_id); handleShow(lesson_id); changeUrl(lesson_id); } }, [lesson_id]); - useEffect(() => { - // console.log('element', element); - }, [element]); - useEffect(() => { contextFetchThemes(Number(course_id)); - }, []); + }, [course_id]); useEffect(() => { - console.log('Тема ', contextThemes, deleteQuery); + console.log('Тема ', contextThemes, lesson_id); if (contextThemes?.lessons?.data?.length > 0) { - console.log('variant 2'); setThemeNull(false); if (param.lesson_id == 'null' || deleteQuery) { handleShow(contextThemes.lessons.data[0].id); @@ -263,7 +259,8 @@ export default function LessonStep() { handleFetchSteps(contextThemes.lessons.data[0].id); setLesson_id(contextThemes.lessons.data[0].id); setDeleteQuery(false); - } else { + } + else { console.log('variant 5'); handleShow(Number(param.lesson_id)); setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index db5f1d52..00130b72 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -215,6 +215,8 @@ const AppMenu = () => { }, [user, studentThemeCourse]); useEffect(() => { + console.log(contextThemes); + if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any) => ({ label: item.title, diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index c7f1e832..6076ee00 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -68,19 +68,36 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { return window.innerWidth > 991; }; + useEffect(() => { + if (pathname === '/course') { + setLayoutState((prev) => ({ + ...prev, + staticMenuDesktopInactive: true, + staticMenuMobileActive: false, + overlayMenuActive: false, + profileSidebarVisible: false + })); + } else { + setLayoutState((prev) => ({ + ...prev, + staticMenuDesktopInactive: false + })); + } + }, [pathname]); + // breadCrumb urls const isTopicsChildPage = /^\/teaching\/[^/]+\/[^/]+$/.test(pathname); - const [crumbUrls, setCrumbUrls] = useState<{type: string; crumbUrl: string }>({type: '', crumbUrl: ''}); + const [crumbUrls, setCrumbUrls] = useState<{ type: string; crumbUrl: string }>({ type: '', crumbUrl: '' }); const contextAddCrumb = (url: { type: string; crumbUrl: string }) => { const urlName = url.type === 'studentStream' ? 'studentStream' : ''; setCrumbUrls((prev) => ({ ...prev, [urlName]: url.crumbUrl })); }; - useEffect(()=> { - if(isTopicsChildPage && crumbUrls){ + useEffect(() => { + if (isTopicsChildPage && crumbUrls) { localStorage.setItem('currentBreadCrumb', JSON.stringify(crumbUrls)); - } - },[crumbUrls]); + } + }, [crumbUrls]); // fetch course const [mainCourseId, setMainCourseId] = useState(null); @@ -143,7 +160,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { crumbUrls, contextAddCrumb, mainCourseId, - setMainCourseId, + setMainCourseId }; return ( From 78251571d821aaaf0bc41b9e50ec5916841b7656 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 9 Sep 2025 10:31:09 +0600 Subject: [PATCH 146/286] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 329689a7..f631222b 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -236,6 +236,10 @@ export default function LessonStep() { } }, [steps]); + useEffect(()=> { + + },[]); + useEffect(() => { if (lesson_id) { console.warn('LESSONID ', lesson_id); From 8e6fabe05e159638384df91c0c0706417e673342 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 9 Sep 2025 10:56:14 +0600 Subject: [PATCH 147/286] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/tables/StreamList.tsx | 72 ++++++++++++++-------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index d97138bf..44a41b89 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -12,22 +12,34 @@ import Link from 'next/link'; import { streamsType } from '@/types/streamType'; import { displayType } from '@/types/displayType'; -export default function StreamList({ callIndex, courseValue, isMobile, insideDisplayStreams, toggleIndex }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; insideDisplayStreams: (id: displayType[]) => void, toggleIndex: ()=> void }) { +export default function StreamList({ + callIndex, + courseValue, + isMobile, + insideDisplayStreams, + toggleIndex +}: { + callIndex: number; + courseValue: { id: number | null; title: string } | null; + isMobile: boolean; + insideDisplayStreams: (id: displayType[]) => void; + toggleIndex: () => void; +}) { interface mainStreamsType { connect_id: number | null; stream_id: number; id_curricula: number; - subject_name: { name_kg: string, id: number }; - subject_type_name: { name_kg: string, id: number }; + subject_name: { name_kg: string; id: number }; + subject_type_name: { name_kg: string; id: number }; teacher: { name: string }; language: { name: string }; id_edu_year: number; id_period: number; semester: { name_kg: string }; edu_form: { name_kg: string }; - period: {name_kg: string}, + period: { name_kg: string }; courseValue?: number; - speciality: {id: number, id_faculty: number}; + speciality: { id: number; id_faculty: number }; } const shablon = [ @@ -107,17 +119,19 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis course_id: item?.course_id, stream_id: item.stream_id, info: '', - stream_title: item?.subject_name.name_kg + id_curricula: item.id_curricula, + id_subject: item.subject_name.id, + subject_type: item.subject_type_name.name_kg, + id_subject_type: item.subject_type_name.id, + id_edu_year: item.id_edu_year, + id_period: item.id_period, + id_speciality: item.speciality.id, + id_faculty: item.speciality.id_faculty, + stream_title: item?.subject_name.name_kg // }); } }); - // setStreamValues((prev) => ({ - // ...prev, - // stream: [...prev.stream, ...newStreams] - // })); - // setPendingChanges((prev)=> [...prev, ...newStreams]); - setPendingChanges((prev) => { const pendingIds = new Set(prev.map((p) => p.stream_id)); const uniqueNewStreams = newStreams.filter((s) => !pendingIds.has(s.stream_id)); @@ -131,6 +145,8 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis setPendingChanges([]); if (data) { + console.log(data); + profilactor(data); setHasStreams(false); setStreams(data); @@ -152,7 +168,9 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis }; const handleConnect = async () => { - const data = await connectStreams({course_id: courseValue?.id ? courseValue?.id : null, stream: pendingChanges }); + console.log(pendingChanges); + + const data = await connectStreams({ course_id: courseValue?.id ? courseValue?.id : null, stream: pendingChanges }); if (data?.success) { toggleSkeleton(); @@ -172,9 +190,9 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis } }; - const handleEdit = (e: { checked: boolean }, item: mainStreamsType) => { + const handleEdit = (e: { checked: boolean }, item: mainStreamsType) => { console.log(item); - + const { stream_id, subject_name } = item; const isChecked = e.checked; @@ -208,26 +226,6 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis return prev; }); - - // if (e.checked) { - // // profilactor(); - // setStreamValues( - // (prev) => - // prev && { - // ...prev, - // stream: [...prev.stream, forSentStreams] - // } - // ); - // // const x = {streamTitle} - // } else { - // setStreamValues( - // (prev) => - // prev && { - // ...prev, - // stream: [...prev.stream.filter((item) => item?.stream_id !== id)] - // } - // ); - // } }; // useEffect(() => { @@ -386,7 +384,7 @@ export default function StreamList({ callIndex, courseValue, isMobile, insideDis
    ); - const step = (icon: string, step: number) => ( -
    { - setSelectId(step); - handleFetchElement(step); - }} - > -
    - + const step = (icon: string, step: number, idx: number) => { + return ( +
    { + setSelectId(step); + handleFetchElement(step); + }} + > + {idx + 1} +
    + +
    -
    - ); + ); + }; useEffect(() => { if (Array.isArray(steps) && steps.length > 0) { @@ -252,21 +258,20 @@ export default function LessonStep() { useEffect(() => { console.log('Тема ', contextThemes, lesson_id); - if(testovy || updateQuery || deleteQuery){ + if (testovy || updateQuery || deleteQuery) { setTestovy(false); setUpdateeQuery(false); if (contextThemes?.lessons?.data?.length > 0) { setThemeNull(false); if (param.lesson_id == 'null' || deleteQuery) { console.log(contextThemes.lessons.data[0].id); - + handleShow(contextThemes.lessons.data[0].id); console.log('variant 4', contextThemes.lessons.data[0].id); handleFetchSteps(contextThemes.lessons.data[0].id); setLesson_id(contextThemes.lessons.data[0].id); setDeleteQuery(false); - } - else { + } else { console.log('variant 5'); handleShow(Number(param.lesson_id)); setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); @@ -320,7 +325,7 @@ export default function LessonStep() { {lessonInfo} {/* steps section */} -
    +
    {hasSteps ? (
    @@ -330,28 +335,30 @@ export default function LessonStep() { {steps.map((item, idx) => { return (
    - {step(item.type.logo, item.id)} + {step(item.type.logo, item.id, idx)}
    ); })}
    )} - - {!hasSteps && ( - + {!hasSteps && ( +
    {hasSteps && ( @@ -362,6 +369,7 @@ export default function LessonStep() { {element?.step.type.name === 'document' && } {element?.step.type.name === 'video' && } {element?.step.type.name === 'test' && } + {element?.step.type.name === 'practical' && }
    ); } diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 508b1b20..785c66b1 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -1,7 +1,7 @@ 'use client'; import FormModal from '@/app/components/popUp/FormModal'; -import { addCourse, deleteCourse, fetchCourseInfo, fetchCourses, updateCourse } from '@/services/courses'; +import { addCourse, deleteCourse, fetchCourseInfo, fetchCourses, publishCourse, updateCourse } from '@/services/courses'; import { Button } from 'primereact/button'; import { FileUpload, FileUploadSelectEvent } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; @@ -262,6 +262,25 @@ export default function Course() { setSelectedCourse(null); }; + const publish = async (id: number) => { + const data = await publishCourse(id); + if(data.success){ + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа', detail: 'Кийинирээк кайталаныз' } + }); // messege - Ошибка при добавлении + if (data?.response?.status) { + showError(data.response.status); + } + } + + } + const handleUpdateCourse = async () => { const data = await updateCourse(selectedCourse, editingLesson); if (data?.success) { @@ -732,7 +751,13 @@ export default function Course() { > - + ( +
    ); - const btnLabel = type.typeValue === 'doc' && status === 'working' ? 'Ачуу' : type.typeValue === 'doc' && status === 'student' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; + const btnLabel = type.typeValue === 'doc' || type.typeValue === 'practica' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; return (
    @@ -115,15 +116,17 @@ export default function LessonCard({ ${type.typeValue === 'doc' ? 'w-full min-h-[160px] bg-black' : ''} ${type.typeValue === 'test' ? 'w-full min-h-[160px] bg-black' : ''} + + ${type.typeValue === 'practica' ? 'w-full min-h-[160px] bg-black' : ''} `} style={{ backgroundColor: cardBg }} > -
    -
    +
    +
    {/*
    {!cardValue.photo && }
    */} -
    - {shortTitle} +
    + {shortTitle} {cardValue.score ? (
    {!media && '/'} Балл: @@ -133,8 +136,23 @@ export default function LessonCard({ '' )}
    -
    {shortDoc}
    - {type.typeValue === 'link' && {shortUrl}} + + {type.typeValue !== 'practica' &&
    {shortDoc}
    } + + {type.typeValue === 'practica' && cardValue.url ? ( +
    + + Шилтеме: + + {shortUrl} +
    + ) : ( + type.typeValue === 'link' && ( + <> + {shortUrl} + + ) + )} {answers && (
    {answers.map((item) => { @@ -150,15 +168,17 @@ export default function LessonCard({ })}
    )} -
    {cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription}
    +
    + {cardValue?.desctiption && cardValue?.desctiption !== 'null' ? shortDescription : cardValue?.desctiption && cardValue?.desctiption !== 'null' && type.typeValue === 'practica' ?
    {shortDescription}
    : ''} +
    + {status === 'working' && ( -
    +
    {lessonDate}
    )}
    - {/* video preview */} {videoPreviw} @@ -168,7 +188,6 @@ export default function LessonCard({ {status === 'student' && type.typeValue === 'doc' ? ( )} + {type.typeValue === 'practica' && ( + + )} {status === 'working' && (
    diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx new file mode 100644 index 00000000..ecfb0151 --- /dev/null +++ b/app/components/lessons/LessonPractica.tsx @@ -0,0 +1,441 @@ +'use client'; + +import { lessonSchema } from '@/schemas/lessonSchema'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useParams, useRouter } from 'next/navigation'; +import { Button } from 'primereact/button'; +import { FileUpload } from 'primereact/fileupload'; +import { InputText } from 'primereact/inputtext'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { NotFound } from '../NotFound'; +import LessonCard from '../cards/LessonCard'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { getToken } from '@/utils/auth'; +import { addDocument, addPractica, deleteDocument, deletePractica, fetchElement, updateDocument, updatePractica } from '@/services/steps'; +import { mainStepsType } from '@/types/mainStepType'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import FormModal from '../popUp/FormModal'; +import { InputTextarea } from 'primereact/inputtextarea'; +import dynamic from 'next/dynamic'; + +const PDFViewer = dynamic(() => import('../PDFBook'), { + ssr: false +}); + +export default function LessonPractica({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { + interface docValueType { + title: string; + description: string; + document: File | null; + url: string; + } + + interface contentType { + course_id: number | null; + created_at: string; + description: string | null; + document: string; + id: number; + lesson_id: number; + status: true; + title: string; + updated_at: string; + user_id: number; + document_path: string; + url: string; + } + + const { course_id } = useParams(); + + const router = useRouter(); + const media = useMediaQuery('(max-width: 640px)'); + const fileUploadRef = useRef(null); + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + + const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '' }); + const [visible, setVisisble] = useState(false); + const [imageState, setImageState] = useState(null); + const [contentShow, setContentShow] = useState(false); + // doc + const [document, setDocuments] = useState(); + const [docValue, setDocValue] = useState({ + title: '', + description: '', + document: null, + url: '' + }); + const [docShow, setDocShow] = useState(false); + const [urlPDF, setUrlPDF] = useState(''); + const [PDFVisible, setPDFVisible] = useState(false); + + const [progressSpinner, setProgressSpinner] = useState(false); + const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); + const [selectType, setSelectType] = useState(''); + const [selectId, setSelectId] = useState(null); + + const clearFile = () => { + fileUploadRef.current?.clear(); + setAdditional((prev) => ({ ...prev, video: false })); + setImageState(null); + if (visible) { + setEditingLesson( + (prev) => + prev && { + ...prev, + document: null + } + ); + } else { + setDocValue((prev) => ({ + ...prev, + document: null + })); + } + }; + + const documentView = ( + <> +
    + setPDFVisible(false)}> +
    + +
    +
    + + ); + + const clearValues = () => { + clearFile(); + setDocValue({ title: '', description: '', document: null, url: '' }); + setEditingLesson({ title: '', description: '', document: null, url: '' }); + setSelectId(null); + setSelectType(''); + }; + + const toggleSpinner = () => { + setProgressSpinner(true); + setInterval(() => { + setProgressSpinner(false); + }, 1000); + }; + + // validate + const { + setValue, + formState: { errors } + } = useForm({ + resolver: yupResolver(lessonSchema), + mode: 'onChange' + }); + + const selectedForEditing = (id: number, type: string) => { + setSelectType(type); + setSelectId(id); + setVisisble(true); + editing(); + }; + + const sentToPDF = (url: string) => { + console.log(url); + + setUrlPDF(url); + if (media) { + router.push(`/pdf/${url}`); + } else { + setPDFVisible(true); + } + }; + + const editing = async () => { + + const data = await fetchElement(element.lesson_id, element.id); + console.log('send ', data.content); + if (data.success) { + setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '' }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleAddPracica = async () => { + toggleSpinner(); + const data = await addPractica(docValue, element.lesson_id, element.type_id, element.id); + console.log(data); + + if (data.success) { + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при добавлении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + // delete document + const handleDeleteDoc = async (id: number) => { + console.log(id); + + const data = await deletePractica(Number(document?.lesson_id), id, element.type.id, element.id); + if (data.success) { + fetchPropElement(element.id); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + }); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при удалении' } + }); + if (data.response.status) { + showError(data.response.status); + } + } + }; + + useEffect(() => { + console.log('editinglesson', editingLesson); + }, [editingLesson]); + + // update document + const handleUpdateDoc = async () => { + const data = await updatePractica(editingLesson, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.id); + console.log(data); + + if (data?.success) { + fetchPropElement(element.id); + clearValues(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + }); + } else { + setDocValue({ title: '', description: '', document: null, url: '' }); + setEditingLesson({ title: '', description: '', document: null, url: '' }); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const practicaSection = () => { + return ( +
    + {PDFVisible ? ( + documentView + ) : contentShow ? ( +
    +
    + {docShow ? ( + + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'practica', icon: 'pi pi-list' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} + urlForPDF={() => sentToPDF(document.document_path || '')} + urlForDownload={document.document_path || ''} + /> + ) + )} +
    +
    + ) : ( +
    +
    + setDocValue((prev) => ({ ...prev, title: e.target.value }))} /> +
    + {errors.title?.message} + {additional.doc && ( +
    + {}} + accept="application/pdf" + onSelect={(e) => + setDocValue((prev) => ({ + ...prev, + document: e.files[0] + })) + } + /> +
    + )} + {additional.doc && ( +
    + { + setDocValue((prev) => ({ ...prev, url: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
    + )} + {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + +
    + {/*
    +
    +
    + )} +
    + ); + }; + + useEffect(() => { + console.log('content', content); + if (content) { + setContentShow(true); + setDocuments(content); + } else { + setContentShow(false); + } + }, [content]); + + useEffect(() => { + console.log('edititing', element); + setDocValue({ title: '', description: '', document: null, url: '' }); + }, [element]); + + useEffect(() => { + console.log('value ', docValue); + }, [docValue]); + + return ( +
    + { + handleUpdateDoc(); + }} + clearValues={clearValues} + visible={visible} + setVisible={setVisisble} + start={false} + > +
    +
    +
    + { + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }) + setValue('title', e.target.value, { shouldValidate: true }); + }} /> +
    + {errors.title?.message} + {additional.doc && ( +
    +
    + {}} + accept="application/pdf" + onSelect={(e) => + setEditingLesson( + (prev) => + prev && { + ...prev, + document: e.files[0] + } + ) + } + /> +
    + {typeof editingLesson?.document === 'string' && String(editingLesson?.document)} +
    + )} + {additional.doc && ( +
    + { + setEditingLesson((prev) => prev && { ...prev, url: e.target.value }); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> +
    + )} + { + setEditingLesson((prev) => ({ ...prev, description: e.target.value })) + setValue('title', e.target.value, { shouldValidate: true }); + }} className="w-full" /> + {errors.title?.message} + +
    +
    + setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> + Кошумча {additional.doc ? '-' : '+'} + +
    +
    +
    +
    +
    + {!clearProp && practicaSection()} +
    + ); +} diff --git a/hooks/useShortText.tsx b/hooks/useShortText.tsx index fa3dd27c..b85403b5 100644 --- a/hooks/useShortText.tsx +++ b/hooks/useShortText.tsx @@ -20,13 +20,13 @@ export default function useShortText(text: string, textLength: number) { return ( <> - {isLength ? ( + {isLength ? (
    {resultText}
    ) : ( -
    {resultText}
    +
    {resultText}
    )} ); diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index bfb90007..ec6d83fd 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -219,8 +219,8 @@ const AppMenu = () => { console.log(contextThemes); if (contextThemes && contextThemes.lessons) { - const newThemes = contextThemes.lessons.data.map((item: any) => ({ - label: item.title, + const newThemes = contextThemes.lessons.data.map((item: any, idx:number) => ({ + label:
    {idx+1}. {item.title}
    , id: item.id, to: `/course/${course_Id}/${item.id}`, onEdit: () => { diff --git a/services/courses.tsx b/services/courses.tsx index 1b00890a..95927a65 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -345,3 +345,20 @@ export const fetchVideoType = async () => { } }; +export const publishCourse = async (id: number) => { + const formData = new FormData(); + formData.append('course_id', String(id)); + + try { + const res = await axiosInstance.post(`/v1/teacher/courses/published`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; diff --git a/services/steps.tsx b/services/steps.tsx index 6e41341f..985205eb 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -244,11 +244,9 @@ export const addTest = async (answers: { text: string; is_correct: boolean }[], } }; -export const updateTest = async ( - answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, test_id:number, type_id: number, step_id: number, score: number -) => { +export const updateTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, test_id: number, type_id: number, step_id: number, score: number) => { url = `/v1/teacher/test/update`; - + const payload = { lesson_id, test_id, @@ -272,7 +270,7 @@ export const updateTest = async ( }; export const deleteTest = async (lesson_id: number, test_id: number, type_id: number, step_id: number) => { - console.log(lesson_id, test_id, type_id,step_id); + console.log(lesson_id, test_id, type_id, step_id); try { const res = await axiosInstance.delete(`/v1/teacher/test/delete?lesson_id=${lesson_id}&test_id=${test_id}&type_id=${type_id}&step_id=${step_id}`); @@ -283,4 +281,77 @@ export const deleteTest = async (lesson_id: number, test_id: number, type_id: nu console.log('Ошибка при удалении темы', err); return err; } -}; \ No newline at end of file +}; + +// practica +export const addPractica = async (value: { url: string | null; title: string; description: string | null; document: File | null }, lesson_id: number, type_id: number, step_id: number) => { + console.log(value); + + const formData = new FormData(); + url = `/v1/teacher/practice-lesson/store?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&document=${value.document}&video_type_id=${type_id}&step_id=${step_id}`; + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('url', String(value?.url)); + formData.append('title', String(value?.title)); + formData.append('description', String(value?.description)); + if (value.document) formData.append('document', value?.document && value?.document); + else formData.append('document', ''); + + try { + const res = await axiosInstance.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +export const updatePractica = async (value: { url: string | null; title: string; description: string | null; document: File | null }, lesson_id: number | null, practice_id: number, type_id: number, step_id: number) => { + console.log(value); + + let formData = new FormData(); + url = `/v1/teacher/practice-lesson/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&document=${value.document}&practice_id=${practice_id}&video_type_id=${type_id}&step_id=${step_id}`; + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('practice_id', String(practice_id)); + formData.append('url', value?.url || ''); + formData.append('title', String(value?.title)); + formData.append('description', String(value?.description)); + if (value.document) formData.append('document', value?.document && value?.document); + else formData.append('document', ''); + + try { + const res = await axiosInstance.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при обновлении урока', err); + return err; + } +}; + +export const deletePractica = async (lesson_id: number, practice_id: number, type_id: number, step_id: number) => { + console.log(lesson_id, practice_id); + + try { + const res = await axiosInstance.delete(`/v1/teacher/practice-lesson/delete?lesson_id=${lesson_id}&practice_id=${practice_id}&step_id=${step_id}&type_id=${type_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; From b0821c67ea702a801faf2fceb663ddd996de5002 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 10 Sep 2025 17:01:40 +0600 Subject: [PATCH 151/286] build --- app/(full-page)/auth/login/page.tsx | 2 - app/(main)/course/page.tsx | 44 ++++++--------------- app/components/cards/LessonCard.tsx | 3 +- app/components/lessons/LessonTest.tsx | 4 +- app/components/tables/StreamList.tsx | 57 ++------------------------- layout/AppMenu.tsx | 4 -- services/auth.tsx | 1 - types/streamType.tsx | 10 ++++- 8 files changed, 29 insertions(+), 96 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index aaeefe43..8a5679dc 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -34,8 +34,6 @@ const LoginPage = () => { }); const onSubmit = async (value: LoginType) => { - console.log('Данные пользователя: ', value); - const user = await login(value); if (user && user.success) { document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 785c66b1..fc1a7e11 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -31,9 +31,11 @@ import { RadioButton } from 'primereact/radiobutton'; import { DataView } from 'primereact/dataview'; import { displayType } from '@/types/displayType'; import { FileWithPreview } from '@/types/fileuploadPreview'; +import { InputSwitch, InputSwitchChangeEvent } from 'primereact/inputswitch'; +import { SelectButton, SelectButtonChangeEvent } from 'primereact/selectbutton'; export default function Course() { - const { setMessage, course, setCourses, contextFetchCourse, setMainCourseId} = useContext(LayoutContext); + const { setMessage, course, setCourses, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); const [courseValue, setCourseValue] = useState({ title: '', description: '', video_url: '', image: '' }); @@ -52,25 +54,6 @@ export default function Course() { const [imageState, setImageState] = useState(null); const [displayStrem, setDisplayStreams] = useState([]); const [visible, setVisisble] = useState(false); - - [ - { - title: 'dfdj', - topic_id: 1, - lessons: [] - }, - { - title: 'r', - topic_id: 2, - lessons: [] - }, - { - title: 't', - topic_id: 3, - lessons: [] - } - ]; - const [editingLesson, setEditingLesson] = useState({ title: '', description: '', @@ -79,6 +62,8 @@ export default function Course() { created_at: '' }); + const [active, setActive] = useState(false); + const shablon = [ { created_at: '', @@ -264,7 +249,7 @@ export default function Course() { const publish = async (id: number) => { const data = await publishCourse(id); - if(data.success){ + if (data.success) { setMessage({ state: true, value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } @@ -278,8 +263,7 @@ export default function Course() { showError(data.response.status); } } - - } + }; const handleUpdateCourse = async () => { const data = await updateCourse(selectedCourse, editingLesson); @@ -367,6 +351,7 @@ export default function Course() { useEffect(() => { handleFetchCourse(); + console.log('Приходящие', course); }, [course]); useEffect(() => { @@ -429,7 +414,7 @@ export default function Course() { {/* Заголовок */}
    - setMainCourseId(shablonData.id)}> + setMainCourseId(shablonData.id)}> {shablonData.title} {/* Используем subject_name из вашего шаблона */}
    @@ -475,6 +460,8 @@ export default function Course() { ); }; + + const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); @@ -744,20 +731,13 @@ export default function Course() { header="Аталышы" style={{ width: '80%' }} body={(rowData) => ( - setMainCourseId(rowData.id)} key={rowData.id}> + setMainCourseId(rowData.id)} key={rowData.id}> {rowData.title} )} > - ( - From b13efde8905cdae802329663aa443df128652600 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 11 Sep 2025 10:53:24 +0600 Subject: [PATCH 156/286] =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BA?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BF=D1=80=D0=BE=D0=BF=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 7 +++---- app/components/lessons/LessonTest.tsx | 2 -- layout/AppMenu.tsx | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 1d406af1..1abeeb92 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -106,8 +106,7 @@ export default function LessonStep() { const handleFetchTypes = async () => { setFormVisible(true); - const data = await fetchTypes(); - + const data = await fetchTypes(); if (data && Array.isArray(data)) { setTypes(data); } else { @@ -313,11 +312,11 @@ export default function LessonStep() { }} />
    -
    +
    {types.map((item) => { return ( -
    +
    handleAddLesson(Number(lesson_id), item.id)}> {item.title} diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 58729332..a1fc11c7 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -373,8 +373,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr
    {answer.map((item, index) => { - console.log(item); - return (
    { if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any, idx: number) => ({ label: ( -
    +
    {idx + 1}. {item.title}
    ), From cb6a4c6cb83e3acc1c914958eb0796538ade4322 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 11 Sep 2025 11:06:35 +0600 Subject: [PATCH 157/286] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonPractica.tsx | 20 +++++++++++++------- schemas/lessonSchema.tsx | 3 +++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index ecfb0151..1d407b02 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -12,7 +12,6 @@ import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { getToken } from '@/utils/auth'; import { addDocument, addPractica, deleteDocument, deletePractica, fetchElement, updateDocument, updatePractica } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; @@ -271,7 +270,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle ) : (
    - setDocValue((prev) => ({ ...prev, title: e.target.value }))} /> + { + setDocValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} />
    {errors.title?.message} {additional.doc && ( @@ -298,20 +300,24 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {additional.doc && (
    { setDocValue((prev) => ({ ...prev, url: e.target.value })); - setValue('usefulLink', e.target.value, { shouldValidate: true }); + setValue('usefulLinkNotReq', e.target.value, { shouldValidate: true }); }} /> - {errors.usefulLink?.message} + {errors.usefulLinkNotReq?.message}
    )} - {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + { + setDocValue((prev) => ({ ...prev, description: e.target.value })) + setValue('title', e.target.value, { shouldValidate: true }); + }} className="w-full" /> + {errors.title?.message}
    {/*
    @@ -353,7 +332,7 @@ export default function StreamList({
    )} -
    +
    {skeleton ? ( ) : ( diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index dea6c356..7882471d 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -101,7 +101,7 @@ const AppMenu = () => { } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинирээк кайталаныз' } + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } }); if (data?.response?.status) { showError(data.response.status); @@ -133,7 +133,7 @@ const AppMenu = () => { setEditingLesson(null); setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при добавлении темы' } + value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } }); if (data?.response?.status) { showError(data.response.status); @@ -153,7 +153,7 @@ const AppMenu = () => { } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при удалении темы' } + value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } }); if (data?.response?.status) { showError(data.response.status); @@ -176,7 +176,7 @@ const AppMenu = () => { setEditingLesson(null); setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } + value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } }); if (data?.response?.status) { showError(data.response.status); @@ -207,8 +207,6 @@ const AppMenu = () => { }, [user, studentThemeCourse]); useEffect(() => { - console.log(contextThemes); - if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any, idx: number) => ({ label: ( @@ -228,13 +226,7 @@ const AppMenu = () => { } }, [contextThemes]); - useEffect(()=> { - console.log(themeValue); - },[themeValue]); - useEffect(() => { - console.log('Обновился и готов'); - if (contextStudentThemes?.lessons) { const forThemes: any = []; contextStudentThemes.lessons.data?.map((item: any) => diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 739fc847..88decc90 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -21,18 +21,16 @@ axiosInstance.interceptors.response.use( (error) => { const status = error.response?.status; - console.log('Ошибка из axiosInstance ', error); - if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - // window.location.href = '/auth/login'; - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - // localStorage.removeItem('userVisit'); + window.location.href = '/auth/login'; + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + localStorage.removeItem('userVisit'); } if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - // window.location.href = '/'; + window.location.href = '/'; } if (status === 404) { From dffb2d1c818fe6c4111b0a8db2e3e5f0162cd2f2 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 11 Sep 2025 14:24:13 +0600 Subject: [PATCH 159/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 2 + app/components/cards/LessonCard.tsx | 20 +- app/components/lessons/LessonLink.tsx | 324 ++++++++++++++++++ schemas/lessonSchema.tsx | 6 +- services/steps.tsx | 67 +++- 5 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 app/components/lessons/LessonLink.tsx diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index e7d9979b..8dc940e9 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -1,6 +1,7 @@ 'use client'; import LessonDocument from '@/app/components/lessons/LessonDocument'; +import LessonLink from '@/app/components/lessons/LessonLink'; import LessonPractica from '@/app/components/lessons/LessonPractica'; import LessonTest from '@/app/components/lessons/LessonTest'; import LessonVideo from '@/app/components/lessons/LessonVideo'; @@ -344,6 +345,7 @@ export default function LessonStep() { {element?.step.type.name === 'video' && } {element?.step.type.name === 'test' && } {element?.step.type.name === 'practical' && } + {element?.step.type.name === 'link' && }
    ); } diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 6e795ad5..9ebaa3ab 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -112,13 +112,7 @@ export default function LessonCard({ ${type.typeValue === 'video' && status === 'working' ? 'min-h-[200px]' : type.typeValue !== 'video' && status === 'working' ? 'min-h-[160px]' : ''} ${status === 'student' && type.typeValue !== 'video' ? 'min-h-[160px]' : status === 'student' && type.typeValue === 'video' ? 'min-h-[200px]' : ''} - ${type.typeValue === 'video' ? 'w-full' : ''} flex flex-col justify-evenly lesson-card-border rounded p-2 - - ${type.typeValue === 'doc' ? 'w-full min-h-[160px] bg-black' : ''} - - ${type.typeValue === 'test' ? 'w-full min-h-[160px] bg-black' : ''} - - ${type.typeValue === 'practica' ? 'w-full min-h-[160px] bg-black' : ''} + ${type.typeValue === 'video' ? 'w-full' : 'w-full'} flex flex-col justify-evenly lesson-card-border rounded p-2 `} style={{ backgroundColor: cardBg }} @@ -188,9 +182,7 @@ export default function LessonCard({ <> {status === 'student' && type.typeValue === 'doc' ? (
    -
    - {progressSpinner && } -
    +
    {progressSpinner && }
    {' '}
    )} + {type.typeValue === 'link' && ( +
    +
    + )} {status === 'working' && (
    -
    +
    +
    +
    + )} +
    + ); + }; + + useEffect(() => { + console.log('content', content); + if (content) { + setContentShow(true); + setLink(content); + } else { + setContentShow(false); + } + }, [content]); + + useEffect(() => { + console.log('edititing', element); + setLinkValue({ title: '', description: '', url: '' }); + }, [element]); + + useEffect(() => { + console.log('value ', linkValue); + }, [linkValue]); + + return ( +
    + handleUpdateLink()} + clearValues={clearValues} + visible={visible} + setVisible={setVisisble} + start={false} + > +
    +
    + { + setEditingLesson((prev) => ({ ...prev, url: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
    + { + setEditingLesson((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + {additional.link && setEditingLesson((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + +
    + {/*
    +
    +
    + {!clearProp && linkSection()} +
    + ); +} diff --git a/schemas/lessonSchema.tsx b/schemas/lessonSchema.tsx index 72ec023d..5f661de2 100644 --- a/schemas/lessonSchema.tsx +++ b/schemas/lessonSchema.tsx @@ -4,11 +4,13 @@ export const lessonSchema = yup.object().shape({ videoReq: yup .string() .required('Талап кылынат!') - .matches(/^https?:\/\/.+/, 'Видео шилтеме "http://" "https://" форматында болуш керек'), + .matches(/^https?:\/\/.+/, 'Видео шилтеме "http://" "https://" форматында болуш керек') + .max(200, 'Узундугу макс 200 тамга'), usefulLink: yup .string() .required('Талап кылынат!') - .matches(/^https?:\/\/.+/, 'Шилтеме "http://" "https://" форматында болуш керек'), + .matches(/^https?:\/\/.+/, 'Шилтеме "http://" "https://" форматында болуш керек') + .max(200, 'Узундугу макс 200 тамга'), usefulLinkNotReq: yup .string() .matches(/^https?:\/\/.+/, 'Шилтеме "http://" "https://" форматында болуш керек'), diff --git a/services/steps.tsx b/services/steps.tsx index 0c4f454b..6e9c327b 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -30,7 +30,7 @@ export const fetchSteps = async (lesson_id: number) => { export const addLesson = async (value: { lesson_id: number; type_id: number }, step: number | null) => { console.log(step); - + const formData = new FormData(); formData.append('lesson_id', String(value.lesson_id)); formData.append('type_id', String(value.type_id)); @@ -317,7 +317,7 @@ export const addPractica = async (value: { url: string | null; title: string; de export const updatePractica = async (value: { url: string | null; title: string; description: string | null; document: File | null }, lesson_id: number | null, practice_id: number, type_id: number, step_id: number) => { console.log(value); - + let formData = new FormData(); url = `/v1/teacher/practice-lesson/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&document=${value.document}&practice_id=${practice_id}&video_type_id=${type_id}&step_id=${step_id}`; formData.append('type_id', String(type_id)); @@ -358,3 +358,66 @@ export const deletePractica = async (lesson_id: number, practice_id: number, typ return err; } }; + +export const addLink = async (value: { url: string; title: string; description: string }, lesson_id: number, type_id: number, step_id: number) => { + const formData = new FormData(); + formData.append('lesson_id', String(lesson_id)); + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('url', String(value.url)); + formData.append('title', String(value.title)); + formData.append('description', String(value?.description)); + + try { + const res = await axiosInstance.post(`/v1/teacher/usefullinks/store`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } +}; + +export const deleteLink = async (lesson_id: number, link_id: number, type_id: number, step_id: number) => { + try { + const res = await axiosInstance.delete(`/v1/teacher/usefullinks/delete?lesson_id=${lesson_id}&link_id=${link_id}&step_id=${step_id}&type_id=${type_id}`); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при удалении темы', err); + return err; + } +}; + +export const updateLink = async (value: { url: string | null; title: string; description: string | null }, lesson_id: number | null, link_id: number, type_id: number, step_id: number) => { + console.log(value); + + let formData = new FormData(); + url = `/v1/teacher/usefullinks/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&link_id=${link_id}&type_id=${type_id}&step_id=${step_id}`; + formData.append('type_id', String(type_id)); + formData.append('step_id', String(step_id)); + formData.append('lesson_id', String(lesson_id)); + formData.append('link_id', String(link_id)); + formData.append('url', String(value.url)); + formData.append('title', String(value?.title)); + formData.append('description', String(value?.description)); + + try { + const res = await axiosInstance.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка при обновлении урока', err); + return err; + } +}; \ No newline at end of file From 3bd2077b0122b26fc1ce530161ff54456c9a53ea Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 11 Sep 2025 14:34:33 +0600 Subject: [PATCH 160/286] =?UTF-8?q?Skeleton=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2=20=D1=88=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 8dc940e9..55e36a60 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -8,6 +8,7 @@ import LessonVideo from '@/app/components/lessons/LessonVideo'; import { NotFound } from '@/app/components/NotFound'; import PDFViewer from '@/app/components/PDFBook'; import FormModal from '@/app/components/popUp/FormModal'; +import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -46,7 +47,7 @@ export default function LessonStep() { const [themeNull, setThemeNull] = useState(false); const [lesson_id, setLesson_id] = useState((param.lesson_id && Number(param.lesson_id)) || null); const [sequence_number, setSequence_number] = useState(null); - + const [skeleton, setSkeleton] = useState(false); const [testovy, setTestovy] = useState(false); const router = useRouter(); const pathname = usePathname(); @@ -76,10 +77,13 @@ export default function LessonStep() { const handleFetchTypes = async () => { setFormVisible(true); + setSkeleton(true); const data = await fetchTypes(); if (data && Array.isArray(data)) { setTypes(data); + setSkeleton(false); } else { + setSkeleton(false); setMessage({ state: true, value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } @@ -279,20 +283,24 @@ export default function LessonStep() { }} />
    -
    - {types.map((item) => { - return ( - -
    - - handleAddLesson(Number(lesson_id), item.id)}> - {item.title} - -
    -
    - ); - })} -
    + {skeleton ? ( + + ) : ( +
    + {types.map((item) => { + return ( + +
    + + handleAddLesson(Number(lesson_id), item.id)}> + {item.title} + +
    +
    + ); + })} +
    + )}
    From 853d53c03c37115d35aaa703b7708a967bac639a Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 12 Sep 2025 12:08:43 +0600 Subject: [PATCH 161/286] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 3 +- .../course/[course_Id]/[lesson_id]/page.tsx | 5 +- app/components/BaseLayout.tsx | 2 +- app/components/PDFBook.tsx | 6 +-- app/components/SessionManager.tsx | 50 ++----------------- app/components/cards/LessonCard.tsx | 20 ++++---- app/components/lessons/LessonDocument.tsx | 3 -- app/components/lessons/LessonPractica.tsx | 12 ++--- app/components/lessons/LessonVideo.tsx | 2 +- layout/AppMenu.tsx | 8 +-- layout/AppTopbar.tsx | 7 ++- services/steps.tsx | 6 ++- utils/axiosInstance.tsx | 33 +++++++----- 13 files changed, 59 insertions(+), 98 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 8a5679dc..c1a1e60d 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -41,9 +41,9 @@ const LoginPage = () => { const token = user.token.access_token; if (token) { const res = await getUser(); + try { if (res?.success) { - console.log(res); if (res?.user.is_working) { window.location.href = '/course'; } @@ -108,7 +108,6 @@ const LoginPage = () => { } /> {errors.password && {errors.password.message}} diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 55e36a60..d2f177bc 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -52,8 +52,6 @@ export default function LessonStep() { const router = useRouter(); const pathname = usePathname(); - const clearValues = () => {}; - const changeUrl = (lessonId: number) => { router.replace(`/course/${course_id}/${lessonId ? lessonId : null}`); }; @@ -236,7 +234,7 @@ export default function LessonStep() { console.log('variant 4', contextThemes.lessons.data[0].id); handleFetchSteps(contextThemes.lessons.data[0].id); setLesson_id(contextThemes.lessons.data[0].id); - setDeleteQuery(false); + setDeleteQuery(false); } else { console.log('variant 5'); handleShow(Number(param.lesson_id)); @@ -268,7 +266,6 @@ export default function LessonStep() { onHide={() => { if (!formVisible) return; setFormVisible(false); - clearValues(); }} >
    diff --git a/app/components/BaseLayout.tsx b/app/components/BaseLayout.tsx index 78eb0b27..4faf15fc 100644 --- a/app/components/BaseLayout.tsx +++ b/app/components/BaseLayout.tsx @@ -7,7 +7,7 @@ import { useEffect } from 'react'; export default function BaseLayout() { // useEffect(() => { - // window.location.href = 'http://oldmooc.oshsu.kg/'; // твоя ссылка + // window.location.href = 'http://oldmooc.oshsu.kg/'; // }, []); // return null; // ничего не показываем diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index f6b056ca..938c4807 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -30,16 +30,14 @@ export default function PDFViewer({ url }: { url: string }) { useEffect(() => { const renderPDF = async () => { + console.log(url); + if (!url) return; setSkeleton(true); try { // Проверяем, одна ли страница в документе - const forUrl = new RegExp('https:'); let newUrl = `https://api.mooc.oshsu.kg/temprory-file/${url}`; - if(forUrl.test(url)){ - newUrl = url; - } console.log(newUrl); const pdf = await pdfjsLib.getDocument(newUrl).promise; const tempPages = []; diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 0e519760..44c3883e 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -15,15 +15,6 @@ const SessionManager = () => { const pathname = usePathname(); useEffect(() => { - console.log('Пользователь ', user); - }, [user]); - - useEffect(() => { - setGlobalLoading(true); - setTimeout(() => { - setGlobalLoading(false); - }, 2000); - const init = async () => { console.log('проверяем токен...'); const token = getToken('access_token'); @@ -69,55 +60,24 @@ const SessionManager = () => { }, []); useEffect(() => { - if(!pathname.startsWith('/teaching/lesson/')){ + if(!pathname.startsWith('/teaching/lesson/') && !pathname.startsWith('/course/')){ setGlobalLoading(true); } - console.log('Переход в', pathname); + const token = getToken('access_token'); if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - // logout({ setUser, setGlobalLoading }); - // window.location.href = '/auth/login'; + logout({ setUser, setGlobalLoading }); + window.location.href = '/auth/login'; return; } setTimeout(() => { setGlobalLoading(false); - }, 1000); + }, 900); }, [pathname]); - // useEffect(() => { - // const checkToken = () => { - // const token = getToken('access_token'); - - // if (!token) { - // const userVisit = localStorage.getItem('userVisit'); - // if(userVisit){ - // setMessage({ - // state: true, - // value: { severity: 'error', summary: 'Сессия завершилось', detail: 'Войдите заново' } - // }); // messege - Время сесси завершилось - // } - // logout({setUser, setGlobalLoading}); - // console.log('Токен отсутствует - завершаем сессию'); - // return false; // сигнал для остановки интервала - // } - // return true; - // }; - - // // немедленная проверка - // if (!checkToken()) return; - - // const interval = setInterval(() => { - // if (!checkToken()) { - // clearInterval(interval); - // } - // }, 5000); - - // return () => clearInterval(interval); - // }, []); - return null; }; diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 9ebaa3ab..eb7ec105 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -46,8 +46,8 @@ export default function LessonCard({ const [progressSpinner, setProgressSpinner] = useState(false); // useEffect(()=> { - // console.log(cardValue.photo); - // },[cardValue]); + // console.log(urlForDownload); + // },[urlForDownload]); const media = useMediaQuery('(max-width: 640px)'); const toggleSpinner = () => { @@ -117,11 +117,11 @@ export default function LessonCard({ `} style={{ backgroundColor: cardBg }} > -
    +
    {/*
    {!cardValue.photo && }
    */} -
    - {shortTitle} +
    + {shortTitle} {cardValue.score ? (
    {!media && '/'} Балл: @@ -139,12 +139,12 @@ export default function LessonCard({ Шилтеме: - {shortUrl} + {cardValue?.url}
    ) : ( type.typeValue === 'link' && ( <> - {shortUrl} + {shortUrl} ) )} @@ -163,12 +163,12 @@ export default function LessonCard({ })}
    )} -
    +
    {cardValue?.desctiption && cardValue?.desctiption !== 'null' ? shortDescription : cardValue?.desctiption && cardValue?.desctiption !== 'null' && type.typeValue === 'practica' ?
    {shortDescription}
    : ''}
    {status === 'working' && ( -
    )} - {type.typeValue === 'practica' && ( + {type.typeValue === 'practica' && urlForDownload.length > 1 && (
    {' '} diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index ac9f2424..8be4951d 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -182,8 +182,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle // delete document const handleDeleteDoc = async (id: number) => { - console.log(id); - // const token = getToken('access_token'); const data = await deleteDocument(Number(document?.lesson_id), id); if (data.success) { @@ -369,7 +367,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle className="w-full" value={editingLesson?.title && editingLesson?.title} onChange={(e) => { - console.log(editingLesson); setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); setValue('title', e.target.value, { shouldValidate: true }); }} diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 85ce7846..12848ec1 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -246,8 +246,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle type={{ typeValue: 'practica', icon: 'pi pi-list' }} typeColor={'var(--mainColor)'} lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} - urlForPDF={() => sentToPDF(document.document_path || '')} - urlForDownload={document.document_path || ''} + urlForPDF={() => sentToPDF('')} + urlForDownload={document.document ? document.document_path : ''} /> ) )} @@ -345,8 +345,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle }, [element]); useEffect(() => { - console.log('value ', docValue); - }, [docValue]); + console.log('value ', editingLesson); + }, [editingLesson]); return (
    @@ -362,8 +362,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle >
    -
    - { +
    + { setEditingLesson((prev) => prev && { ...prev, title: e.target.value }) setValue('title', e.target.value, { shouldValidate: true }); }} /> diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index 1efebd26..ae276bff 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -377,7 +377,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP onSelected={(id: number, type: string) => selectedForEditing(id, type)} onDelete={(id: number) => handleDeleteVideo(id)} cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} - cardBg={'white'} + cardBg={'#ddc4f51a'} type={{ typeValue: 'video', icon: 'pi pi-video' }} typeColor={'var(--mainColor)'} lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 7882471d..862ab2d7 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -209,11 +209,7 @@ const AppMenu = () => { useEffect(() => { if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any, idx: number) => ({ - label: ( -
    - {idx + 1}. {item.title} -
    - ), + label: `${idx + 1}. ${item.title}`, id: item.id, to: `/course/${course_Id}/${item.id}`, onEdit: () => { @@ -231,7 +227,7 @@ const AppMenu = () => { const forThemes: any = []; contextStudentThemes.lessons.data?.map((item: any) => forThemes.push({ - label: item.title, + label: item.title || '', id: item.id, to: `/teaching/${studentThemeCourse}/${item.id}` }) diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 7712c7e2..f3e3259d 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -110,6 +110,7 @@ const AppTopbar = forwardRef((props, ref) => { logo

    Цифровой кампус ОшГУ

    + (в разработке) {pathName !== '/' && pathName !== '/course' ? (
    )} - {user && user ? ( + {/* {user && user ? (
    @@ -161,9 +162,11 @@ const AppTopbar = forwardRef((props, ref) => {
    - )} + )} */}
    + + (в разработке)
    ); }); diff --git a/services/steps.tsx b/services/steps.tsx index 6e9c327b..d65b7f2c 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -115,7 +115,11 @@ export const updateDocument = async (token: string | null, lesson_id: number | n formData.append('type_id', String(type_id)); formData.append('step_id', String(step_id)); formData.append('lesson_id', String(lesson_id)); - formData.append('document', value.file); + if(value.file){ + formData.append('document', value.file) + } else { + formData.append('document', ''); + } formData.append('document_id', String(contentId)); formData.append('title', String(value.title)); formData.append('description', String(value.description)); diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 88decc90..3a83ad58 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -3,15 +3,15 @@ import { getToken } from './auth'; const axiosInstance = axios.create({ baseURL: process.env.NEXT_PUBLIC_BASE_URL, - timeout: 30000, + timeout: 30000 }); axiosInstance.interceptors.request.use((config) => { - const token = getToken('access_token'); - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } - return config; + const token = getToken('access_token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; }); axiosInstance.interceptors.response.use( @@ -19,25 +19,32 @@ axiosInstance.interceptors.response.use( return response; }, (error) => { - const status = error.response?.status; if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - window.location.href = '/auth/login'; + if (typeof window !== 'undefined') { + window.location.href = '/auth/login'; + localStorage.removeItem('userVisit'); + } else { + console.log('SSR — window недоступен'); + } document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - localStorage.removeItem('userVisit'); } if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - window.location.href = '/'; + if (typeof window !== 'undefined') { + window.location.href = '/'; + } } - + if (status === 404) { console.warn('404 - Перенаправляю...'); - // window.location.href = '/pages/notfound'; + if (typeof window !== 'undefined') { + // window.location.href = '/pages/notfound'; + // localStorage.removeItem('userVisit'); + } // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; - // localStorage.removeItem('userVisit'); } return Promise.reject(error); From d74a879b2fd4069205d37fee4e8beac4e11bfac9 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 12 Sep 2025 12:10:54 +0600 Subject: [PATCH 162/286] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=B2=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/AppTopbar.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index f3e3259d..303d72fc 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -123,7 +123,8 @@ const AppTopbar = forwardRef((props, ref) => {
    {media ? ( - + <> + // ) : (
    {/* From d5f4039ca156ffc4679761fa28c3b39e2caea43d Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 12 Sep 2025 15:32:00 +0600 Subject: [PATCH 163/286] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=88=D0=B0=D0=B3=D0=BE=D0=B2,=20=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=B4=D1=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 26 ++-- app/(main)/course/page.tsx | 72 +++++---- app/(main)/pdf/[pdfUrl]/page.tsx | 26 +++- app/components/PDFBook.tsx | 141 ++++++++++-------- app/components/SessionManager.tsx | 4 +- app/components/cards/LessonCard.tsx | 4 +- app/components/lessons/LessonDocument.tsx | 5 +- app/components/lessons/LessonLink.tsx | 4 +- app/components/lessons/LessonPractica.tsx | 4 +- app/components/lessons/LessonTest.tsx | 4 +- app/components/lessons/LessonVideo.tsx | 4 +- app/components/popUp/FormModal.tsx | 45 ++---- app/globals.css | 8 +- utils/axiosInstance.tsx | 20 ++- 14 files changed, 195 insertions(+), 172 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index d2f177bc..211ceb0e 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -234,7 +234,7 @@ export default function LessonStep() { console.log('variant 4', contextThemes.lessons.data[0].id); handleFetchSteps(contextThemes.lessons.data[0].id); setLesson_id(contextThemes.lessons.data[0].id); - setDeleteQuery(false); + setDeleteQuery(false); } else { console.log('variant 5'); handleShow(Number(param.lesson_id)); @@ -328,16 +328,6 @@ export default function LessonStep() { > + - {!hasSteps && ( -
    @@ -346,6 +336,20 @@ export default function LessonStep() {
    )} +
    + {element?.step.type.title} + {!hasSteps && ( +
    {element?.step.type.name === 'document' && } {element?.step.type.name === 'video' && } {element?.step.type.name === 'test' && } diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 0144110e..0b51eb34 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -389,38 +389,15 @@ export default function Course() { {/* modal window */}
    -
    - {/* {imagestateStyle && ( */} -
    - {/* {typeof imageState === 'string' && } */} - {typeof imageState === 'string' ? : } -
    - {/* )} */} -
    - - - {courseValue.image || editingLesson.image ? ( -
    - {typeof editingLesson.image === 'string' && ( - <> - {imageTitle} - - )} -
    - ) : ( - jpeg, png, jpg - )} -
    {(editingLesson.image || imageState) &&
    -
    -
    {/*
    */}
    -
    +
    { editMode ? setEditingLesson((prev) => ({ @@ -438,12 +415,13 @@ export default function Course() {
    -
    +
    { editMode ? setEditingLesson((prev) => ({ @@ -464,14 +442,14 @@ export default function Course() { {/*
    */}
    -
    +
    { editMode ? setEditingLesson((prev) => ({ @@ -488,6 +466,42 @@ export default function Course() {
    {/*
    */} + +
    + {/* {imagestateStyle && ( */} +
    + {/* {typeof imageState === 'string' && } */} + {typeof imageState === 'string' ? : } +
    + {/* )} */} +
    + + + {courseValue.image || editingLesson.image ? ( +
    + {typeof editingLesson.image === 'string' && ( + <> + {imageTitle} + + )} +
    + ) : ( + jpeg, png, jpg + )} +
    {(editingLesson.image || imageState) &&
    +
    +
    diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 02c8e582..da48f26e 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -2,18 +2,28 @@ // import PDFViewer from '@/app/components/PDFBook'; // import PDFViewer from '../PDFBook'; -import dynamic from "next/dynamic"; +import dynamic from 'next/dynamic'; +import Link from 'next/link'; -const PDFViewer = dynamic(()=> import('@/app/components/PDFBook'), { - ssr: false, -}) +const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { + ssr: false +}); -import { useParams } from 'next/navigation'; +import { useParams, useRouter } from 'next/navigation'; export default function PdfUrlViewer() { const { pdfUrl } = useParams(); + const router = useRouter(); - return
    - -
    ; + return ( +
    + + +
    + +
    +
    + ); } diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index 938c4807..c2b070a9 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -31,7 +31,7 @@ export default function PDFViewer({ url }: { url: string }) { useEffect(() => { const renderPDF = async () => { console.log(url); - + if (!url) return; setSkeleton(true); @@ -128,30 +128,84 @@ export default function PDFViewer({ url }: { url: string }) { return (
    - {hasPdf ? ( - - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : media ? ( - <> +
    + {hasPdf ? ( + + ) : ( + <> + {skeleton ? ( +
    + +
    + ) : media ? ( + <> + {}} + onChangeOrientation={() => {}} + onChangeState={() => {}} + onInit={() => {}} + onUpdate={() => {}} + startPage={0} + drawShadow={true} + flippingTime={900} + showPageCorners={true} + disableFlipByClick={false} + > + {pages.map((page, index) => ( +
    +
    + {' '} + {/* Добавляем класс для содержимого страницы */} + {page} +
    +
    + ))} +
    + + ) : ( ))} - - ) : ( - {}} - onChangeOrientation={() => {}} - onChangeState={() => {}} - onInit={() => {}} - onUpdate={() => {}} - startPage={0} - drawShadow={true} - flippingTime={900} - showPageCorners={true} - disableFlipByClick={false} - > - {pages.map((page, index) => ( -
    -
    - {' '} - {/* Добавляем класс для содержимого страницы */} - {page} -
    -
    - ))} -
    - )} - - )} + )} + + )} +
    - //
    ); } diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 44c3883e..c149813e 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -69,8 +69,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - logout({ setUser, setGlobalLoading }); - window.location.href = '/auth/login'; + // logout({ setUser, setGlobalLoading }); + // window.location.href = '/auth/login'; return; } setTimeout(() => { diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index eb7ec105..db7879e4 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -193,7 +193,7 @@ export default function LessonCard({ {type.typeValue === 'doc' && (
    -
    @@ -212,7 +212,7 @@ export default function LessonCard({ )} {type.typeValue === 'link' && (
    -
    )} diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 8be4951d..86b9e5bb 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -229,11 +229,11 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const documentSection = () => { return ( -
    +
    {PDFVisible ? ( documentView ) : contentShow ? ( -
    +
    {docShow ? ( @@ -325,7 +325,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle }, [content]); useEffect(() => { - console.log('edititing', element); setDocValue({ title: '', description: '', file: null }); }, [element]); diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index a0ded0f2..e6f671df 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -176,9 +176,9 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const linkSection = () => { return ( -
    +
    {contentShow ? ( -
    +
    {docShow ? ( diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 12848ec1..e85269df 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -227,11 +227,11 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const practicaSection = () => { return ( -
    +
    {PDFVisible ? ( documentView ) : contentShow ? ( -
    +
    {docShow ? ( diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 8dfdb492..bb1ec435 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -207,9 +207,9 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const optionAddBtn = answer.length > 2 && answer[answer.length - 1].text.length < 1; const testSection = () => { return ( -
    +
    {contentShow ? ( -
    +
    {testShow ? ( diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index ae276bff..b1e0130a 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -282,7 +282,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const videoSection = () => { return ( -
    +
    {!contentShow ? (
    @@ -345,7 +345,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    ) : ( -
    +
    {
    - - ) : ( - <> - -
    - )} -
    - ) : ( - lessonInfo - )} - */} - - {/* DOC */} - - { } - {/* */} - - - {/* USEFUL LINKS */} - - {contentShow && } - - - {/* VIDEO */} - - {contentShow && } - {/* && ( -
    -
    - -
    -
    - ) */} -
    - -
    - ); -} diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 211ceb0e..3279ab58 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -337,7 +337,7 @@ export default function LessonStep() {
    )}
    - {element?.step.type.title} + {!hasSteps && {element?.step.type.title}} {!hasSteps && (
    @@ -525,7 +526,7 @@ export default function Course() { pt={{ headerAction: { className: 'font-italic ' } }} - header="Курстар" + header="Курсы" className=" p-tabview p-tabview-nav p-tabview-selected p-tabview-panels p-tabview-panel" > {/* mobile table section */} @@ -534,7 +535,7 @@ export default function Course() { <>
    +
    */} + { + console.log(e.target.files); + const file = e.target.files?.[0]; + if (file) { + setDocValue((prev) => ({ + ...prev, + file: file + })); + } + }} + /> {selectType === 'doc' ? ( <> -
    + {/*
    +
    */} + { + console.log(e.target.files); + const file = e.target.files?.[0]; + if (file) { + setEditingLesson( + (prev) => + prev && { + ...prev, + file: file + } + ); + } + }} + /> {/* {String(editingLesson?.file[0].objectURL)} */} ) : selectType === 'video' ? ( - <> - + <> ) : ( '' )} diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index e85269df..6798444d 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -263,25 +263,40 @@ export default function LessonPractica({ element, content, fetchPropElement, cle
    {errors.title?.message} {additional.doc && ( -
    - {}} - accept="application/pdf" - onSelect={(e) => - setDocValue((prev) => ({ - ...prev, - document: e.files[0] - })) - } - /> -
    + //
    + // {}} + // accept="application/pdf" + // onSelect={(e) => + // setDocValue((prev) => ({ + // ...prev, + // document: e.files[0] + // })) + // } + // /> + //
    + { + console.log(e.target.files); + const file = e.target.files?.[0]; + if(file){ + setDocValue((prev) => ({ + ...prev, + document: file + })) + } + }} + /> )} {additional.doc && (
    diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index b1e0130a..7272b317 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -104,6 +104,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const [contentShow, setContentShow] = useState(false); + const [videoVisible, setVideoVisible] = useState(false); const clearFile = () => { fileUploadRef.current?.clear(); @@ -161,6 +162,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP // return `https://www.youtube.com/embed/${videoId}`; setVideoLink(`https://www.youtube.com/embed/${videoId}`); setVideoCall(true); + // setVisisble(true); }; // validate @@ -347,7 +349,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP ) : (
    -
    - + */} {videoShow ? ( ) : ( - video && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteVideo(id)} - cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'video', icon: 'pi pi-video' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} - urlForPDF={() => ''} - urlForDownload="" - videoVisible={() => handleVideoCall(String(video?.link))} - /> - ) + <> + {!videoCall ? ( + video && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteVideo(id)} + cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'video', icon: 'pi pi-video' }} + typeColor={'va r(--mainColor)'} + lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} + urlForPDF={() => ''} + urlForDownload="" + videoVisible={() => handleVideoCall(String(video?.link))} + /> + ) + ) : ( +
    +
    + setVideoCall(false)}> +
    + +
    + )} + )}
    diff --git a/app/components/popUp/FormModal.tsx b/app/components/popUp/FormModal.tsx index cdf245b3..bc25ce7e 100644 --- a/app/components/popUp/FormModal.tsx +++ b/app/components/popUp/FormModal.tsx @@ -27,7 +27,7 @@ export default function FormModal({ const footerContent = (
    + ); + return ( <> + { + if (!visible) return; + setVisible(false); + // clearValues(); + }} + footer={footerContent} + > + { + + rowIndex + 1} header="Номер"> + {/* */} + +

    {rowData.subject_name.name_ru}

    }>
    + +

    {rowData.language.name}

    }>
    + +

    20{rowData.id_edu_year}

    }>
    +

    {rowData.period.name_ru}

    }>
    + +

    {rowData.semester.name_ru}

    }>
    + +

    {rowData.subject_type_name.short_name_ru}

    }>
    + + ( + <> + + + )} + > +
    + } +
    {callIndex === 1 && (
    {skeleton ? ( @@ -294,17 +358,21 @@ export default function StreamList({ <> {/* info section */} {!isMobile && ( -
    - - Курс связанный с потокам: {courseValue?.title} - -
    )} @@ -317,11 +385,12 @@ export default function StreamList({ {isMobile && (
    )} -
    +
    {skeleton ? ( ) : ( <> - +
    + +
    )}
    diff --git a/styles/layout/forms.css b/styles/layout/forms.css index a457ddc6..4d93cefb 100644 --- a/styles/layout/forms.css +++ b/styles/layout/forms.css @@ -1,4 +1,3 @@ -/* Сброс стандартного radio */ .custom-radio input[type="radio"] { appearance: none; /* Убираем нативный стиль */ -webkit-appearance: none; @@ -58,6 +57,70 @@ /* box-shadow: inset 4px 4px 7px 9px var(--mainColor) ; */ } + /* Для курсого инпута */ + +.custom-course-radio input[type="radio"] { + appearance: none; /* Убираем нативный стиль */ + -webkit-appearance: none; + position: absolute; + opacity: 0; + pointer-events: none; +} + +/* Контейнер */ +.custom-course-radio { + display: inline-flex; + align-items: center; + cursor: pointer; + font-family: sans-serif; + font-size: 14px; + gap: 8px; + position: relative; + padding: 4px 7px; + transition: color 0.3s; +} + +/* Сам кружок */ +.radio-course-mark { + /* width: 18px; + height: 18px; */ + border: 2px solid var(--mainColor); + /* border-radius: 50%; */ + display: inline-block; + position: relative; + transition: all 0.3s ease; +} + +/* Внутренняя точка при выборе */ +.radio-course-mark::after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 100%; + background-color: var(--mainColor); + /* box-shadow: inset 4px 4px 7px 9px var(--mainColor) ; */ + + border-radius: 50%; + transform: translate(-50%, -50%) scale(0); + transition: transform 0.2s ease; + z-index: -2; +} + +/* Когда radio-course выбран */ +.custom-course-radio input[type="radio"]:checked + .radio-course-mark { + /* transform: translate(-50%, -50%) scale(1); */ + background-color: var(--mainColor); + color: white; +} + +/* Фокус */ +.custom-course-radio input[type="radio"]:focus + .radio-course-mark { + border: solid 2px rgba(48, 169, 193, 0.3); + box-shadow: inset 4px 4px 7px 9px var(--mainColor) ; +} + /* checkbox */ .customCheckbox { diff --git a/types/mainStreamsType.tsx b/types/mainStreamsType.tsx new file mode 100644 index 00000000..fefeedce --- /dev/null +++ b/types/mainStreamsType.tsx @@ -0,0 +1,17 @@ +export interface mainStreamsType { + connect_id: number | null; + stream_id: number; + id_curricula: number; + subject_name: { name_ru: string; id: number }; + subject_type_name: { name_ru: string; short_name_ru: string; id: number }; + teacher: { name: string }; + language: { name: string }; + id_edu_year: number; + id_period: number; + semester: { name_ru: string }; + edu_form: { name_ru: string }; + period: { name_ru: string }; + courseValue?: number; + speciality: { id: number; id_faculty: number }; + course_id?: number | null; +} diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index ea7be095..0441957b 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -22,27 +22,27 @@ axiosInstance.interceptors.response.use( const status = error.response?.status; if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - if (typeof window !== 'undefined') { - window.location.href = '/auth/login'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/auth/login'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/'; - } + // if (typeof window !== 'undefined') { + // window.location.href = '/'; + // } } if (status === 404) { console.warn('404 - Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/pages/notfound'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/pages/notfound'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 6dc5ecc66f7480899a3d8bf507cd34ac5368106f Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 15 Sep 2025 17:08:27 +0600 Subject: [PATCH 167/286] =?UTF-8?q?=D0=9F=D1=83=D0=B1=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=84=D0=B5=D0=B4=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 23 +- .../course/[course_Id]/[lesson_id]/page.tsx | 50 +++-- app/(main)/course/page.tsx | 61 ++--- app/(main)/faculty/[id_kafedra]/page.tsx | 211 ++++++++++++++++++ app/(main)/faculty/page.tsx | 115 ++++++++++ app/components/NotFound.tsx | 2 +- app/components/SessionManager.tsx | 15 +- app/components/tables/StreamList.tsx | 20 +- app/globals.css | 160 ++++++++++++- layout/AppMenu.tsx | 53 +++-- layout/AppTopbar.tsx | 37 +-- layout/context/layoutcontext.tsx | 8 +- services/courses.tsx | 115 +++++----- services/faculty.tsx | 41 ++++ styles/layout/forms.css | 8 +- types/layout.d.ts | 7 +- utils/axiosInstance.tsx | 26 +-- 17 files changed, 772 insertions(+), 180 deletions(-) create mode 100644 app/(main)/faculty/[id_kafedra]/page.tsx create mode 100644 app/(main)/faculty/page.tsx create mode 100644 services/faculty.tsx diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 65476cdd..c71d1c70 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable @next/next/no-img-element */ 'use client'; import { useRouter } from 'next/navigation'; -import React, { useContext, useState } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { Password } from 'primereact/password'; import { LayoutContext } from '../../../../layout/context/layoutcontext'; import { InputText } from 'primereact/inputtext'; @@ -17,7 +17,7 @@ import { LoginType } from '@/types/login'; import { useMediaQuery } from '@/hooks/useMediaQuery'; const LoginPage = () => { - const { layoutConfig, setUser, setMessage, setGlobalLoading } = useContext(LayoutContext); + const { layoutConfig, setUser, setMessage, setGlobalLoading, setDepartament, departament } = useContext(LayoutContext); const router = useRouter(); const media = useMediaQuery('(max-width: 1030px)'); @@ -39,13 +39,23 @@ const LoginPage = () => { document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; const token = user.token.access_token; if (token) { - const res = await getUser(); + const res = await getUser(); console.log(res); try { if (res?.success) { if (res?.user.is_working) { - window.location.href = '/course'; + if(res.roles && res.roles.length > 0){ + const roleCheck = res.roles.find((i:{id_role: number})=> i.id_role) + if(roleCheck){ + setDepartament({info: roleCheck.roles_name.info_ru, last_name:res.user?.last_name, name:res?.user.name, father_name:res.user?.father_name}); + window.location.href = '/faculty'; + } else { + window.location.href = '/course'; + } + } else { + window.location.href = '/course'; + } } if(res?.user.is_student){ window.location.href = '/'; @@ -84,6 +94,11 @@ const LoginPage = () => { }); // messege - Ошибка при авторизации }; + useEffect(()=> { + console.log(departament); + + },[departament]); + return (
    {/*
    */} diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 3279ab58..219259fa 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -26,7 +26,7 @@ import { Button } from 'primereact/button'; import { confirmDialog } from 'primereact/confirmdialog'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; -import React, { useContext, useEffect, useState } from 'react'; +import React, { useContext, useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; export default function LessonStep() { @@ -93,10 +93,12 @@ export default function LessonStep() { }; const handleFetchSteps = async (lesson_id: number) => { + setSkeleton(true); const data = await fetchSteps(Number(lesson_id)); console.log('steps', data); if (data.success) { + setSkeleton(false); if (data.steps.length < 1) { setHasSteps(true); } else { @@ -104,6 +106,7 @@ export default function LessonStep() { setSteps(data.steps); } } else { + setSkeleton(false); setHasSteps(false); setMessage({ state: true, @@ -116,6 +119,7 @@ export default function LessonStep() { }; const handleAddLesson = async (lessonId: number, typeId: number) => { + setFormVisible(false); const data = await addLesson({ lesson_id: lessonId, type_id: typeId }, sequence_number); console.log(data); @@ -134,7 +138,6 @@ export default function LessonStep() { showError(data.response.status); } } - setFormVisible(false); }; const handleFetchElement = async (stepId: number) => { @@ -256,6 +259,23 @@ export default function LessonStep() { ); } + const scrollRef = useRef(null); + + useEffect(() => { + const el = scrollRef.current; + if (!el) return; + + const onWheel = (e: WheelEvent) => { + if (e.deltaY !== 0) { + e.preventDefault(); + el.scrollLeft += e.deltaY; // прокрутка по горизонтали + } + }; + + el.addEventListener('wheel', onWheel, { passive: false }); + return () => el.removeEventListener('wheel', onWheel); + }, []); + return (
    {/* modal sectoin */} @@ -311,14 +331,18 @@ export default function LessonStep() {
    ) : ( -
    - {steps.map((item, idx) => { - return ( -
    - {step(item.type.logo, item.id, idx)} -
    - ); - })} +
    + {skeleton ? ( +
    + ) : ( + steps.map((item, idx) => { + return ( +
    + {step(item.type.logo, item.id, idx)} +
    + ); + }) + )}
    )}
    @@ -336,12 +360,12 @@ export default function LessonStep() {
    )} -
    - {!hasSteps && {element?.step.type.title}} +
    + {!hasSteps && {element?.step.type.title}} {!hasSteps && (
    @@ -561,7 +539,7 @@ export default function Course() { }} /> + ) : ( + + )} + {progressSpinner && } +
    + )} + > + +
    + )} +
    + ); + })} + + {notCourse.length > 0 && ( +
    +

    Курсы отсутствуют:

    + + rowIndex + 1} header="#"> + ( +

    + {rowData.last_name} {rowData.name} {rowData.father_name} +

    + )} + >
    +
    +
    + )} + + )} +
    + ); +} diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx new file mode 100644 index 00000000..64486ff3 --- /dev/null +++ b/app/(main)/faculty/page.tsx @@ -0,0 +1,115 @@ +'use client'; + +import { NotFound } from '@/app/components/NotFound'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import { fetchFaculty, fetchKafedra } from '@/services/faculty'; +import Link from 'next/link'; +import { Column } from 'primereact/column'; +import { DataTable } from 'primereact/datatable'; +import { Dropdown, DropdownChangeEvent } from 'primereact/dropdown'; +import { useContext, useEffect, useState } from 'react'; + +export default function Faculty() { + interface City { + id: number | null; + name_ru: string; + id_faculty?: number | null; + } + + const showError = useErrorMessage(); + const { setMessage } = useContext(LayoutContext); + + const [selected, setSelected] = useState(null); + const [faculty, setFaculty] = useState([{ name_ru: '', id: null }]); + const [kafedra, setKafedra] = useState([{ name_ru: '', id: null }]); + const [selectShow, setSelectShow] = useState(false); + const [facultyShow, setFacultyShow] = useState(false); + + const handleFetchFaculty = async () => { + const data = await fetchFaculty(); + if (data && Array.isArray(data)) { + const newFaculty = data.map((item) => { + return { name_ru: item.name_ru, id: item.id }; + }); + setFaculty(newFaculty); + + if (newFaculty.length > 0) { + setSelected(newFaculty[0]); + setSelectShow(false); + } else { + setSelectShow(true); + } + } else { + setSelectShow(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleFetchKafedra = async () => { + if (selected) { + const data = await fetchKafedra(selected && selected.id); + console.log(data); + + if (data && Array.isArray(data)) { + setKafedra(data); + setFacultyShow(false); + } else { + setFacultyShow(true); + } + } + }; + + useEffect(() => { + handleFetchFaculty(); + }, []); + + useEffect(() => { + handleFetchKafedra(); + }, [selected]); + + useEffect(() => { + console.log(kafedra); + }, [kafedra]); + + return ( +
    +
    + {selectShow ? ( +

    Факультеты временно не доступны

    + ) : ( +
    + setSelected(e.value)} options={faculty} optionLabel="name_ru" className="w-[90%] overflow-x-auto" panelClassName="w-[50%] overflow-x-scroll" /> +
    + )} +
    + {/* data table */} +
    +

    Кафедры

    + {facultyShow ? ( + + ) : ( + + rowIndex + 1} header="#" style={{ width: '20px' }}> + ( + + {rowData.name_ru} + + )} + > + + )} +
    +
    + ); +} diff --git a/app/components/NotFound.tsx b/app/components/NotFound.tsx index 74b4e906..6eafe78c 100644 --- a/app/components/NotFound.tsx +++ b/app/components/NotFound.tsx @@ -11,7 +11,7 @@ export const NotFound = ({ titleMessage }: { titleMessage: string }) => {

    {titleMessage}

    {/* */} - Башкы баракчага кайтуу + Перейти в главную страницу
    diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 695a1a0d..0d8bf0fe 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -9,7 +9,7 @@ import { usePathname } from 'next/navigation'; const SessionManager = () => { const { setMessage } = useContext(LayoutContext); - const { user, setUser } = useContext(LayoutContext); + const { user, setUser, departament, setDepartament } = useContext(LayoutContext); const { setGlobalLoading } = useContext(LayoutContext); const pathname = usePathname(); @@ -27,7 +27,12 @@ const SessionManager = () => { setGlobalLoading(false); }, 1000); console.log('Данные пользователя успешно пришли ', res); - + if (res.roles && res.roles.length > 0) { + const roleCheck = res.roles.find((i: { id_role: number }) => i.id_role); + if (roleCheck) { + setDepartament({ info: roleCheck.roles_name.info_ru, last_name: res.user?.last_name, name: res?.user.name, father_name: res.user?.father_name }); + } + } const userVisit = localStorage.getItem('userVisit'); if (!userVisit) { localStorage.setItem('userVisit', JSON.stringify(true)); @@ -60,7 +65,7 @@ const SessionManager = () => { }, []); useEffect(() => { - if(!pathname.startsWith('/teaching/lesson/') && !pathname.startsWith('/course/')){ + if (!pathname.startsWith('/teaching/lesson/') && !pathname.startsWith('/course/')) { setGlobalLoading(true); } @@ -69,8 +74,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - // logout({ setUser, setGlobalLoading }); - // window.location.href = '/auth/login'; + logout({ setUser, setGlobalLoading }); + window.location.href = '/auth/login'; setGlobalLoading(false); return; } diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index ea81d14b..9cd5f0c3 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -28,7 +28,6 @@ export default function StreamList({ insideDisplayStreams: (id: mainStreamsType[]) => void; toggleIndex: () => void; }) { - const [streams, setStreams] = useState([]); const [displayStreams, setDisplayStreams] = useState([]); const [hasStreams, setHasStreams] = useState(false); @@ -170,7 +169,7 @@ export default function StreamList({ }, [courseValue]); useEffect(() => { - console.log('обнова'); + console.log('streams', streams); if (streams.length < 1) { insideDisplayStreams(streams); @@ -250,7 +249,6 @@ export default function StreamList({ if (!items || items.length === 0) return null; const hasData = items.some((item) => item.connect_id !== null); - // console.warn('HAS', hasData); if (hasData) { let list = items.map((product, index: number) => { if (product.connect_id !== null) { @@ -305,7 +303,7 @@ export default function StreamList({ }} footer={footerContent} > - { + {streams && streams.length > 0 ? ( rowIndex + 1} header="Номер"> {/* */} @@ -348,7 +346,9 @@ export default function StreamList({ )} > - } + ) : ( +

    Курс не опубликован или данные временно не доступны

    + )} {callIndex === 1 && (
    @@ -362,11 +362,11 @@ export default function StreamList({ {/* */} {courseValue?.title} {/* */} -
    +
    @@ -297,7 +318,7 @@ const AppMenu = () => { // className="w-[50px] sm:w-[70px]" className="w-[90%]" onChange={(e) => { - setThemeValue((prev) => prev && ({ ...prev, sequence_number: Number(e.target.value) })); + setThemeValue((prev) => prev && { ...prev, sequence_number: Number(e.target.value) }); }} />
    diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 303d72fc..c5e997e4 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -1,7 +1,7 @@ /* eslint-disable @next/next/no-img-element */ import Link from 'next/link'; -import React, { forwardRef, useContext, useImperativeHandle, useRef } from 'react'; +import React, { forwardRef, useContext, useEffect, useImperativeHandle, useRef } from 'react'; import Tiered from '@/app/components/popUp/Tiered'; import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; import { classNames } from 'primereact/utils'; @@ -12,7 +12,7 @@ import { usePathname, useRouter } from 'next/navigation'; import { logout } from '@/utils/logout'; const AppTopbar = forwardRef((props, ref) => { - const { layoutConfig, layoutState, onMenuToggle, showProfileSidebar, user, setUser, setGlobalLoading } = useContext(LayoutContext); + const { layoutConfig, layoutState, onMenuToggle, showProfileSidebar, user, setUser, setGlobalLoading, departament } = useContext(LayoutContext); const menubuttonRef = useRef(null); const topbarmenuRef = useRef(null); @@ -38,7 +38,7 @@ const AppTopbar = forwardRef((props, ref) => { { label: '', template: ( -
    +
    {user?.last_name} {user?.name} @@ -53,8 +53,8 @@ const AppTopbar = forwardRef((props, ref) => { className: 'text-[12px]', items: [], command: () => { - window.location.href = '/auth/login'; - logout({ setUser, setGlobalLoading }); + window.location.href = '/auth/login'; + logout({ setUser, setGlobalLoading }); } } ] @@ -63,10 +63,10 @@ const AppTopbar = forwardRef((props, ref) => { label: 'Кирүү', icon: 'pi pi-sign-in', items: [], - // url: '/auth/login' - command: ()=> { - // router.push('/auth/login'); - window.location.href = '/auth/login'; + // url: '/auth/login' + command: () => { + // router.push('/auth/login'); + window.location.href = '/auth/login'; } }, { @@ -90,7 +90,6 @@ const AppTopbar = forwardRef((props, ref) => { {user?.email}
    ) - }, { label: 'Чыгуу', @@ -103,6 +102,10 @@ const AppTopbar = forwardRef((props, ref) => { } ]; + useEffect(() => { + console.log('dep', departament); + }, [departament]); + return (
    @@ -110,9 +113,13 @@ const AppTopbar = forwardRef((props, ref) => { logo

    Цифровой кампус ОшГУ

    - (в разработке) + (в разработке) - {pathName !== '/' && pathName !== '/course' ? ( + {pathName !== '/' && departament.name.length > 0 ? ( + + ) : pathName !== '/course' ? ( @@ -124,9 +131,9 @@ const AppTopbar = forwardRef((props, ref) => {
    {media ? ( <> - // ) : ( -
    + // +
    {/* ((props, ref) => {
    - (в разработке) + (в разработке)
    ); }); diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 1db690c9..81e3593f 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -132,6 +132,9 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { setContextStudentThemes(data); }; + // departament + const [departament, setDepartament] = useState<{last_name:string, name:string, father_name:string, info:string}>({last_name:'', name:'', father_name:'', info: ''}); + const value: LayoutContextProps = { layoutConfig, setLayoutConfig, @@ -165,7 +168,10 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { crumbUrls, contextAddCrumb, mainCourseId, - setMainCourseId + setMainCourseId, + + departament, + setDepartament, }; return ( diff --git a/services/courses.tsx b/services/courses.tsx index 89e0473a..07ff583c 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -24,7 +24,7 @@ export const addCourse = async (value: CourseCreateType) => { formData.append('image', value.image); } formData.append('video_url', value.video_url); - + try { const res = await axiosInstance.post(`/v1/teacher/courses/store`, formData, { headers: { @@ -39,12 +39,12 @@ export const addCourse = async (value: CourseCreateType) => { } }; -export const deleteCourse = async (id: number) => { +export const deleteCourse = async (id: number) => { url = process.env.NEXT_PUBLIC_BASE_URL + `/v1/teacher/courses/delete?course_id=${id}`; try { const res = await axiosInstance.delete(`/v1/teacher/courses/delete?course_id=${id}`, { - headers: {'Content-Type': 'multipart/form-data'} + headers: { 'Content-Type': 'multipart/form-data' } }); console.log(res.data); @@ -98,7 +98,7 @@ export const fetchCourseInfo = async (id: number | null) => { export const addThemes = async (id: number, title: string, sequence_number: number | null) => { console.log(sequence_number); - + const formData = new FormData(); formData.append('title', title); formData.append('sequence_number', String(sequence_number)); @@ -119,8 +119,8 @@ export const addThemes = async (id: number, title: string, sequence_number: numb }; export const fetchThemes = async (id: number | null) => { - console.log('Вызываемая тема ',id); - + console.log('Вызываемая тема ', id); + try { const res = await axiosInstance(`/v1/teacher/lessons?course_id=${id}`); @@ -134,7 +134,7 @@ export const fetchThemes = async (id: number | null) => { export const updateTheme = async (course_id: number | null, theme_id: number | null, title: string, sequence_number: number | null) => { console.log(course_id, title, sequence_number); - + const formData = new FormData(); formData.append('title', title); formData.append('sequence_number', String(sequence_number)); @@ -168,16 +168,9 @@ export const deleteTheme = async (id: number) => { // Lessons -export const addLesson = async ( - type: string, - token: string | null, - courseId: number | null, - lessonId: number | null, - value: lessonStateType | string, - videoType: number | null) => { - +export const addLesson = async (type: string, token: string | null, courseId: number | null, lessonId: number | null, value: lessonStateType | string, videoType: number | null) => { let formData = new FormData(); - console.log(value, value, type, courseId, lessonId, videoType, ); + console.log(value, value, type, courseId, lessonId, videoType); let headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; let url = ''; let body: lessonStateType | string | FormData = value; @@ -186,30 +179,30 @@ export const addLesson = async ( url = `/v1/teacher/textcontent/store?course_id=${courseId}&lesson_id=${lessonId}&content=${value}`; headers['Content-Type'] = 'application/json'; body = value; - } else if(type === 'doc' && (typeof value === 'object') && value !== null){ + } else if (type === 'doc' && typeof value === 'object' && value !== null) { url = `/v1/teacher/document/store?lesson_id=${lessonId}`; formData.append('lesson_id', String(lessonId)); - if(value.file){ + if (value.file) { formData.append('document', value.file && value.file); } - formData.append('title', String(value.title)); - formData.append('description', String(value?.description)); + formData.append('title', String(value.title)); + formData.append('description', String(value?.description)); body = formData; - } else if(type === 'url' && typeof value === 'object' && value !== null){ + } else if (type === 'url' && typeof value === 'object' && value !== null) { url = `v1/teacher/usefullinks/store?lesson_id=${lessonId}&title=${value.title}&description=${value.description}&url=${value.url}`; formData.append('lesson_id', String(lessonId)); - formData.append('document', String(value?.url)); - formData.append('title', String(value.title)); - formData.append('description', String(value?.description)); + formData.append('document', String(value?.url)); + formData.append('title', String(value.title)); + formData.append('description', String(value?.description)); body = formData; - } else if(type === 'video' && typeof value === 'object' && value !== null){ + } else if (type === 'video' && typeof value === 'object' && value !== null) { headers['Content-Type'] = 'multipart/form-data'; url = `v1/teacher/video/store?lesson_id=${lessonId}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${videoType}`; formData.append('lesson_id', String(lessonId)); formData.append('video_link', String(value?.video_link)); - formData.append('title', String(value?.title)); + formData.append('title', String(value?.title)); formData.append('description', String(value?.description)); - if(value.cover){ + if (value.cover) { formData.append('cover', value?.cover && value?.cover); } body = formData; @@ -233,12 +226,12 @@ export const fetchLesson = async (type: string, courseId: number | null, lessonI if (type === 'text') { url = `/v1/teacher/textcontent?course_id=${courseId}&lesson_id=${lessonId}`; } else if (type === 'doc') { - url = `/v1/teacher/document?lesson_id=${lessonId}` + url = `/v1/teacher/document?lesson_id=${lessonId}`; } else if (type === 'url') { - url = `/v1/teacher/usefullinks?lesson_id=${lessonId}` + url = `/v1/teacher/usefullinks?lesson_id=${lessonId}`; } else if (type === 'video') { - url = `/v1/teacher/video?lesson_id=${lessonId}` - } + url = `/v1/teacher/video?lesson_id=${lessonId}`; + } try { const res = await axiosInstance.get(url); @@ -250,7 +243,7 @@ export const fetchLesson = async (type: string, courseId: number | null, lessonI } }; -export const fetchLessonShow = async (lessonId: number | null) => { +export const fetchLessonShow = async (lessonId: number | null) => { try { const res = await axiosInstance.get(`v1/teacher/lessons/show?lesson_id=${lessonId}`); console.log('Info lesson: ', res.data); @@ -261,23 +254,23 @@ export const fetchLessonShow = async (lessonId: number | null) => { } }; -export const deleteLesson = async (type:string, courseId: number | null, lesson_id: number | null, content_id: number | null) => { +export const deleteLesson = async (type: string, courseId: number | null, lesson_id: number | null, content_id: number | null) => { let url = ''; console.log('content id: ', content_id); - + if (type === 'text') { url = `/v1/teacher/textcontent/delete?course_id=${courseId}&lesson_id=${lesson_id}&content_id=${content_id}`; - } else if(type === 'doc'){ + } else if (type === 'doc') { url = `/v1/teacher/document/delete?lesson_id=${lesson_id}&document_id=${content_id}`; - } else if(type === 'url'){ + } else if (type === 'url') { url = `v1/teacher/usefullinks/delete?lesson_id=${lesson_id}&link_id=${content_id}`; - } else if(type === 'video'){ + } else if (type === 'video') { url = `/v1/teacher/video/delete?video_id=${content_id}`; - } - + } + try { const res = await axiosInstance.delete(url); - + const data = await res.data; return data; } catch (err) { @@ -287,7 +280,7 @@ export const deleteLesson = async (type:string, courseId: number | null, lesson_ }; export const updateLesson = async (type: string, token: string | null, course_id: number | null, lesson_id: number | null, contentId: number | null, value: any) => { - console.log(type ,contentId, value); + console.log(type, contentId, value); let headers: Record = token ? { Authorization: `Bearer ${token}` } : {}; let formData = new FormData(); let url = ''; @@ -296,31 +289,31 @@ export const updateLesson = async (type: string, token: string | null, course_id if (type === 'text') { url = `/v1/teacher/textcontent/update?course_id=${course_id}&lesson_id=${lesson_id}&content_id=${contentId}&content=${value}`; headers['Content-Type'] = 'application/json'; - } else if(type === 'doc'){ + } else if (type === 'doc') { url = `/v1/teacher/document/update?lesson_id=${lesson_id}&document_id=${contentId}&document=${value.file}`; formData.append('lesson_id', String(lesson_id)); formData.append('document', value.file); formData.append('document_id', String(contentId)); - formData.append('title', String(value.title)); - formData.append('description', String(value.description)); + formData.append('title', String(value.title)); + formData.append('description', String(value.description)); body = formData; - } else if(type === 'url'){ + } else if (type === 'url') { url = `/v1/teacher/usefullinks/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&link_id=${contentId}`; formData.append('lesson_id', String(lesson_id)); formData.append('url', value.url); formData.append('link_id', String(contentId)); - formData.append('title', String(value.title)); - formData.append('description', String(value.description)); + formData.append('title', String(value.title)); + formData.append('description', String(value.description)); body = formData; - } else if(type === 'video'){ + } else if (type === 'video') { url = `/v1/teacher/video/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&video_link=${value.video_link}&video_type_id=${value.video_type_id}&video_id=${contentId}`; - + formData.append('lesson_id', String(lesson_id)); formData.append('video_link', value.video_link); formData.append('video_type_id', String(value.video_type_id)); formData.append('video_id', String(contentId)); - formData.append('title', String(value.title)); - formData.append('description', String(value.description)); + formData.append('title', String(value.title)); + formData.append('description', String(value.description)); body = formData; } @@ -349,16 +342,20 @@ export const fetchVideoType = async () => { } }; -export const publishCourse = async (id: number) => { - const formData = new FormData(); - formData.append('course_id', String(id)); +export const publishCourse = async (id_kafedra: number, id_teacher: number, course_id: number, status: boolean) => { + const data = { + id_kafedra: id_kafedra, + status: [ + { + id_teacher: id_teacher, + course_id: course_id, + status: status + } + ] + }; try { - const res = await axiosInstance.post(`/v1/teacher/courses/published`, formData, { - headers: { - 'Content-Type': 'multipart/form-data' - } - }); + const res = await axiosInstance.post(`/v1/teacher/controls/department/course/status`, data); return res.data; } catch (err) { diff --git a/services/faculty.tsx b/services/faculty.tsx new file mode 100644 index 00000000..378823df --- /dev/null +++ b/services/faculty.tsx @@ -0,0 +1,41 @@ +import axiosInstance from '@/utils/axiosInstance'; + +export const fetchFaculty = async () => { + try { + const res = await axiosInstance.get(`/open/faculty`, { + baseURL: process.env.NEXT_PUBLIC_FACULTY_API + }); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchKafedra = async (id_faculty: number | null) => { + try { + const res = await axiosInstance.get(`/open/kafedra?id_faculty=${id_faculty}`, { + baseURL: process.env.NEXT_PUBLIC_FACULTY_API + }); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchDepartament = async (id_kafedra: number | null) => { + try { + const res = await axiosInstance.get(`/v1/teacher/controls/department?id_kafedra=${id_kafedra}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; \ No newline at end of file diff --git a/styles/layout/forms.css b/styles/layout/forms.css index 4d93cefb..5afda0c7 100644 --- a/styles/layout/forms.css +++ b/styles/layout/forms.css @@ -85,12 +85,18 @@ /* width: 18px; height: 18px; */ border: 2px solid var(--mainColor); - /* border-radius: 50%; */ + border-radius: 2px; + padding: 2px; display: inline-block; position: relative; transition: all 0.3s ease; } +.radio-course-mark:hover { + background-color: var(--mainColor); + color: white; +} + /* Внутренняя точка при выборе */ .radio-course-mark::after { content: ""; diff --git a/types/layout.d.ts b/types/layout.d.ts index 33c989b6..6d05e676 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -76,8 +76,11 @@ export interface LayoutContextProps { crumbUrls: {type: string; crumbUrl: string }; contextAddCrumb: (id)=> void - mainCourseId: number | null, - setMainCourseId + mainCourseId: number | null; + setMainCourseId; + + departament: {last_name:string, name:string, father_name:string, info: string}, + setDepartament, // message: { state: boolean; value: MessageType }; // setMessage: React.Dispatch>; } diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 0441957b..ea7be095 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -22,27 +22,27 @@ axiosInstance.interceptors.response.use( const status = error.response?.status; if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/auth/login'; - // localStorage.removeItem('userVisit'); - // } - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + if (typeof window !== 'undefined') { + window.location.href = '/auth/login'; + localStorage.removeItem('userVisit'); + } + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/'; - // } + if (typeof window !== 'undefined') { + window.location.href = '/'; + } } if (status === 404) { console.warn('404 - Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/pages/notfound'; - // localStorage.removeItem('userVisit'); - // } - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + if (typeof window !== 'undefined') { + window.location.href = '/pages/notfound'; + localStorage.removeItem('userVisit'); + } + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 701e3a3ef5ffb097140c3014ae91770941fd9a4c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 16 Sep 2025 09:28:03 +0600 Subject: [PATCH 168/286] =?UTF-8?q?=D0=9A=D0=B0=D0=B6=D0=B4=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D1=83=20=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 158 +++++++++++------- app/(main)/course/page.tsx | 35 +++- .../faculty/[id_kafedra]/[course_id]/page.tsx | 19 +++ app/(main)/faculty/[id_kafedra]/page.tsx | 8 +- app/(main)/faculty/page.tsx | 6 +- app/components/HomeClient.tsx | 18 +- app/components/SessionManager.tsx | 9 +- layout/AppMenu.tsx | 9 +- layout/AppTopbar.tsx | 20 ++- layout/context/layoutcontext.tsx | 4 +- services/courses.tsx | 6 +- services/query-tests.http | 32 ++-- types/layout.d.ts | 2 +- utils/axiosInstance.tsx | 12 +- 14 files changed, 211 insertions(+), 127 deletions(-) create mode 100644 app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 219259fa..4b262c59 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -6,32 +6,26 @@ import LessonPractica from '@/app/components/lessons/LessonPractica'; import LessonTest from '@/app/components/lessons/LessonTest'; import LessonVideo from '@/app/components/lessons/LessonVideo'; import { NotFound } from '@/app/components/NotFound'; -import PDFViewer from '@/app/components/PDFBook'; -import FormModal from '@/app/components/popUp/FormModal'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; -import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { lessonSchema } from '@/schemas/lessonSchema'; import { deleteLesson, fetchLessonShow } from '@/services/courses'; import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; import { lessonStateType } from '@/types/lessonStateType'; import { mainStepsType } from '@/types/mainStepType'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; -import { yupResolver } from '@hookform/resolvers/yup'; import { useParams, usePathname, useRouter } from 'next/navigation'; -import { BreadCrumb } from 'primereact/breadcrumb'; import { Button } from 'primereact/button'; import { confirmDialog } from 'primereact/confirmdialog'; import { Dialog } from 'primereact/dialog'; import { InputText } from 'primereact/inputtext'; import React, { useContext, useEffect, useRef, useState } from 'react'; -import { useForm } from 'react-hook-form'; export default function LessonStep() { const param = useParams(); const course_id = param.course_Id; + const scrollRef = useRef(null); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); const media = useMediaQuery('(max-width: 640px)'); @@ -176,31 +170,6 @@ export default function LessonStep() { } }; - const lessonInfo = ( -
    -
    -

    {lessonInfoState?.title}

    -
    -
    - ); - - const step = (icon: string, step: number, idx: number) => { - return ( -
    { - setSelectId(step); - handleFetchElement(step); - }} - > - {idx + 1} -
    - -
    -
    - ); - }; - useEffect(() => { if (Array.isArray(steps) && steps.length > 0) { const firstStep = steps[0]?.id; @@ -220,46 +189,70 @@ export default function LessonStep() { useEffect(() => { setTestovy(true); - contextFetchThemes(Number(course_id)); + contextFetchThemes(Number(course_id), null); }, [course_id]); + // useEffect(() => { + // console.log('Тема ', contextThemes, lesson_id); + // if (testovy || updateQuery || deleteQuery) { + // setTestovy(false); + // setUpdateeQuery(false); + // if (contextThemes?.lessons?.data?.length > 0) { + // setThemeNull(false); + // if (param.lesson_id == 'null' || deleteQuery) { + // console.log(contextThemes.lessons.data[0].id); + + // handleShow(contextThemes.lessons.data[0].id); + // console.log('variant 4', contextThemes.lessons.data[0].id); + // handleFetchSteps(contextThemes.lessons.data[0].id); + // setLesson_id(contextThemes.lessons.data[0].id); + // setDeleteQuery(false); + // } else { + // console.log('variant 5'); + // handleShow(Number(param.lesson_id)); + // setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); + // handleFetchSteps(Number(param.lesson_id)); + // } + // } else { + // setThemeNull(true); + // console.log('variant 3'); + // } + // } + // }, [contextThemes]); + useEffect(() => { - console.log('Тема ', contextThemes, lesson_id); - if (testovy || updateQuery || deleteQuery) { - setTestovy(false); - setUpdateeQuery(false); - if (contextThemes?.lessons?.data?.length > 0) { - setThemeNull(false); - if (param.lesson_id == 'null' || deleteQuery) { - console.log(contextThemes.lessons.data[0].id); - - handleShow(contextThemes.lessons.data[0].id); - console.log('variant 4', contextThemes.lessons.data[0].id); - handleFetchSteps(contextThemes.lessons.data[0].id); - setLesson_id(contextThemes.lessons.data[0].id); - setDeleteQuery(false); - } else { - console.log('variant 5'); - handleShow(Number(param.lesson_id)); - setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); - handleFetchSteps(Number(param.lesson_id)); - } + if (!contextThemes?.lessons?.data) return; + + const lessons = contextThemes.lessons.data; + + if (lessons.length > 0) { + setThemeNull(false); + + let chosenId: number | null = null; + + if (param.lesson_id === 'null' || deleteQuery) { + chosenId = lessons[0].id; + setDeleteQuery(false); } else { - setThemeNull(true); - console.log('variant 3'); + chosenId = param.lesson_id ? Number(param.lesson_id) : lessons[0].id; } + + setLesson_id(chosenId); + } else { + setThemeNull(true); } - }, [contextThemes]); - if (themeNull) { - return ( -
    - -
    - ); - } + setTestovy(false); + setUpdateeQuery(false); + }, [contextThemes, deleteQuery, param.lesson_id]); - const scrollRef = useRef(null); + useEffect(() => { + if (!lesson_id) return; + + handleShow(lesson_id); + handleFetchSteps(lesson_id); + changeUrl(lesson_id); + }, [lesson_id]); useEffect(() => { const el = scrollRef.current; @@ -276,6 +269,39 @@ export default function LessonStep() { return () => el.removeEventListener('wheel', onWheel); }, []); + const lessonInfo = ( +
    +
    +

    {lessonInfoState?.title}

    +
    +
    + ); + + const step = (icon: string, step: number, idx: number) => { + return ( +
    { + setSelectId(step); + handleFetchElement(step); + }} + > + {idx + 1} +
    + +
    +
    + ); + }; + + if (themeNull) { + return ( +
    + +
    + ); + } + return (
    {/* modal sectoin */} @@ -333,7 +359,9 @@ export default function LessonStep() { ) : (
    {skeleton ? ( -
    +
    + +
    ) : ( steps.map((item, idx) => { return ( diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index fce56061..5dbef64f 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -36,7 +36,7 @@ import { SelectButton, SelectButtonChangeEvent } from 'primereact/selectbutton'; import { mainStreamsType } from '@/types/mainStreamsType'; export default function Course() { - const { setMessage, course, setCourses, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); + const { setMessage, setGlobalLoading, course, setCourses, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); const [coursesValue, setValueCourses] = useState([]); const [hasCourses, setHasCourses] = useState(false); const [courseValue, setCourseValue] = useState({ title: '', description: '', video_url: '', image: '' }); @@ -251,6 +251,10 @@ export default function Course() { useEffect(() => { contextFetchCourse(1); + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 900); }, []); useEffect(() => { @@ -320,7 +324,16 @@ export default function Course() { {/* Заголовок */}
    - setMainCourseId(shablonData.id)}> + { + setMainCourseId(shablonData.id); + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 900); + }} + > {shablonData.title} {/* Используем subject_name из вашего шаблона */}
    @@ -345,7 +358,9 @@ export default function Course() { }} checked={forStreamId?.id === shablonData.id} /> - setActiveIndex(1)}>Связать к потоку + setActiveIndex(1)}> + Связать к потоку + @@ -620,7 +635,17 @@ export default function Course() { header="Название" // style={{ width: '80%' }} body={(rowData) => ( - setMainCourseId(rowData.id)} key={rowData.id}> + { + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 1200); + setMainCourseId(rowData.id); + }} + key={rowData.id} + > {rowData.title} )} @@ -629,7 +654,7 @@ export default function Course() { header="Публикация" style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => - rowData.is_published ? : + rowData.is_published ? : } > { + contextFetchThemes(Number(course_id), id_kafedra ? Number(id_kafedra) : null); + },[]); + + return
    page
    ; +} diff --git a/app/(main)/faculty/[id_kafedra]/page.tsx b/app/(main)/faculty/[id_kafedra]/page.tsx index 24a9c5d2..dc34b0ea 100644 --- a/app/(main)/faculty/[id_kafedra]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/page.tsx @@ -38,7 +38,7 @@ export default function Kafedra() { const [contentShow, setContentShow] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); - const { setMessage } = useContext(LayoutContext); + const { setMessage, setGlobalLoading } = useContext(LayoutContext); const showError = useErrorMessage(); const handleFetchKafedra = async () => { @@ -109,6 +109,10 @@ export default function Kafedra() { }; useEffect(() => { + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 900); handleFetchKafedra(); }, []); @@ -136,7 +140,7 @@ export default function Kafedra() { rowIndex + 1} header="#" style={{ width: '20px' }}> -

    {rowData.title}

    }>
    + {rowData.title}}> ( diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index 64486ff3..b44bab4f 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -18,7 +18,7 @@ export default function Faculty() { } const showError = useErrorMessage(); - const { setMessage } = useContext(LayoutContext); + const { setMessage, setGlobalLoading } = useContext(LayoutContext); const [selected, setSelected] = useState(null); const [faculty, setFaculty] = useState([{ name_ru: '', id: null }]); @@ -68,6 +68,10 @@ export default function Faculty() { useEffect(() => { handleFetchFaculty(); + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 900); }, []); useEffect(() => { diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 09bfb4a2..33c1d70f 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -10,15 +10,19 @@ import FancyLinkBtn from './buttons/FancyLinkBtn'; import { LayoutContext } from '@/layout/context/layoutcontext'; export default function HomeClient() { - const { user } = useContext(LayoutContext); + const { user, setGlobalLoading } = useContext(LayoutContext); useEffect(() => { + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 800); AOS.init(); }, []); return (
    - {/* {"Уроки"} */} + {/* {"Уроки"} */}
    @@ -39,11 +43,11 @@ export default function HomeClient() {
  • ачык онлайн курстар
  • жогорку билим берүү программалары
  • - {user && - - - - } + {user && ( + + + + )}
    diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index 0d8bf0fe..bb89b461 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -66,7 +66,7 @@ const SessionManager = () => { useEffect(() => { if (!pathname.startsWith('/teaching/lesson/') && !pathname.startsWith('/course/')) { - setGlobalLoading(true); + // setGlobalLoading(true); } const token = getToken('access_token'); @@ -76,12 +76,11 @@ const SessionManager = () => { logout({ setUser, setGlobalLoading }); window.location.href = '/auth/login'; - setGlobalLoading(false); return; } - setTimeout(() => { - setGlobalLoading(false); - }, 900); + // setTimeout(() => { + // setGlobalLoading(false); + // }, 900); }, [pathname]); return null; diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index f5f4ef92..a5cb77b2 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -43,7 +43,10 @@ const AppMenu = () => { const pathname = location; const { studentThemeCourse } = useParams(); const params = useParams(); + console.log(params); + const course_Id = params.course_Id; + const id_kafedra = params?.id_kafedra ? params.id_kafedra : null; const [courseList, setCourseList] = useState([]); const [selectId, setSelectId] = useState(null); @@ -147,7 +150,7 @@ const AppMenu = () => { console.log(data); if (data?.success) { - contextFetchThemes(Number(course_Id)); + contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); clearValues(); setMessage({ state: true, @@ -168,7 +171,7 @@ const AppMenu = () => { const handleDeleteTheme = async (id: number) => { const data = await deleteTheme(id); if (data.success) { - contextFetchThemes(Number(course_Id)); + contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); setDeleteQuery(true); setMessage({ state: true, @@ -190,7 +193,7 @@ const AppMenu = () => { const data = await updateTheme(Number(course_Id), selectId, editingLesson?.title ? editingLesson?.title : '', editingLesson?.sequence_number ? editingLesson?.sequence_number : null); if (data?.success) { setUpdateeQuery(true); - contextFetchThemes(Number(course_Id)); + contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); clearValues(); setMessage({ state: true, diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index c5e997e4..108705c2 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -115,14 +115,18 @@ const AppTopbar = forwardRef((props, ref) => { (в разработке) - {pathName !== '/' && departament.name.length > 0 ? ( - - ) : pathName !== '/course' ? ( - + {pathName !== '/' ? ( + departament.name.length > 0 ? ( + + ) : pathName !== '/course' ? ( + + ) : ( + '' + ) ) : ( '' )} diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 81e3593f..8f18b18d 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -116,8 +116,8 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [deleteQuery, setDeleteQuery] = useState(false); const [updateQuery, setUpdateeQuery] = useState(false); const [contextThemes, setContextThemes] = useState([]); - const contextFetchThemes = async (id: number | null) => { - const data = await fetchThemes(Number(id) || null); + const contextFetchThemes = async (id: number | null, id_kafedra: number | null) => { + const data = await fetchThemes(Number(id) || null, id_kafedra); if(data){ console.log(data); setContextThemes(data); diff --git a/services/courses.tsx b/services/courses.tsx index 07ff583c..77dcfe47 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -118,11 +118,11 @@ export const addThemes = async (id: number, title: string, sequence_number: numb } }; -export const fetchThemes = async (id: number | null) => { - console.log('Вызываемая тема ', id); +export const fetchThemes = async (id: number | null, id_kafedra: number | null) => { + console.log('Вызываемая тема ', id, id_kafedra); try { - const res = await axiosInstance(`/v1/teacher/lessons?course_id=${id}`); + const res = await axiosInstance.get(`/v1/teacher/lessons?course_id=${id}&id_kafedra=${id_kafedra ? id_kafedra : ''}`); const data = await res.data; return data; diff --git a/services/query-tests.http b/services/query-tests.http index afde90c2..003d1a60 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,5 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTY5MDE3MTksImV4cCI6MTc1NjkzMDU3OSwibmJmIjoxNzU2OTAxNzE5LCJqdGkiOiJDMlRGa3hFT3RITERWWmVsIiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.DPG-hM-6ZB1Bed7J0XmYBCT216l45PMnKUzx6Zlv4MQ - +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTc5ODE1MzQsImV4cCI6MTc1ODAxMDM5NCwibmJmIjoxNzU3OTgxNTM0LCJqdGkiOiJRY1FTNGdSSTZFRzRCc1NBIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.mhD-cf2IbMcImhwRIFkGkXZrlmRpM-f4GnpBnhNu8J8 # ### # http://api.mooc.oshsu.kg/public/api/v1/open/video/types @@ -9,27 +8,22 @@ # ### # # STREAMS GET -# GET http://api.mooc.oshsu.kg/public/api/v1/teacher/stream?course_id=77 -# Authorization: Bearer {{token}} -# Content-Type: application/json +GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons?course_id=32 +Authorization: Bearer {{token}} +Content-Type: application/json # ### # test -POST https://api.mooc.oshsu.kg/public/api/v1/login?email=ajaparkulov@oshsu.kg&password=010270Ja -Content-Type: application/json +# POST https://api.mooc.oshsu.kg/public/api/v1/login?email=ajaparkulov@oshsu.kg&password=010270Ja +# Content-Type: application/json -{ - "email": "ajaparkulov@oshsu.kg", - "password": "010270Ja" -} +# { +# "email": "ajaparkulov@oshsu.kg", +# "password": "010270Ja" +# } # test -POST https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons/step?lesson_id=77&type_id=3 -Authorization: Bearer {{token}} -Content-Type: application/json - -{ - "lesson_id": 77, - "type_id":3 -} \ No newline at end of file +# GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons?course_id=32 +# Authorization: Bearer {{token}} +# Content-Type: application/json diff --git a/types/layout.d.ts b/types/layout.d.ts index 6d05e676..51d6b8f7 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -61,7 +61,7 @@ export interface LayoutContextProps { data: myMainCourseType[] }; setCourses; - contextFetchThemes: (id: number)=> void; + contextFetchThemes: (id: number, id_kafedra:number | null)=> void; contextThemes; setContextThemes; deleteQuery: boolean; diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index ea7be095..f5267ed5 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -38,15 +38,15 @@ axiosInstance.interceptors.response.use( if (status === 404) { console.warn('404 - Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/pages/notfound'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/pages/notfound'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); } ); -export default axiosInstance; +export default axiosInstance; \ No newline at end of file From 26807891bdf67f3eb2b09ed982cbd1ab38c82243 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 16 Sep 2025 17:32:12 +0600 Subject: [PATCH 169/286] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../faculty/[id_kafedra]/[course_id]/page.tsx | 213 +++++++++++++++++- app/(main)/faculty/page.tsx | 57 +++-- app/(main)/videoLesson/[video_url]/page.tsx | 10 + app/components/SessionManager.tsx | 4 +- app/components/lessons/LessonInfoCard.tsx | 211 +++++++++++++++++ app/globals.css | 1 + layout/AppMenu.tsx | 5 +- services/steps.tsx | 14 +- types/mainStepType.tsx | 22 +- types/themeType.tsx | 12 + utils/axiosInstance.tsx | 16 +- 11 files changed, 520 insertions(+), 45 deletions(-) create mode 100644 app/(main)/videoLesson/[video_url]/page.tsx create mode 100644 app/components/lessons/LessonInfoCard.tsx create mode 100644 types/themeType.tsx diff --git a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx index c2b3d94e..c1930f29 100644 --- a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx @@ -1,19 +1,214 @@ 'use client'; -import { LayoutContext } from "@/layout/context/layoutcontext"; -import { useParams } from "next/navigation"; -import { useContext, useEffect } from "react"; +import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; +import { NotFound } from '@/app/components/NotFound'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import { fetchDepartamentSteps, fetchSteps } from '@/services/steps'; +import { mainStepsType } from '@/types/mainStepType'; +import { useParams } from 'next/navigation'; +import { Accordion, AccordionTab } from 'primereact/accordion'; +import { Dialog } from 'primereact/dialog'; +import { useContext, useEffect, useState } from 'react'; export default function LessonCheck() { - const { contextFetchThemes, contextThemes } = useContext(LayoutContext); + const { setMessage, contextFetchThemes, contextThemes } = useContext(LayoutContext); + const showError = useErrorMessage(); - const {id_kafedra, course_id} = useParams(); + const { id_kafedra, course_id } = useParams(); // const p = useParams(); // console.log(p); - useEffect(()=>{ + const [themes, setThemes] = useState([]); + const [themeShow, setThemeShow] = useState(false); + const [skeleton, setSkeleton] = useState(false); + const [hasSteps, setHasSteps] = useState(false); + const [steps, setSteps] = useState([]); + const [activeIndex, setActiveIndex] = useState(0); + const [videoCall, setVideoCall] = useState(false); + const [video_link, setVideoLink] = useState('https://www.youtube.com/watch?v=TdrL3QxjyVw&list=RDTdrL3QxjyVw&start_radio=1'); + + const handleFetchSteps = async (lesson_id: number) => { + setSkeleton(true); + const data = await fetchDepartamentSteps(Number(lesson_id), Number(id_kafedra)); + console.log('steps', data); + + if (data.success) { + setSkeleton(false); + if (data.steps.length < 1) { + setHasSteps(true); + } else { + setHasSteps(false); + setSteps(data.steps); + } + } else { + setSkeleton(false); + setHasSteps(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const handleVideoCall = (value: string | null) => { + console.log(value); + + if (!value) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при обработке видео', detail: '' } + }); + } + + const url = new URL(typeof value === 'string' ? value : ''); + let videoId = null; + console.log(url); + + if (url.hostname === 'youtu.be') { + // короткая ссылка, видео ID — в пути + videoId = url.pathname.slice(1); // убираем первый слеш + } else if (url.hostname === 'www.youtube.com' || url.hostname === 'youtube.com') { + // стандартная ссылка, видео ID в параметре v + videoId = url.searchParams.get('v'); + } + console.log(videoId); + + if (!videoId) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при обработке видео', detail: '' } + }); + return null; // не удалось получить ID + } + // return `https://www.youtube.com/embed/${videoId}`; + + console.log('value', videoId); + setVideoLink(`https://www.youtube.com/embed/${videoId}`); + setVideoCall(true); + }; + + // ПРОСИМ ТЕМЫ + useEffect(() => { contextFetchThemes(Number(course_id), id_kafedra ? Number(id_kafedra) : null); - },[]); - - return
    page
    ; + }, []); + + // САМИ ТЕМЫ, присваиваем в локальные темы + useEffect(() => { + console.log('Темы', contextThemes); + if (contextThemes.lessons?.data && contextThemes.lessons.data.length > 0) { + setThemes(contextThemes?.lessons.data || []); + setThemeShow(false); + } else { + setThemeShow(true); + } + }, [contextThemes]); + + // просто посмотреть пока + useEffect(() => { + console.log('Лоакльные темы ', themes); + + if (themes.length > 0 && [activeIndex as number]) { + console.log(activeIndex); + + if (activeIndex) { + const lessonId = themes[activeIndex as number]?.id; + console.log(lessonId); + + handleFetchSteps(lessonId); + } else { + const lessonId = themes[0]?.id; + console.log(lessonId); + + handleFetchSteps(lessonId); + } + } + }, [themes, activeIndex]); + + useEffect(() => { + console.log('Шаги', steps); + }, [steps]); + + return ( +
    + { + if (!videoCall) return; + setVideoCall(false); + }} + > +
    + +
    +
    + {themeShow ? ( + + ) : ( + setActiveIndex(e.index)}> + {themes.map((item) => { + console.log(item); + + return ( + +
    + {steps.length > 0 ? steps.map((i) => { + if(i.content){ + return ( + <> + { + + } + + ); + } + }): 'Данных нет' } +
    +
    + ); + })} +
    + // <> + // {/* + + // + + // + + // + // */} + // + )} +
    + ); } diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index b44bab4f..8fc99b3f 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -1,6 +1,7 @@ 'use client'; import { NotFound } from '@/app/components/NotFound'; +import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchFaculty, fetchKafedra } from '@/services/faculty'; @@ -25,14 +26,17 @@ export default function Faculty() { const [kafedra, setKafedra] = useState([{ name_ru: '', id: null }]); const [selectShow, setSelectShow] = useState(false); const [facultyShow, setFacultyShow] = useState(false); + const [skeleton, setSkeleton] = useState(false); const handleFetchFaculty = async () => { + setSkeleton(true); const data = await fetchFaculty(); if (data && Array.isArray(data)) { const newFaculty = data.map((item) => { return { name_ru: item.name_ru, id: item.id }; }); setFaculty(newFaculty); + setSkeleton(false); if (newFaculty.length > 0) { setSelected(newFaculty[0]); @@ -41,6 +45,7 @@ export default function Faculty() { setSelectShow(true); } } else { + setSkeleton(false); setSelectShow(true); setMessage({ state: true, @@ -85,35 +90,43 @@ export default function Faculty() { return (
    ); } - + return (
    {/* modal sectoin */} diff --git a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx index c1930f29..f18406bd 100644 --- a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx @@ -4,6 +4,7 @@ import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; +import { fetchCourseInfo } from '@/services/courses'; import { fetchDepartamentSteps, fetchSteps } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import { useParams } from 'next/navigation'; @@ -26,13 +27,21 @@ export default function LessonCheck() { const [steps, setSteps] = useState([]); const [activeIndex, setActiveIndex] = useState(0); const [videoCall, setVideoCall] = useState(false); - const [video_link, setVideoLink] = useState('https://www.youtube.com/watch?v=TdrL3QxjyVw&list=RDTdrL3QxjyVw&start_radio=1'); + const [video_link, setVideoLink] = useState(''); + + const handleCourseInfo = async () => { + if (course_id) { + const data = await fetchCourseInfo(Number(course_id)); + console.log('info', data); + + if (data) { + } + } + }; const handleFetchSteps = async (lesson_id: number) => { setSkeleton(true); const data = await fetchDepartamentSteps(Number(lesson_id), Number(id_kafedra)); - console.log('steps', data); - if (data.success) { setSkeleton(false); if (data.steps.length < 1) { @@ -91,9 +100,10 @@ export default function LessonCheck() { setVideoCall(true); }; - // ПРОСИМ ТЕМЫ + // ПРОСИМ КУРС ДЛЯ НАЗВАНИЯ И ТЕМЫ useEffect(() => { contextFetchThemes(Number(course_id), id_kafedra ? Number(id_kafedra) : null); + // handleCourseInfo() }, []); // САМИ ТЕМЫ, присваиваем в локальные темы @@ -112,17 +122,10 @@ export default function LessonCheck() { console.log('Лоакльные темы ', themes); if (themes.length > 0 && [activeIndex as number]) { - console.log(activeIndex); - - if (activeIndex) { - const lessonId = themes[activeIndex as number]?.id; - console.log(lessonId); - - handleFetchSteps(lessonId); - } else { - const lessonId = themes[0]?.id; - console.log(lessonId); + console.log('active index ', activeIndex); + const lessonId = themes[activeIndex as number]?.id; + if (lessonId) { handleFetchSteps(lessonId); } } @@ -160,54 +163,45 @@ export default function LessonCheck() { ) : ( setActiveIndex(e.index)}> {themes.map((item) => { - console.log(item); + const content = steps.filter((j) => { + return j.content != null; + }); return ( - +
    - {steps.length > 0 ? steps.map((i) => { - if(i.content){ - return ( - <> - { - - } - - ); - } - }): 'Данных нет' } + {hasSteps ? ( +

    Данных нет

    + ) : content.length > 0 ? ( + content.map((i,idx) => { + if (i.content) { + return ( +
    + { + + } +
    + ); + } + }) + ) : ( +

    Данных нет

    + )}
    ); })}
    - // <> - // {/* - - // - - // - - // - // */} - // )}
    ); diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index 8fc99b3f..2d66b6c0 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -63,8 +63,12 @@ export default function Faculty() { console.log(data); if (data && Array.isArray(data)) { - setKafedra(data); - setFacultyShow(false); + if(data.length > 0){ + setKafedra(data); + setFacultyShow(false); + } else { + setFacultyShow(true); + } } else { setFacultyShow(true); } @@ -106,7 +110,7 @@ export default function Faculty() { ) : ( !selectShow && (
    -

    Кафедры

    +

    Кафедры

    {facultyShow ? ( ) : ( diff --git a/app/components/lessons/LessonInfoCard.tsx b/app/components/lessons/LessonInfoCard.tsx index 0a8211b2..fd6b0990 100644 --- a/app/components/lessons/LessonInfoCard.tsx +++ b/app/components/lessons/LessonInfoCard.tsx @@ -36,14 +36,20 @@ export default function LessonInfoCard({ const [practicaCall, setPracticaCall] = useState(false); const docCard = ( -
    + ); const linkCard = ( -
    +
    @@ -67,13 +73,13 @@ export default function LessonInfoCard({ {title} -

    {description}

    +

    {description !== 'null' && description }

    ); const videoCard = ( -
    +
    @@ -82,13 +88,13 @@ export default function LessonInfoCard({ {title} -

    {description}

    +

    {description !== 'null' && description }

    ); const testCard = ( -
    +
    @@ -130,7 +136,7 @@ export default function LessonInfoCard({ ); const practicaCard = ( -
    +
    @@ -140,35 +146,29 @@ export default function LessonInfoCard({
    ); - const docuemntPath = documentUrl && documentUrl?.document_path; - const practicaInfo = (
    -
    - {title} -

    {description}

    -
    -
    +
    {documentUrl ? ( - documentUrl.document && documentUrl.document?.length > 0 ? ( - - Документ: - {docuemntPath} + documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( + + {title} ) : (
    - Документ: - {docuemntPath} + {title}
    ) ) : (
    - Документ: - {docuemntPath} + {title}
    )} +

    {description !== 'null' && description }

    +
    +
    - Ссылка: + {link && Ссылка: } {link} @@ -188,7 +188,7 @@ export default function LessonInfoCard({ setTestCall(false); }} > -
    {testInfo}
    +
    {testInfo}
    -
    {practicaInfo}
    +
    {practicaInfo}
    -
    {type === "document" && docCard}
    +
    {type === 'document' && docCard}
    {type === 'link' && linkCard}
    {type === 'video' && videoCard}
    {type === 'test' && testCard}
    diff --git a/app/globals.css b/app/globals.css index 16ef0340..367a019e 100644 --- a/app/globals.css +++ b/app/globals.css @@ -596,7 +596,7 @@ h1, h2, h3, h4, h5, h6 { .main-bg { background-color: #fff; border-radius: 12px; - padding: 4px 12px; + padding: 12px 12px; box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.02), 0px 0px 2px rgba(0, 0, 0, 0.05), 0px 1px 4px rgba(0, 0, 0, 0.08); } diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index c2f070a2..a765052f 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -147,11 +147,7 @@ const AppMenu = () => { // add theme const handleAddTheme = async () => { - console.log(course_Id); - const data = await addThemes(Number(course_Id), themeValue?.title ? themeValue?.title : '', themeValue.sequence_number); - console.log(data); - if (data?.success) { contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); clearValues(); @@ -174,6 +170,7 @@ const AppMenu = () => { const handleDeleteTheme = async (id: number) => { const data = await deleteTheme(id); if (data.success) { + console.warn('treu', data) contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); setDeleteQuery(true); setMessage({ diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 8f18b18d..9c01f338 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -68,23 +68,6 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { return window.innerWidth > 991; }; - useEffect(() => { - if (pathname === '/course') { - setLayoutState((prev) => ({ - ...prev, - staticMenuDesktopInactive: true, - staticMenuMobileActive: false, - overlayMenuActive: false, - profileSidebarVisible: false - })); - } else { - setLayoutState((prev) => ({ - ...prev, - staticMenuDesktopInactive: false - })); - } - }, [pathname]); - // breadCrumb urls const isTopicsChildPage = /^\/teaching\/[^/]+\/[^/]+$/.test(pathname); const [crumbUrls, setCrumbUrls] = useState<{ type: string; crumbUrl: string }>({ type: '', crumbUrl: '' }); @@ -93,12 +76,6 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { setCrumbUrls((prev) => ({ ...prev, [urlName]: url.crumbUrl })); }; - useEffect(() => { - if (isTopicsChildPage && crumbUrls) { - localStorage.setItem('currentBreadCrumb', JSON.stringify(crumbUrls)); - } - }, [crumbUrls]); - // fetch course const [mainCourseId, setMainCourseId] = useState(null); const [course, setCourses] = useState<{ current_page: number; total: number; per_page: number; data: myMainCourseType[] }>({ current_page: 1, total: 0, per_page: 10, data: [] }); @@ -118,7 +95,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [contextThemes, setContextThemes] = useState([]); const contextFetchThemes = async (id: number | null, id_kafedra: number | null) => { const data = await fetchThemes(Number(id) || null, id_kafedra); - if(data){ + if (data) { console.log(data); setContextThemes(data); } @@ -133,8 +110,31 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { }; // departament - const [departament, setDepartament] = useState<{last_name:string, name:string, father_name:string, info:string}>({last_name:'', name:'', father_name:'', info: ''}); - + const [departament, setDepartament] = useState<{ last_name: string; name: string; father_name: string; info: string }>({ last_name: '', name: '', father_name: '', info: '' }); + + useEffect(() => { + if (pathname === '/course') { + setLayoutState((prev) => ({ + ...prev, + staticMenuDesktopInactive: true, + staticMenuMobileActive: false, + overlayMenuActive: false, + profileSidebarVisible: false + })); + } else { + setLayoutState((prev) => ({ + ...prev, + staticMenuDesktopInactive: false + })); + } + }, [pathname]); + + useEffect(() => { + if (isTopicsChildPage && crumbUrls) { + localStorage.setItem('currentBreadCrumb', JSON.stringify(crumbUrls)); + } + }, [crumbUrls]); + const value: LayoutContextProps = { layoutConfig, setLayoutConfig, @@ -171,7 +171,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { setMainCourseId, departament, - setDepartament, + setDepartament }; return ( diff --git a/services/courses.tsx b/services/courses.tsx index 77dcfe47..6e994234 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -125,6 +125,8 @@ export const fetchThemes = async (id: number | null, id_kafedra: number | null) const res = await axiosInstance.get(`/v1/teacher/lessons?course_id=${id}&id_kafedra=${id_kafedra ? id_kafedra : ''}`); const data = await res.data; + console.log('COURSE', data); + return data; } catch (err) { console.log('Ошибка при получении темы', err); diff --git a/styles/layout/layout.scss b/styles/layout/layout.scss index 7348af10..f1a1e6ab 100644 --- a/styles/layout/layout.scss +++ b/styles/layout/layout.scss @@ -11,4 +11,5 @@ @import "./_utils"; @import "./_typography"; @import "./_button"; -@import "./forms.css"; \ No newline at end of file +@import "./forms.css"; +@import "./primereact.css"; \ No newline at end of file diff --git a/styles/layout/primereact.css b/styles/layout/primereact.css new file mode 100644 index 00000000..99845fe4 --- /dev/null +++ b/styles/layout/primereact.css @@ -0,0 +1,5 @@ +.p-accordion .p-accordion-header .p-accordion-header-link { + width: 100% !important; + padding: 7px !important; + font-size: 15px !important; +} \ No newline at end of file diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index feb80829..99b85f74 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -31,9 +31,9 @@ axiosInstance.interceptors.response.use( if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/'; - // } + if (typeof window !== 'undefined') { + // window.location.href = '/'; + } } if (status === 404) { From 164f35bb5a77838c2f58e91a10fabd2763107589 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 17 Sep 2025 15:07:27 +0600 Subject: [PATCH 171/286] =?UTF-8?q?=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87=D1=82=D0=BE=20=D0=B2=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BC=D0=B5=20=D0=BD=D0=B5=D1=82=D1=83=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 46 +++++++++++++------ layout/context/layoutcontext.tsx | 1 + 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 806eb4a8..53df3ad7 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -29,7 +29,7 @@ export default function LessonStep() { const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); const media = useMediaQuery('(max-width: 640px)'); - const { setMessage, contextFetchThemes, contextThemes, setDeleteQuery, deleteQuery, updateQuery, setUpdateeQuery } = useContext(LayoutContext); + const { setMessage, contextFetchThemes, contextThemes, setContextThemes, setDeleteQuery, deleteQuery, updateQuery, setUpdateeQuery } = useContext(LayoutContext); const showError = useErrorMessage(); const [formVisible, setFormVisible] = useState(false); @@ -264,23 +264,40 @@ export default function LessonStep() { // }, [lesson_id]); useEffect(() => { - if (!contextThemes?.lessons?.data) return; + console.warn(contextThemes, contextThemes.length); + + if (contextThemes?.length < 1 || !contextThemes?.lessons?.data) { + setThemeNull(true); + return; + } else { + setThemeNull(false); + } const lessons = contextThemes.lessons.data; - if (lessons.length === 0) return; - - let chosenId: number | null = null; - - if (param.lesson_id && param.lesson_id !== 'null') { - const urlId = Number(param.lesson_id); - const exists = lessons.some((l) => l.id === urlId); - chosenId = exists ? urlId : lessons[0].id; + console.warn('SMOTRI ',lessons) + if (lessons.length < 1) { + setThemeNull(true); } else { - chosenId = lessons[0].id; + setThemeNull(false); } - - if (lesson_id !== chosenId) { - setLesson_id(chosenId); + console.log('contexttheme ',lessons); + + let chosenId: number | null = null; + if(lessons.length > 0) { + setThemeNull(false); + if (param.lesson_id && param.lesson_id !== 'null') { + const urlId = Number(param.lesson_id); + const exists = lessons.some((l) => l.id === urlId); + chosenId = exists ? urlId : lessons[0].id; + } else { + chosenId = lessons[0].id; + } + + if (lesson_id !== chosenId) { + setLesson_id(chosenId); + } + } else { + setThemeNull(true); } }, [contextThemes, deleteQuery, param.lesson_id]); @@ -309,6 +326,7 @@ export default function LessonStep() { return () => { el.removeEventListener('wheel', onWheel); setLesson_id(null); + setContextThemes([]); }; }, []); diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 9c01f338..c12a848e 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -113,6 +113,7 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [departament, setDepartament] = useState<{ last_name: string; name: string; father_name: string; info: string }>({ last_name: '', name: '', father_name: '', info: '' }); useEffect(() => { + setContextThemes([]); if (pathname === '/course') { setLayoutState((prev) => ({ ...prev, From 34a0a690d924e9bae7f8dec8a3dc2b76d5cc6b02 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 17 Sep 2025 15:27:07 +0600 Subject: [PATCH 172/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D1=83=D1=80=D1=81=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=84=D0=B5=D0=B4=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../faculty/[id_kafedra]/[course_id]/page.tsx | 94 ++++++++++--------- services/faculty.tsx | 12 +++ services/query-tests.http | 14 +-- 3 files changed, 69 insertions(+), 51 deletions(-) diff --git a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx index f18406bd..3c7b5a3f 100644 --- a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx @@ -5,6 +5,7 @@ import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchCourseInfo } from '@/services/courses'; +import { depCourseInfo } from '@/services/faculty'; import { fetchDepartamentSteps, fetchSteps } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import { useParams } from 'next/navigation'; @@ -28,13 +29,15 @@ export default function LessonCheck() { const [activeIndex, setActiveIndex] = useState(0); const [videoCall, setVideoCall] = useState(false); const [video_link, setVideoLink] = useState(''); + const [courseInfo, setCourseInfo] = useState({title: ''}); const handleCourseInfo = async () => { if (course_id) { - const data = await fetchCourseInfo(Number(course_id)); + const data = await depCourseInfo(Number(course_id), Number(id_kafedra)); console.log('info', data); - if (data) { + if (data.success) { + setCourseInfo({title: data.course.title}) } } }; @@ -103,7 +106,7 @@ export default function LessonCheck() { // ПРОСИМ КУРС ДЛЯ НАЗВАНИЯ И ТЕМЫ useEffect(() => { contextFetchThemes(Number(course_id), id_kafedra ? Number(id_kafedra) : null); - // handleCourseInfo() + handleCourseInfo(); }, []); // САМИ ТЕМЫ, присваиваем в локальные темы @@ -161,47 +164,50 @@ export default function LessonCheck() { {themeShow ? ( ) : ( - setActiveIndex(e.index)}> - {themes.map((item) => { - const content = steps.filter((j) => { - return j.content != null; - }); - - return ( - -
    - {hasSteps ? ( -

    Данных нет

    - ) : content.length > 0 ? ( - content.map((i,idx) => { - if (i.content) { - return ( -
    - { - - } -
    - ); - } - }) - ) : ( -

    Данных нет

    - )} -
    -
    - ); - })} -
    +
    +

    Название курса: {courseInfo.title}

    + setActiveIndex(e.index)}> + {themes.map((item) => { + const content = steps.filter((j) => { + return j.content != null; + }); + + return ( + +
    + {hasSteps ? ( +

    Данных нет

    + ) : content.length > 0 ? ( + content.map((i, idx) => { + if (i.content) { + return ( +
    + { + + } +
    + ); + } + }) + ) : ( +

    Данных нет

    + )} +
    +
    + ); + })} +
    +
    )}
    ); diff --git a/services/faculty.tsx b/services/faculty.tsx index 378823df..16ab4741 100644 --- a/services/faculty.tsx +++ b/services/faculty.tsx @@ -33,6 +33,18 @@ export const fetchDepartament = async (id_kafedra: number | null) => { const res = await axiosInstance.get(`/v1/teacher/controls/department?id_kafedra=${id_kafedra}`); const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const depCourseInfo = async (course_id:number | null, id_kafedra: number | null) => { + try { + const res = await axiosInstance.get(`/v1/teacher/controls/department/course?course_id=${course_id}&id_kafedra=${id_kafedra}`); + const data = await res.data; + return data; } catch (err) { console.log('Ошибка загрузки:', err); diff --git a/services/query-tests.http b/services/query-tests.http index 003d1a60..b0e1de88 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,4 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTc5ODE1MzQsImV4cCI6MTc1ODAxMDM5NCwibmJmIjoxNzU3OTgxNTM0LCJqdGkiOiJRY1FTNGdSSTZFRzRCc1NBIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.mhD-cf2IbMcImhwRIFkGkXZrlmRpM-f4GnpBnhNu8J8 +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTgwOTk4NTEsImV4cCI6MTc1ODEyODcxMSwibmJmIjoxNzU4MDk5ODUxLCJqdGkiOiJ1RGxQMjdYMHFLa2NVbXVDIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.MMZZJ2d06qK5Emrl-hUvMOSQqzvGLmMIMaTAoXc2Jmk # ### # http://api.mooc.oshsu.kg/public/api/v1/open/video/types @@ -8,9 +8,9 @@ # ### # # STREAMS GET -GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons?course_id=32 -Authorization: Bearer {{token}} -Content-Type: application/json +# GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons?course_id=32 +# Authorization: Bearer {{token}} +# Content-Type: application/json # ### # test @@ -24,6 +24,6 @@ Content-Type: application/json # test -# GET https://api.mooc.oshsu.kg/public/api/v1/teacher/lessons?course_id=32 -# Authorization: Bearer {{token}} -# Content-Type: application/json +GET https://api.mooc.oshsu.kg/public/api/v1/teacher/controls/department/course?course_id=34&id_kafedra=139 +Authorization: Bearer {{token}} +Content-Type: application/json From c292d93fdd40c2157402e87e7ae076c51d3021e3 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 17 Sep 2025 16:11:02 +0600 Subject: [PATCH 173/286] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D1=81=20=D0=BA=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 4 +-- .../faculty/[id_kafedra]/[course_id]/page.tsx | 4 +-- .../[connect_id]/[stream_id]/page.tsx | 2 +- layout/AppMenu.tsx | 35 ++++++++++++------- types/mainStepType.tsx | 21 +---------- 5 files changed, 27 insertions(+), 39 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 53df3ad7..48c20742 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -274,20 +274,18 @@ export default function LessonStep() { } const lessons = contextThemes.lessons.data; - console.warn('SMOTRI ',lessons) if (lessons.length < 1) { setThemeNull(true); } else { setThemeNull(false); } - console.log('contexttheme ',lessons); let chosenId: number | null = null; if(lessons.length > 0) { setThemeNull(false); if (param.lesson_id && param.lesson_id !== 'null') { const urlId = Number(param.lesson_id); - const exists = lessons.some((l) => l.id === urlId); + const exists = lessons.some((l:{id: number}) => l.id === urlId); chosenId = exists ? urlId : lessons[0].id; } else { chosenId = lessons[0].id; diff --git a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx index 3c7b5a3f..a6fb965b 100644 --- a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx @@ -173,7 +173,7 @@ export default function LessonCheck() { }); return ( - +
    {hasSteps ? (

    Данных нет

    @@ -181,7 +181,7 @@ export default function LessonCheck() { content.map((i, idx) => { if (i.content) { return ( -
    +
    { ( -
    +
    {rowData.last_name} {rowData.name} {rowData.father_name} diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index a765052f..1eae498f 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -44,7 +44,7 @@ const AppMenu = () => { const { studentThemeCourse } = useParams(); const params = useParams(); console.log(params); - + const course_Id = params.course_Id; const id_kafedra = params?.id_kafedra ? params.id_kafedra : null; @@ -55,7 +55,7 @@ const AppMenu = () => { const [editingLesson, setEditingLesson] = useState<{ title: string; sequence_number: number | null } | null>(null); const [themeValue, setThemeValue] = useState<{ title: string; sequence_number: number | null }>({ title: '', sequence_number: null }); - const [themesStudentList, setThemesStudentList] = useState<{ label: string; id: number; to: string; items?: AppMenuItem[] }[]>([]); + const [themesStudentList, setThemesStudentList] = useState<{ key?: string; label: string; id: number; to: string; items?: AppMenuItem[] }[]>([]); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); @@ -63,6 +63,12 @@ const AppMenu = () => { const byStatus: AppMenuItem[] = user?.is_working ? pathname.startsWith('/course/') ? [ + { + // key: 'prev', + label: '', + icon: 'pi pi-fw pi-arrow-left', + to: '/course' + }, { label: 'Темалар', icon: 'pi pi-fw pi-calendar-clock', @@ -80,6 +86,15 @@ const AppMenu = () => { const forDepartament = !pathname.startsWith('/course/') && departament.info.length > 0 ? [ + { + // key: 'prev', + label: '', + icon: 'pi pi-fw pi-arrow-left', + to: '#', + command: () => { + router.back(); + } + }, { label: 'Главная страница', icon: 'pi pi-home', @@ -100,19 +115,13 @@ const AppMenu = () => { const model: AppMenuItem[] = [ { - label: '', - icon: 'pi pi-fw pi-arrow-left', - to: '#', - command: ()=> { - router.back(); - } - }, - { - label: '', + // key: 'Департамент', + label: ' ', items: forDepartament }, { - label: '', + // key: 'Основной', + label: ' ', items: byStatus } ]; @@ -170,7 +179,7 @@ const AppMenu = () => { const handleDeleteTheme = async (id: number) => { const data = await deleteTheme(id); if (data.success) { - console.warn('treu', data) + console.warn('treu', data); contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); setDeleteQuery(true); setMessage({ diff --git a/types/mainStepType.tsx b/types/mainStepType.tsx index ef8c143a..27258ab3 100644 --- a/types/mainStepType.tsx +++ b/types/mainStepType.tsx @@ -7,24 +7,5 @@ export interface mainStepsType { step: number; type: { active: true; created_at: string; id: 1; logo: string; description?: string | null; modelName: string; name: string; title: string; updated_at: string }; updated_at: string; + content?: {document: string, document_path: string, description: string | null, title: string, link: string, url: string, content: string, answers: [{text: string, is_correct: boolean, id: number | null}], score: number} } - -content: course_id: null; -created_at: '2025-09-12T06:24:54.000000Z'; -description: null; -document: '1_76_1757658294.pdf'; -id: 49; -lesson_id: 76; -status: true; -title: 'лекция'; -updated_at: '2025-09-12T06:24:54.000000Z'; -user_id: 1; - -type: active: true; -created_at: '2025-09-02T09:31:58.000000Z'; -id: 2; -logo: 'pi pi-folder'; -modelName: 'Document'; -name: 'document'; -title: 'Документ'; -updated_at: '2025-09-02T09:32:01.000000Z'; From c4b8c797c5de21f1f59787e58cb1e727615d1ed3 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 18 Sep 2025 11:55:16 +0600 Subject: [PATCH 174/286] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9,=20=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B2=20=D0=BA=D0=B0=D1=84=D0=B5=D0=B4=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 10 +- .../course/[course_Id]/[lesson_id]/page.tsx | 160 +++++++++--------- app/(main)/course/page.tsx | 36 ++-- app/components/CounterBanner.tsx | 8 +- app/components/HomeClient.tsx | 66 +------- app/components/VideoPlay.tsx | 2 +- app/components/cards/LessonCard.tsx | 31 +--- app/components/lessons/LessonDocument.tsx | 33 ++-- app/components/lessons/LessonInfoCard.tsx | 62 ++++--- app/components/lessons/LessonLink.tsx | 42 ++--- app/components/lessons/LessonPractica.tsx | 46 +++-- app/components/lessons/LessonTest.tsx | 58 ++----- app/components/lessons/LessonVideo.tsx | 69 +++----- app/components/tables/StreamList.tsx | 13 +- layout/AppFooter.tsx | 43 +---- layout/AppMenu.tsx | 35 ++-- layout/AppTopbar.tsx | 39 +---- utils/getConfirmOptions.tsx | 8 +- 18 files changed, 275 insertions(+), 486 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index c71d1c70..3413ddc3 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -78,7 +78,6 @@ const LoginPage = () => { } } } else { - console.log('Ошибка при авторизации, повторите позже'); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка', detail: 'Введите корректные данные' } @@ -94,11 +93,6 @@ const LoginPage = () => { }); // messege - Ошибка при авторизации }; - useEffect(()=> { - console.log(departament); - - },[departament]); - return (
    {/*
    */} @@ -110,7 +104,7 @@ const LoginPage = () => {
    -

    Кирүү

    +

    Вход

    {/*
    - +
    diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 48c20742..dbd5235a 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -12,7 +12,6 @@ import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { deleteLesson, fetchLessonShow } from '@/services/courses'; import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; -import { lessonStateType } from '@/types/lessonStateType'; import { mainStepsType } from '@/types/mainStepType'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; import { useParams, usePathname, useRouter } from 'next/navigation'; @@ -26,6 +25,8 @@ export default function LessonStep() { const param = useParams(); const course_id = param.course_Id; const scrollRef = useRef(null); + const router = useRouter(); + const pathname = usePathname(); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); const media = useMediaQuery('(max-width: 640px)'); @@ -43,23 +44,25 @@ export default function LessonStep() { const [lesson_id, setLesson_id] = useState(null); const [sequence_number, setSequence_number] = useState(null); const [skeleton, setSkeleton] = useState(false); + const [wasCreated, setWasCreated] = useState(false); const [testovy, setTestovy] = useState(false); - const router = useRouter(); - const pathname = usePathname(); const changeUrl = (lessonId: number | null) => { router.replace(`/course/${course_id}/${lessonId ? lessonId : null}`); }; const handleShow = async (LessonId: number | null) => { + setSkeleton(true); const data = await fetchLessonShow(LessonId); if (data?.lesson) { + setSkeleton(false); setLessonInfoState({ title: data.lesson.title, videos_count: data.lesson.videos_count, usefullinks_count: data.lesson.usefullinks_count, documents_count: data.lesson.documents_count }); } else { + setSkeleton(false); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -79,7 +82,7 @@ export default function LessonStep() { setSkeleton(false); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -90,8 +93,6 @@ export default function LessonStep() { const handleFetchSteps = async (lesson_id: number | null) => { setSkeleton(true); const data = await fetchSteps(Number(lesson_id)); - console.log('steps', data); - if (data.success) { setSkeleton(false); if (data.steps.length < 1) { @@ -105,7 +106,7 @@ export default function LessonStep() { setHasSteps(false); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -116,18 +117,17 @@ export default function LessonStep() { const handleAddLesson = async (lessonId: number, typeId: number) => { setFormVisible(false); const data = await addLesson({ lesson_id: lessonId, type_id: typeId }, sequence_number); - console.log(data); - if (data.success) { + setWasCreated(true); handleFetchSteps(lessonId); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -137,13 +137,16 @@ export default function LessonStep() { const handleFetchElement = async (stepId: number) => { if (lesson_id) { + setSkeleton(true); const data = await fetchElement(Number(lesson_id), stepId); if (data.success) { + setSkeleton(false); setElement({ content: data.content, step: data.step }); } else { + setSkeleton(false); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -158,12 +161,12 @@ export default function LessonStep() { handleFetchSteps(Number(lesson_id)); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -171,12 +174,20 @@ export default function LessonStep() { } }; + // useEffect(() => { + // if (Array.isArray(steps) && steps.length > 0) { + // const firstStep = steps[0]?.id; + // // const firstStep = steps[steps.length - 1]?.id; + // setSelectId(firstStep); + // handleFetchElement(firstStep); + // } + // }, [steps]); useEffect(() => { if (Array.isArray(steps) && steps.length > 0) { - const firstStep = steps[0]?.id; - // const firstStep = steps[steps.length - 1]?.id; - setSelectId(firstStep); - handleFetchElement(firstStep); + const stepId = wasCreated ? steps[steps.length - 1].id : steps[0].id; + setSelectId(stepId); + handleFetchElement(stepId); + setWasCreated(false); } }, [steps]); @@ -190,39 +201,9 @@ export default function LessonStep() { useEffect(() => { setTestovy(true); - console.log('course-id', course_id); - contextFetchThemes(Number(course_id), null); }, [course_id]); - // useEffect(() => { - // console.log('Тема ', contextThemes, lesson_id); - // if (testovy || updateQuery || deleteQuery) { - // setTestovy(false); - // setUpdateeQuery(false); - // if (contextThemes?.lessons?.data?.length > 0) { - // setThemeNull(false); - // if (param.lesson_id == 'null' || deleteQuery) { - // console.log(contextThemes.lessons.data[0].id); - - // handleShow(contextThemes.lessons.data[0].id); - // console.log('variant 4', contextThemes.lessons.data[0].id); - // handleFetchSteps(contextThemes.lessons.data[0].id); - // setLesson_id(contextThemes.lessons.data[0].id); - // setDeleteQuery(false); - // } else { - // console.log('variant 5'); - // handleShow(Number(param.lesson_id)); - // setLesson_id((param.lesson_id && Number(param.lesson_id)) || null); - // handleFetchSteps(Number(param.lesson_id)); - // } - // } else { - // setThemeNull(true); - // console.log('variant 3'); - // } - // } - // }, [contextThemes]); - // useEffect(() => { // if (!contextThemes?.lessons?.data) return; @@ -264,8 +245,6 @@ export default function LessonStep() { // }, [lesson_id]); useEffect(() => { - console.warn(contextThemes, contextThemes.length); - if (contextThemes?.length < 1 || !contextThemes?.lessons?.data) { setThemeNull(true); return; @@ -279,18 +258,18 @@ export default function LessonStep() { } else { setThemeNull(false); } - + let chosenId: number | null = null; - if(lessons.length > 0) { + if (lessons.length > 0) { setThemeNull(false); if (param.lesson_id && param.lesson_id !== 'null') { const urlId = Number(param.lesson_id); - const exists = lessons.some((l:{id: number}) => l.id === urlId); + const exists = lessons.some((l: { id: number }) => l.id === urlId); chosenId = exists ? urlId : lessons[0].id; } else { chosenId = lessons[0].id; } - + if (lesson_id !== chosenId) { setLesson_id(chosenId); } @@ -298,7 +277,7 @@ export default function LessonStep() { setThemeNull(true); } }, [contextThemes, deleteQuery, param.lesson_id]); - + useEffect(() => { if (lesson_id && param.lesson_id !== String(lesson_id)) { changeUrl(lesson_id); @@ -329,10 +308,14 @@ export default function LessonStep() { }, []); const lessonInfo = ( -
    -
    -

    {lessonInfoState?.title}

    -
    +
    + {skeleton ? ( + + ) : ( +
    +

    {lessonInfoState?.title}

    +
    + )}
    ); @@ -356,7 +339,7 @@ export default function LessonStep() { if (themeNull) { return (
    - +
    ); } @@ -365,7 +348,7 @@ export default function LessonStep() {
    {/* modal sectoin */} { @@ -432,33 +415,50 @@ export default function LessonStep() { )}
    )} +
    - + {skeleton ? ( + + ) : ( + + )}
    {hasSteps && (
    - +
    )}
    - {!hasSteps && {element?.step.type.title}} - {!hasSteps && ( -
    {element?.step.type.name === 'document' && } diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 5dbef64f..1be60b03 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -27,12 +27,8 @@ import { TabViewChange } from '@/types/tabViewChange'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import useShortText from '@/hooks/useShortText'; import { ProgressSpinner } from 'primereact/progressspinner'; -import { RadioButton } from 'primereact/radiobutton'; import { DataView } from 'primereact/dataview'; -import { displayType } from '@/types/displayType'; import { FileWithPreview } from '@/types/fileuploadPreview'; -import { InputSwitch, InputSwitchChangeEvent } from 'primereact/inputswitch'; -import { SelectButton, SelectButtonChangeEvent } from 'primereact/selectbutton'; import { mainStreamsType } from '@/types/mainStreamsType'; export default function Course() { @@ -113,7 +109,7 @@ export default function Course() { setHasCourses(true); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -128,12 +124,12 @@ export default function Course() { contextFetchCourse(1); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -149,12 +145,12 @@ export default function Course() { contextFetchCourse(1); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); // messege - Успех! } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); // messege - Ошибка при добавлении if (data?.response?.status) { showError(data.response.status); @@ -181,12 +177,12 @@ export default function Course() { setSelectedCourse(null); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); // messege - Успех! } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } }); // messege - Ошибка при изменении курса if (data?.response?.status) { showError(data.response.status); @@ -387,11 +383,11 @@ export default function Course() {
    {/*
    */}
    - +
    { @@ -410,12 +406,12 @@ export default function Course() {
    - +
    { @@ -437,7 +433,7 @@ export default function Course() { {/*
    */}
    - +
    {/* )} */}
    - +
    - + ) : ( <> @@ -618,7 +614,7 @@ export default function Course() { {/* table section */} {hasCourses ? ( - + ) : ( <> {skeleton ? ( diff --git a/app/components/CounterBanner.tsx b/app/components/CounterBanner.tsx index 70317ba5..07f92438 100644 --- a/app/components/CounterBanner.tsx +++ b/app/components/CounterBanner.tsx @@ -15,7 +15,7 @@ export default function CounterBanner() {
    +
    - Курстар & видеосабактар + Курсы & видео уроки
    @@ -26,7 +26,7 @@ export default function CounterBanner() {
    +
    - Катталган студенттер + Зарегистрированные студенты
    @@ -37,7 +37,7 @@ export default function CounterBanner() {
    +
    - Окутуучулар + Преподаватели
    @@ -48,7 +48,7 @@ export default function CounterBanner() {
    %
    - Канааттануу деңгээли + Уровень удовлетворённости
    diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 33c1d70f..56185f2d 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -30,22 +30,22 @@ export default function HomeClient() {
    Фото - ЫҢГАЙЛУУ ОКУУ ҮЧҮН ОНЛАЙН МЕЙКИНДИК + УДОБНОЕ ОНЛАЙН-ПРОСТРАНСТВО ДЛЯ ОБУЧЕНИЯ

    - Аралыктан окутуу порталына кош келиңиз! + Добро пожаловать на портал дистанционного обучения!

    {' '} - Университеттин онлайн билим берүү жаатындагы долбоорлорун бириктирүүдөбүз: + Мы объединяем проекты университета в сфере онлайн-образования:
      -
    • ачык онлайн курстар
    • -
    • жогорку билим берүү программалары
    • +
    • открытые онлайн-курсы
    • +
    • программы высшего образования
    {user && ( - + )}
    @@ -55,18 +55,6 @@ export default function HomeClient() {
    - {/*
    - Shape -
    */} - Пользователь
    @@ -76,48 +64,6 @@ export default function HomeClient() {
    Shape
    - - {/*
    -
    - 13000 -

    Студент

    -
    -
    */} - - {/*
    -
    - Куттуктайбыз! -

    Сиздин кабыл алуу ийгиликтүү аяктады

    -
    -
    */} - - {/*
    -
    - User experience className -

    Today at 12.00 PM

    -
    - - Join now - -
    */}
    diff --git a/app/components/VideoPlay.tsx b/app/components/VideoPlay.tsx index fb87d29f..fb64719b 100644 --- a/app/components/VideoPlay.tsx +++ b/app/components/VideoPlay.tsx @@ -16,7 +16,7 @@ export default function VideoPlay() { return (
    { diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index e65c7111..3926e375 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -44,10 +44,6 @@ export default function LessonCard({ const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 90); const shortUrl = useShortText(cardValue?.url ? cardValue?.url : '', 100); const [progressSpinner, setProgressSpinner] = useState(false); - - // useEffect(()=> { - // console.log(urlForDownload); - // },[urlForDownload]); const media = useMediaQuery('(max-width: 640px)'); const toggleSpinner = () => { @@ -71,21 +67,6 @@ export default function LessonCard({ } }; - const cardHeader = - type.typeValue === 'video' && status === 'working' ? ( -
    -
    -
    - - {lessonDate} -
    -
    - ) : ( -
    - -
    - ); - const videoPreviw = type.typeValue === 'video' && (
    @@ -103,7 +84,7 @@ export default function LessonCard({
    ); - const btnLabel = type.typeValue === 'doc' || type.typeValue === 'practica' ? 'Ачуу' : type.typeValue === 'link' ? 'Өтүү' : ''; + const btnLabel = type.typeValue === 'doc' || type.typeValue === 'practica' ? 'Открыть' : type.typeValue === 'link' ? 'Перейти' : ''; return (
    @@ -137,7 +118,7 @@ export default function LessonCard({ {type.typeValue === 'practica' && cardValue.url ? (
    - Шилтеме: + Ссылка: {cardValue?.url}
    @@ -193,7 +174,7 @@ export default function LessonCard({ {type.typeValue === 'doc' && (
    -
    @@ -212,7 +193,7 @@ export default function LessonCard({ )} {type.typeValue === 'link' && (
    -
    )} @@ -222,7 +203,7 @@ export default function LessonCard({
    ); @@ -73,7 +73,7 @@ export default function LessonInfoCard({ {title} -

    {description !== 'null' && description }

    +

    {description !== 'null' && description}

    ); @@ -88,7 +88,7 @@ export default function LessonInfoCard({ {title} -

    {description !== 'null' && description }

    +

    {description !== 'null' && description}

    ); @@ -107,22 +107,18 @@ export default function LessonInfoCard({ ); const testInfo = ( -
    +
    {test?.answers && ( -
    -
    - {test?.content} -
    - {!media && '/'} Балл: - {`${test?.score}`} -
    +
    +
    + {test?.content}
    -
    +
    {test?.answers.map((item) => { return (
    @@ -130,6 +126,10 @@ export default function LessonInfoCard({ ); })}
    +
    + Балл за тест: + {`${test?.score}`} +
    )}
    @@ -147,12 +147,12 @@ export default function LessonInfoCard({ ); const practicaInfo = ( -
    -
    +
    +
    {documentUrl ? ( documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( - {title} + {title} ) : (
    @@ -164,14 +164,24 @@ export default function LessonInfoCard({ {title}
    )} -

    {description !== 'null' && description }

    +

    {description !== 'null' && description}

    -
    -
    - {link && Ссылка: } - - {link} - +
    +
    + Документ: + {documentUrl && documentUrl.document_path && documentUrl.document_path?.length > 0 ? + + : + } +
    + +
    + Ссылка: + {link ? + {link} + + : ? + }
    @@ -181,18 +191,18 @@ export default function LessonInfoCard({
    { if (!testCall) return; setTestCall(false); }} > -
    {testInfo}
    +
    {testInfo}
    { if (!practicaCall) return; diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index e6f671df..ed55f375 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -103,7 +103,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -118,12 +118,12 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr fetchPropElement(element.id); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -138,12 +138,12 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr fetchPropElement(element.id); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -159,14 +159,14 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { setLinkValue({ title: '', description: '', url: '' }); setEditingLesson({ title: '', description: '', url: '' }); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -206,7 +206,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr { @@ -219,7 +219,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr { setLinkValue((prev) => ({ ...prev, title: e.target.value })); @@ -227,18 +227,18 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr }} /> {errors.title?.message} - {additional.link && setLinkValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + {additional.link && setLinkValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />}
    {/*
    diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 6798444d..739e7870 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -98,7 +98,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const documentView = ( <> -
    +
    setPDFVisible(false)}>
    @@ -154,7 +154,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -169,12 +169,12 @@ export default function LessonPractica({ element, content, fetchPropElement, cle fetchPropElement(element.id); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -189,12 +189,12 @@ export default function LessonPractica({ element, content, fetchPropElement, cle fetchPropElement(element.id); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -210,14 +210,14 @@ export default function LessonPractica({ element, content, fetchPropElement, cle clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { setDocValue({ title: '', description: '', document: null, url: '' }); setEditingLesson({ title: '', description: '', document: null, url: '' }); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -234,7 +234,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle
    {docShow ? ( - + ) : ( document && (
    - { + { setDocValue((prev) => ({ ...prev, title: e.target.value })); setValue('title', e.target.value, { shouldValidate: true }); }} /> @@ -303,7 +303,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle { @@ -314,22 +314,22 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {errors.usefulLinkNotReq?.message}
    )} - { + { setDocValue((prev) => ({ ...prev, description: e.target.value })) setValue('title', e.target.value, { shouldValidate: true }); }} className="w-full" /> {errors.title?.message}
    - {/*
    diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index 7272b317..8ce4190e 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -23,13 +23,6 @@ import { Dialog } from 'primereact/dialog'; import { FileWithPreview } from '@/types/fileuploadPreview'; export default function LessonVideo({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { - interface docValueType { - title: string; - description: string; - file: File | null; - document?: string; - } - interface contentType { course_id: number | null; created_at: string; @@ -52,13 +45,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP id: number; } - interface videoInsideType { - id: number; - is_link: boolean; - short_title: string; - title: string; - } - interface videoValueType { title: string; description: string | null; // вместо ? → строго string | null @@ -69,17 +55,11 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP cover: File | null; } - const { course_id } = useParams(); - - const router = useRouter(); - const media = useMediaQuery('(max-width: 640px)'); const fileUploadRef = useRef(null); // videos const [video, setVideo] = useState(); const [selectedCity, setSelectedCity] = useState({ name: '', status: true, id: 1 }); - const [videoSelect, setVideoSelect] = useState([]); - const [videoTypes, setVideoTypes] = useState([]); const [videoCall, setVideoCall] = useState(false); const [videoLink, setVideoLink] = useState(''); const [videoValue, setVideoValue] = useState<{ title: string; description: string; file: null; url: string; video_link: string; cover: File | null; link: null }>({ @@ -104,7 +84,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const [contentShow, setContentShow] = useState(false); - const [videoVisible, setVideoVisible] = useState(false); const clearFile = () => { fileUploadRef.current?.clear(); @@ -137,7 +116,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP if (!value) { setMessage({ state: true, - value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + value: { severity: 'error', summary: 'Ошибка при обработке видео', detail: '' } }); } @@ -155,7 +134,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP if (!videoId) { setMessage({ state: true, - value: { severity: 'error', summary: 'Видеону иштетүүдө ката', detail: '' } + value: { severity: 'error', summary: 'Ошибка при обработке видео', detail: '' } }); return null; // не удалось получить ID } @@ -205,7 +184,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -223,12 +202,12 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү Кошулдуу!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -245,12 +224,12 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP fetchPropElement(element.id); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -268,13 +247,13 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { setEditingLesson(null); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -293,7 +272,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP { @@ -309,7 +288,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP { setVideoValue((prev) => ({ ...prev, title: e.target.value })); @@ -319,7 +298,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP {errors.title?.message} {additional.video && (
    - setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> + setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />
    @@ -333,14 +312,14 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP )}
    - {/*
    @@ -371,7 +350,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    */} {videoShow ? ( - + ) : ( <> {!videoCall ? ( @@ -383,7 +362,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} cardBg={'#ddc4f51a'} type={{ typeValue: 'video', icon: 'pi pi-video' }} - typeColor={'va r(--mainColor)'} + typeColor={'var(--mainColor)'} lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} urlForPDF={() => ''} urlForDownload="" @@ -416,7 +395,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP }; useEffect(() => { - console.log('content', content); if (content) { setContentShow(true); setVideo(content); @@ -426,17 +404,12 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP }, [content]); useEffect(() => { - console.log('video', element); setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); }, [element]); - useEffect(() => { - console.log('edititing', editingLesson); - }, [editingLesson]); - return (
    - handleUpdateVideo()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}> + handleUpdateVideo()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}>
    { @@ -445,7 +418,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    { @@ -479,7 +452,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP {/* )} */} { @@ -488,7 +461,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP }} /> {errors.title?.message} - setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> }
    diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 9cd5f0c3..c4bc74ce 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -81,8 +81,6 @@ export default function StreamList({ setPendingChanges([]); if (data) { - console.log(data); - profilactor(data); setHasStreams(false); setStreams(data); @@ -90,7 +88,7 @@ export default function StreamList({ setHasStreams(true); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Байланыш менен көйгөй' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Проблема с соединением' } }); if (data?.response?.status) { showError(data.response.status); @@ -106,12 +104,12 @@ export default function StreamList({ handleFetchStreams(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -157,7 +155,6 @@ export default function StreamList({ useEffect(() => { setDisplayStreams(pendingChanges); - console.log(pendingChanges); }, [pendingChanges]); useEffect(() => { @@ -305,7 +302,7 @@ export default function StreamList({ > {streams && streams.length > 0 ? ( - rowIndex + 1} header="Номер"> + rowIndex + 1} header="#"> {/* */}

    {rowData.subject_name.name_ru}

    }>
    @@ -380,7 +377,7 @@ export default function StreamList({ {hasStreams ? ( <> - + ) : (
    diff --git a/layout/AppFooter.tsx b/layout/AppFooter.tsx index 8561ab3b..e1da9dcc 100644 --- a/layout/AppFooter.tsx +++ b/layout/AppFooter.tsx @@ -7,7 +7,7 @@ import axiosInstance from '@/utils/axiosInstance'; const AppFooter = () => { const { layoutConfig } = useContext(LayoutContext); - const [univer, setUniver] = useState<{ address_kg: string; contact_kg: string, info_ru: string, info_en: string }>({ address_kg: '', contact_kg: '', info_ru: '', info_en:'' }); + const [univer, setUniver] = useState<{ address_ru: string; contact_ru: string, info_ru: string, info_en: string }>({ address_ru: '', contact_ru: '', info_ru: '', info_en:'' }); // dark mode // Logo @@ -24,25 +24,18 @@ const AppFooter = () => { useEffect(() => { const handleInfo = async ()=> { const data = await fetchInfo(); - console.log(data); - if(data){ setUniver({ - address_kg: data[0]?.address_kg, - contact_kg: data[0]?.contact_kg, + address_ru: data[0]?.address_ru, + contact_ru: data[0]?.contact_ru, info_ru: data[0]?.info_ru, info_en: data[0]?.info_en, - // contact_kg: data[0]?.contact_kg }); } } handleInfo(); }, []); - useEffect(() => { - console.log(univer); - }, [univer]); - return (
    @@ -50,36 +43,10 @@ const AppFooter = () => {
    Логотип
    - {univer.address_kg} - {univer.contact_kg} -
    -
    - {/*
    -
    - -

    - Курстар -

    -
    -
    - lorem ipsum - lorem ipsum - lorem ipsum + {univer.address_ru} + {univer.contact_ru}
    -
    -
    - -

    - Байланыш -

    -
    -
    - lorem ipsum - lorem ipsum - lorem ipsum -
    -
    */}

    ©{univer.info_ru} | {univer.info_en} IT Academy diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 1eae498f..b498daf3 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -17,7 +17,6 @@ import { yupResolver } from '@hookform/resolvers/yup'; import { lessonSchema } from '@/schemas/lessonSchema'; import useErrorMessage from '@/hooks/useErrorMessage'; import { Button } from 'primereact/button'; -import Link from 'next/link'; const AppMenu = () => { const { user, setDeleteQuery, setUpdateeQuery, contextFetchThemes, contextThemes, contextFetchStudentThemes, contextStudentThemes, departament } = useContext(LayoutContext); @@ -43,8 +42,6 @@ const AppMenu = () => { const pathname = location; const { studentThemeCourse } = useParams(); const params = useParams(); - console.log(params); - const course_Id = params.course_Id; const id_kafedra = params?.id_kafedra ? params.id_kafedra : null; @@ -70,7 +67,7 @@ const AppMenu = () => { to: '/course' }, { - label: 'Темалар', + label: 'Темы', icon: 'pi pi-fw pi-calendar-clock', items: courseList?.length > 0 ? courseList : [] } @@ -78,8 +75,8 @@ const AppMenu = () => { : [] : user?.is_student ? [ - { label: 'Окуу планы', icon: 'pi pi-fw pi-calendar-clock', to: '/teaching' }, - pathname.startsWith('/teaching/lesson/') ? { label: 'Темалар', icon: 'pi pi-fw pi-book', items: themesStudentList?.length > 0 ? themesStudentList : [] } : { label: '' } + { label: 'План обучения', icon: 'pi pi-fw pi-calendar-clock', to: '/teaching' }, + pathname.startsWith('/teaching/lesson/') ? { label: 'Темы', icon: 'pi pi-fw pi-book', items: themesStudentList?.length > 0 ? themesStudentList : [] } : { label: '' } ] : []; @@ -134,13 +131,12 @@ const AppMenu = () => { const editing = async (id: number) => { const data = await fetchLessonShow(id); - console.log(data); if (data.lesson) { setEditingLesson({ title: data.lesson.title, sequence_number: data.lesson.sequence_number }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кийинчерээк кайталаныз' } + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } }); if (data?.response?.status) { showError(data.response.status); @@ -162,13 +158,13 @@ const AppMenu = () => { clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү кошулду!', detail: '' } + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { setEditingLesson(null); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Кошуу учурунда катаа кетти' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -179,17 +175,16 @@ const AppMenu = () => { const handleDeleteTheme = async (id: number) => { const data = await deleteTheme(id); if (data.success) { - console.warn('treu', data); contextFetchThemes(Number(course_Id), id_kafedra ? Number(id_kafedra) : null); setDeleteQuery(true); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өчүрүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өчүрүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при удалении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -206,13 +201,13 @@ const AppMenu = () => { clearValues(); setMessage({ state: true, - value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } + value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } }); } else { setEditingLesson(null); setMessage({ state: true, - value: { severity: 'error', summary: 'Катаа!', detail: 'Өзгөртүүдө ката кетти' } + value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } }); if (data?.response?.status) { showError(data.response.status); @@ -274,7 +269,7 @@ const AppMenu = () => { return ( { handleUpdate(); }} @@ -298,7 +293,7 @@ const AppMenu = () => {

    { @@ -313,7 +308,7 @@ const AppMenu = () => { { handleAddTheme(); }} @@ -335,7 +330,7 @@ const AppMenu = () => { />
    - Аталышы + Название { {pathname.startsWith('/course/') && (
    - +
    )} diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 108705c2..a13fa854 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -48,7 +48,7 @@ const AppTopbar = forwardRef((props, ref) => { ) }, { - label: 'Чыгуу', + label: 'Выход', icon: 'pi pi-sign-out', className: 'text-[12px]', items: [], @@ -60,7 +60,7 @@ const AppTopbar = forwardRef((props, ref) => { ] } : { - label: 'Кирүү', + label: 'Вход', icon: 'pi pi-sign-in', items: [], // url: '/auth/login' @@ -70,7 +70,7 @@ const AppTopbar = forwardRef((props, ref) => { } }, { - label: 'ОшМУнун сайты', + label: 'Сайт ОшГУ', icon: '', items: [], url: 'https://oshsu.kg' @@ -92,7 +92,7 @@ const AppTopbar = forwardRef((props, ref) => { ) }, { - label: 'Чыгуу', + label: 'Выход', icon: 'pi pi-sign-out', items: [], command: () => { @@ -102,10 +102,6 @@ const AppTopbar = forwardRef((props, ref) => { } ]; - useEffect(() => { - console.log('dep', departament); - }, [departament]); - return (
    @@ -136,31 +132,8 @@ const AppTopbar = forwardRef((props, ref) => { {media ? ( <> ) : ( - //
    - {/* - */} - - ОшМУнун сайты - - {/* - Байланыш - */} + Сайт ОшГУ
    )} @@ -171,7 +144,7 @@ const AppTopbar = forwardRef((props, ref) => { ) : (
    - +
    )} */} diff --git a/utils/getConfirmOptions.tsx b/utils/getConfirmOptions.tsx index 1e5ea5d3..d29380d6 100644 --- a/utils/getConfirmOptions.tsx +++ b/utils/getConfirmOptions.tsx @@ -12,13 +12,13 @@ type ConfirmDialogOptions = { }; export const getConfirmOptions = (id: number, onDelete: (id: number)=> void ): ConfirmDialogOptions => ({ - message: 'Сиз чын эле өчүрүүнү каалайсызбы?', - header: 'Өчүрүү', + message: 'Вы действительно хотите удалить?', + header: 'Удаление', icon: 'pi pi-info-circle', defaultFocus: 'reject', acceptClassName: 'p-button-danger', - acceptLabel: 'Өчүрүү', - rejectLabel: 'Артка', + acceptLabel: 'Удалить', + rejectLabel: 'Назад', rejectClassName: 'p-button-secondary reject-button', accept: () => onDelete(id) }); From e0bee72368dc63078cb7c665ed84995f2e0375e0 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 18 Sep 2025 14:58:43 +0600 Subject: [PATCH 175/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=87=D0=B5=D0=BA=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=20=D0=BD=D0=B0=20=D1=80=D0=B0=D1=81=D1=81=D0=BC?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 2 +- app/(main)/course/page.tsx | 83 +++++++++++++++++++++++++--- app/components/tables/StreamList.tsx | 2 +- app/globals.css | 8 ++- services/courses.tsx | 18 +++++- services/query-tests.http | 12 +++- services/streams.tsx | 18 +----- 7 files changed, 110 insertions(+), 33 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 3413ddc3..5727b1af 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -122,7 +122,7 @@ const LoginPage = () => { {errors.password && {errors.password.message}}
    - +
    diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 1be60b03..12dfa88c 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -1,7 +1,7 @@ 'use client'; import FormModal from '@/app/components/popUp/FormModal'; -import { addCourse, deleteCourse, fetchCourseInfo, fetchCourses, publishCourse, updateCourse } from '@/services/courses'; +import { addCourse, deleteCourse, fetchCourseInfo, fetchCourses, publishCourse, updateCourse, veryfyCourse } from '@/services/courses'; import { Button } from 'primereact/button'; import { FileUpload, FileUploadSelectEvent } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; @@ -30,6 +30,7 @@ import { ProgressSpinner } from 'primereact/progressspinner'; import { DataView } from 'primereact/dataview'; import { FileWithPreview } from '@/types/fileuploadPreview'; import { mainStreamsType } from '@/types/mainStreamsType'; +import { InputSwitch } from 'primereact/inputswitch'; export default function Course() { const { setMessage, setGlobalLoading, course, setCourses, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); @@ -50,6 +51,7 @@ export default function Course() { }); const [activeIndex, setActiveIndex] = useState(0); const [imageState, setImageState] = useState(null); + const [pendingChanges, setPendingChanges] = useState<{ status: boolean }[]>([]); const [editingLesson, setEditingLesson] = useState({ title: '', description: '', @@ -72,6 +74,33 @@ export default function Course() { }, 1000); }; + const handleEdit = async (e: { checked: boolean }, item: { status: boolean; id: number }) => { + setSkeleton(true); + + const { id } = item; + const status = e.checked; + + const forSentStreams = { + course_id: id, + status: status ? 1 : 0 + }; + console.log(forSentStreams); + const data = await veryfyCourse(forSentStreams); + if (data.success) { + contextFetchCourse(1); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } + }); + } else { + setSkeleton(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Не удалось добавить курс', detail: '' } + }); + } + }; + const fileUploadRef = useRef(null); const clearFile = () => { fileUploadRef.current?.clear(); @@ -307,10 +336,6 @@ export default function Course() { } }, [editMode]); - useEffect(() => { - console.log('forstream ', forStreamCount); - }, [forStreamCount]); - const itemTemplate = (shablonData: any) => { return (
    @@ -342,6 +367,27 @@ export default function Course() {
    {imageBodyTemplate(shablonData)}
    +
    +
    + Публикация: + {shablonData.is_published ? : } +
    +
    + На рассмотрение: + +
    +
    + <> @@ -593,7 +639,7 @@ export default function Course() { ) : (
    -
    +
    {/* info section */} {skeleton ? ( @@ -646,6 +692,25 @@ export default function Course() { )} > + ( + <> + + + )} + > ( <> @@ -669,7 +734,7 @@ export default function Course() { }} checked={forStreamId?.id === rowData.id} /> - Связать + Связать )} diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index c4bc74ce..fdf020b7 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -348,7 +348,7 @@ export default function StreamList({ )} {callIndex === 1 && ( -
    +
    {skeleton ? ( ) : ( diff --git a/app/globals.css b/app/globals.css index 367a019e..1c59471a 100644 --- a/app/globals.css +++ b/app/globals.css @@ -809,4 +809,10 @@ h1, h2, h3, h4, h5, h6 { /* маленькая адаптация */ @media (max-width: 380px){ :root { --size-w: 50px; --size-h: 20px } -} \ No newline at end of file +} + +@media (max-width: 640px){ + .main-bg{ + padding: 6px 6px; + } +} diff --git a/services/courses.tsx b/services/courses.tsx index 6e994234..24eef237 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -361,7 +361,23 @@ export const publishCourse = async (id_kafedra: number, id_teacher: number, cour return res.data; } catch (err) { - console.log('Ошибка при добавлении курса', err); + console.log('Ошибка', err); + return err; + } +}; + +export const veryfyCourse = async (value: {course_id: number, status: number}) => { + const formData = new FormData(); + formData.append('course_id', String(value.course_id)) + formData.append('status', String(value.status)) + + try { + const res = await axiosInstance.post(`/v1/teacher/courses/send/verify`, formData); + + return res.data; + } catch (err) { + console.log('Ошибка', err); return err; } }; + diff --git a/services/query-tests.http b/services/query-tests.http index b0e1de88..4bfc96fc 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,4 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTgwOTk4NTEsImV4cCI6MTc1ODEyODcxMSwibmJmIjoxNzU4MDk5ODUxLCJqdGkiOiJ1RGxQMjdYMHFLa2NVbXVDIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.MMZZJ2d06qK5Emrl-hUvMOSQqzvGLmMIMaTAoXc2Jmk +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTgxODA4NTIsImV4cCI6MTc1ODIwOTcxMiwibmJmIjoxNzU4MTgwODUyLCJqdGkiOiJoQk85b0xFMGZqcTdUTVlxIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.T9LuBqZLazYsdQhKkx3O3oO67U-4WE7gtlghMheWNO8 # ### # http://api.mooc.oshsu.kg/public/api/v1/open/video/types @@ -14,8 +14,14 @@ # ### # test -# POST https://api.mooc.oshsu.kg/public/api/v1/login?email=ajaparkulov@oshsu.kg&password=010270Ja -# Content-Type: application/json +POST https://api.mooc.oshsu.kg/public/api/v1/teacher/courses/send/verify?course_id=41&status=0 +Authorization: Bearer {{token}} +Content-Type: application/json + +{ + "course_id" : 41, + "status" : 0 +} # { # "email": "ajaparkulov@oshsu.kg", diff --git a/services/streams.tsx b/services/streams.tsx index 6d6de776..fbf87d44 100644 --- a/services/streams.tsx +++ b/services/streams.tsx @@ -1,12 +1,8 @@ import { streamsType } from '@/types/streamType'; import axiosInstance from '@/utils/axiosInstance'; -let url = ''; - // streams export const fetchStreams = async (id: number | null) => { - console.log(id); - try { const res = await axiosInstance.get(`v1/teacher/stream?course_id=${id}`); const data = await res.data; @@ -19,16 +15,6 @@ export const fetchStreams = async (id: number | null) => { // export const connectStreams = async (value: {stream: streamsType[]}) => { export const connectStreams = async (value: {course_id: number | null, stream: streamsType[]}) => { - console.log(value); - - // const formData = new FormData(); - // formData.append('title', value.title); - // formData.append('description', value.description); - // if (value.image instanceof File) { - // formData.append('image', value.image); - // } - // formData.append('video_url', value.video_url); - try { const res = await axiosInstance.post(`/v1/teacher/stream/store`, value); @@ -41,9 +27,7 @@ export const connectStreams = async (value: {course_id: number | null, stream: s // students stream -export const fetchStreamStudents = async (connect_id: number | null, stream_id: number | null) => { - console.log(connect_id, stream_id); - +export const fetchStreamStudents = async (connect_id: number | null, stream_id: number | null) => { try { const res = await axiosInstance.get(`v1/teacher/stream/students?connect_id=${connect_id}&stream_id=${stream_id}`); const data = await res.data; From 2352fd04adba1175a49f9877ed5f09a899783933 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 18 Sep 2025 15:20:35 +0600 Subject: [PATCH 176/286] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B0=D0=B4=D0=B4=D0=B8=D0=BD=D0=B3=D0=B8=20?= =?UTF-8?q?=D0=B2=20responzive.scss=20-=20content.scss?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/tables/StreamList.tsx | 2 +- styles/layout/_content.scss | 2 +- styles/layout/_responsive.scss | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index fdf020b7..d193d11c 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -348,7 +348,7 @@ export default function StreamList({ )} {callIndex === 1 && ( -
    +
    {skeleton ? ( ) : ( diff --git a/styles/layout/_content.scss b/styles/layout/_content.scss index 2c40e1da..e1d57587 100644 --- a/styles/layout/_content.scss +++ b/styles/layout/_content.scss @@ -3,7 +3,7 @@ flex-direction: column; min-height: 100vh; justify-content: space-between; - padding: 7rem 2rem 2rem 4rem; + padding: 7rem 1rem 1rem 2rem !important; transition: margin-left $transitionDuration; } diff --git a/styles/layout/_responsive.scss b/styles/layout/_responsive.scss index 3498da0a..c51594c2 100644 --- a/styles/layout/_responsive.scss +++ b/styles/layout/_responsive.scss @@ -11,7 +11,7 @@ &.layout-overlay { .layout-main-container { margin-left: 0; - padding-left: 2rem; + padding-left: 1rem !important; } .layout-sidebar { @@ -43,7 +43,7 @@ .layout-main-container { margin-left: 0; - padding-left: 2rem; + padding-left: 1rem !important; } } } @@ -62,7 +62,7 @@ .layout-wrapper { .layout-main-container { margin-left: 0; - padding-left: 2rem; + padding-left: 1rem !important; } .layout-sidebar { From 980961eb345289dee078c3d1c3f6fe014af5afb2 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 18 Sep 2025 15:49:11 +0600 Subject: [PATCH 177/286] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 12dfa88c..13733f55 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -693,7 +693,7 @@ export default function Course() { )} > ( <> @@ -711,13 +711,6 @@ export default function Course() { )} > - - rowData.is_published ? : - } - > )} > + + rowData.is_published ? : + } + > ( From 7c5670e29cad1099644eaace73d9a36749943bbb Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 18 Sep 2025 16:22:09 +0600 Subject: [PATCH 178/286] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D0=B3?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=B0=D0=B4=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonPractica.tsx | 157 +++++++++++++--------- app/globals.css | 2 +- hooks/useErrorMessage.tsx | 12 +- services/steps.tsx | 7 +- styles/layout/_content.scss | 2 +- styles/layout/_responsive.scss | 6 +- 6 files changed, 104 insertions(+), 82 deletions(-) diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 739e7870..3fd936b4 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -30,6 +30,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle description: string; document: File | null; url: string; + score: number | null; } interface contentType { @@ -47,26 +48,19 @@ export default function LessonPractica({ element, content, fetchPropElement, cle url: string; } - const { course_id } = useParams(); - const router = useRouter(); const media = useMediaQuery('(max-width: 640px)'); const fileUploadRef = useRef(null); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); - const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '' }); + const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '',score: 0 }); const [visible, setVisisble] = useState(false); const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); // doc const [document, setDocuments] = useState(); - const [docValue, setDocValue] = useState({ - title: '', - description: '', - document: null, - url: '' - }); + const [docValue, setDocValue] = useState({ title: '', description: '', document: null, url: '',score: 0 }); const [docShow, setDocShow] = useState(false); const [urlPDF, setUrlPDF] = useState(''); const [PDFVisible, setPDFVisible] = useState(false); @@ -109,8 +103,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const clearValues = () => { clearFile(); - setDocValue({ title: '', description: '', document: null, url: '' }); - setEditingLesson({ title: '', description: '', document: null, url: '' }); + setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); + setEditingLesson({ title: '', description: '', document: null, url: '', score: 0 }); setSelectId(null); setSelectType(''); }; @@ -149,8 +143,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); + console.log(data); + if (data.success) { - setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '' }); + setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '', score: data.step.score}); } else { setMessage({ state: true, @@ -174,7 +170,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle } else { setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } + value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); if (data.response.status) { showError(data.response.status); @@ -213,8 +209,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { - setDocValue({ title: '', description: '', document: null, url: '' }); - setEditingLesson({ title: '', description: '', document: null, url: '' }); + setDocValue({ title: '', description: '', document: null, url: '', score:0 }); + setEditingLesson({ title: '', description: '', document: null, url: '', score:0 }); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } @@ -256,47 +252,34 @@ export default function LessonPractica({ element, content, fetchPropElement, cle ) : (
    - { - setDocValue((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} /> + { + setDocValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + />
    {errors.title?.message} {additional.doc && ( - //
    - // {}} - // accept="application/pdf" - // onSelect={(e) => - // setDocValue((prev) => ({ - // ...prev, - // document: e.files[0] - // })) - // } - // /> - //
    { - console.log(e.target.files); - const file = e.target.files?.[0]; - if(file){ - setDocValue((prev) => ({ - ...prev, - document: file - })) - } - }} - /> + type="file" + accept="application/pdf" + className="border rounded p-1" + onChange={(e) => { + console.log(e.target.files); + const file = e.target.files?.[0]; + if (file) { + setDocValue((prev) => ({ + ...prev, + document: file + })); + } + }} + /> )} {additional.doc && (
    @@ -314,12 +297,29 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {errors.usefulLinkNotReq?.message}
    )} - { - setDocValue((prev) => ({ ...prev, description: e.target.value })) - setValue('title', e.target.value, { shouldValidate: true }); - }} className="w-full" /> + { + setDocValue((prev) => ({ ...prev, description: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + className="w-full" + /> {errors.title?.message} +
    + Максимальный балл + { + setDocValue((prev) => prev && { ...prev, score: Number(e.target.value) }); + }} + /> +
    +
    {/*
    - {element?.step.type.name === 'document' && } - {element?.step.type.name === 'video' && } - {element?.step.type.name === 'test' && } - {element?.step.type.name === 'practical' && } - {element?.step.type.name === 'link' && } + {element?.step.type.name === 'document' && } + {element?.step.type.name === 'video' && } + {element?.step.type.name === 'test' && } + {element?.step.type.name === 'practical' && } + {element?.step.type.name === 'link' && } + {skeleton ? ( +
    + +
    + ) : ( + !hasSteps && ( +
    +
    + ) + )} + + )}
    ); } diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 352cfe7d..7b91c512 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -95,10 +95,10 @@ export default function Course() { } else { console.log(data); setSkeleton(false); - if(data.response.data.cause){ + if (data.response.data.cause) { setMessage({ state: true, - value: { severity: 'error', summary: 'Ошибка!', detail: data.response.data.cause} + value: { severity: 'error', summary: 'Ошибка!', detail: data.response.data.cause } }); } else { setMessage({ @@ -408,9 +408,7 @@ export default function Course() { }} checked={forStreamId?.id === shablonData.id} /> - setActiveIndex(1)}> - Связать - + Связан ({shablonData.connects_count}) @@ -427,6 +425,10 @@ export default function Course() { ); }; + useEffect(()=> { + console.log(forStreamCount); + },[forStreamCount]); + const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); @@ -701,7 +703,7 @@ export default function Course() { )} >
    На рассмотр.
    } + header={() =>
    На рассмотр.
    } style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => ( <> @@ -719,6 +721,13 @@ export default function Course() { )} >
    + + rowData.is_published ? : + } + > - Связать + Связан ({rowData.connects_count}) )} > - - rowData.is_published ? : - } - > ( diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 3926e375..649ab732 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -1,5 +1,3 @@ -import Redacting from '../popUp/Redacting'; -import { getRedactor } from '@/utils/getRedactor'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; import { Button } from 'primereact/button'; import { faPlay } from '@fortawesome/free-solid-svg-icons'; @@ -99,18 +97,18 @@ export default function LessonCard({ style={{ backgroundColor: cardBg }} >
    -
    +
    {/*
    {!cardValue.photo && }
    */} -
    - {shortTitle} +
    {cardValue.score ? ( -
    - {!media && '/'} Балл: +
    + Балл: {`${cardValue.score}`}
    ) : ( '' )} + {shortTitle}
    {type.typeValue !== 'practica' &&
    {shortDoc}
    } @@ -130,7 +128,7 @@ export default function LessonCard({ ) )} {answers && ( -
    +
    {answers.map((item) => { return (
    diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 7593ea76..640e12d9 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -207,7 +207,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const handleUpdateDoc = async () => { const token = getToken('access_token'); const data = await updateDocument(token, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.type.id, editingLesson); - console.log(data); if (data?.success) { fetchPropElement(element.id); @@ -281,7 +280,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle { console.log(e.target.files); const file = e.target.files?.[0]; @@ -294,27 +293,30 @@ export default function LessonDocument({ element, content, fetchPropElement, cle }} /> - { - setDocValue((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} +
    + { + setDocValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
    {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />}
    {/*
    */} - { - console.log(e.target.files); - const file = e.target.files?.[0]; - if (file) { - setEditingLesson( - (prev) => - prev && { - ...prev, - file: file - } - ); - } - }} - /> - {/* {String(editingLesson?.file[0].objectURL)} */} - { - setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} - setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} - className="w-full" - /> - - ) : selectType === 'video' ? ( - <> - ) : ( - '' - )} + { + console.log(e.target.files); + const file = e.target.files?.[0]; + if (file) { + setEditingLesson( + (prev) => + prev && { + ...prev, + file: file + } + ); + } + }} + /> + {/* {String(editingLesson?.file[0].objectURL)} */} +
    + { + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
    + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} + className="w-full" + />
    diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index ed55f375..b7c9f954 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -97,7 +97,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); console.log(data); - + if (data.success) { setEditingLesson({ title: data.content.title, description: data.content.description, url: data.content.url }); } else { @@ -113,7 +113,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const handleAddLink = async () => { toggleSpinner(); - const data = await addLink(linkValue, element.lesson_id, element.type_id, element.id); + const data = await addLink(linkValue, element.lesson_id, element.type_id, element.id); if (data.success) { fetchPropElement(element.id); setMessage({ @@ -216,32 +216,31 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr /> {errors.usefulLink?.message}
    - { - setLinkValue((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} +
    + { + setLinkValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
    {additional.link && setLinkValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />}
    {/*
    @@ -266,50 +265,43 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr return (
    - handleUpdateLink()} - clearValues={clearValues} - visible={visible} - setVisible={setVisisble} - start={false} - > + handleUpdateLink()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}>
    - { - setEditingLesson((prev) => ({ ...prev, url: e.target.value })); - setValue('usefulLink', e.target.value, { shouldValidate: true }); - }} - /> - {errors.usefulLink?.message} -
    { - setEditingLesson((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); + setEditingLesson((prev) => ({ ...prev, url: e.target.value })); + setValue('usefulLink', e.target.value, { shouldValidate: true }); }} /> - {errors.title?.message} - {additional.link && setEditingLesson((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + {errors.usefulLink?.message} +
    + { + setEditingLesson((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + {additional.link && setEditingLesson((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} -
    - {/*
    {!clearProp && linkSection()} diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 3fd936b4..bb36c18f 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -46,6 +46,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle user_id: number; document_path: string; url: string; + score?: number | null; } const router = useRouter(); @@ -54,13 +55,13 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); - const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '',score: 0 }); + const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '', score: 0 }); const [visible, setVisisble] = useState(false); const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); // doc const [document, setDocuments] = useState(); - const [docValue, setDocValue] = useState({ title: '', description: '', document: null, url: '',score: 0 }); + const [docValue, setDocValue] = useState({ title: '', description: '', document: null, url: '', score: 0 }); const [docShow, setDocShow] = useState(false); const [urlPDF, setUrlPDF] = useState(''); const [PDFVisible, setPDFVisible] = useState(false); @@ -144,9 +145,9 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); console.log(data); - + if (data.success) { - setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '', score: data.step.score}); + setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '', score: data.step.score }); } else { setMessage({ state: true, @@ -209,8 +210,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { - setDocValue({ title: '', description: '', document: null, url: '', score:0 }); - setEditingLesson({ title: '', description: '', document: null, url: '', score:0 }); + setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); + setEditingLesson({ title: '', description: '', document: null, url: '', score: 0 }); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка при изменении!', detail: '' } @@ -237,7 +238,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle status="working" onSelected={(id: number, type: string) => selectedForEditing(id, type)} onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document }} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document, score: element?.score || 0 }} cardBg={'#ddc4f51a'} type={{ typeValue: 'practica', icon: 'pi pi-list' }} typeColor={'var(--mainColor)'} @@ -252,18 +253,50 @@ export default function LessonPractica({ element, content, fetchPropElement, cle ) : (
    - +
    + { + setDocValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> +
    + {errors.title?.message} +
    +
    + Балл + { + setDocValue((prev) => prev && { ...prev, score: Number(e.target.value) }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
    +
    +
    + { - setDocValue((prev) => ({ ...prev, title: e.target.value })); + setDocValue((prev) => ({ ...prev, description: e.target.value })); setValue('title', e.target.value, { shouldValidate: true }); }} + className="w-full" /> + {errors.title?.message}
    - {errors.title?.message} {additional.doc && ( {errors.usefulLinkNotReq?.message}
    )} - { - setDocValue((prev) => ({ ...prev, description: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - className="w-full" - /> - {errors.title?.message} - -
    - Максимальный балл - { - setDocValue((prev) => prev && { ...prev, score: Number(e.target.value) }); - }} - /> -
    {/*
    - {typeof editingLesson?.document === 'string' && String(editingLesson?.document)} + }} + />
    )} {additional.doc && ( @@ -425,33 +456,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle />
    )} - { - setEditingLesson((prev) => ({ ...prev, description: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - className="w-full" - /> - {errors.title?.message} - -
    - Максимальный балл - { - setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); - }} - /> -
    - +
    - setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> + setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> Дополнительно {additional.doc ? '-' : '+'}
    diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 12ef920b..a0efaa25 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -211,7 +211,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr ) : (
    -
    +
    {errors.title?.message}
    - Балл + Балл { setTestValue((prev) => ({ ...prev, score: Number(e.target.value) })); @@ -330,7 +330,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr {errors.title?.message}
    - Балл + Балл { return (
    - { - setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, is_correct: true } : { ...ans, is_correct: false }))); - }} - /> + void; clearProp: boolean }) { @@ -285,17 +282,20 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    - { - setVideoValue((prev) => ({ ...prev, title: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} +
    + { + setVideoValue((prev) => ({ ...prev, title: e.target.value })); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} +
    {additional.video && (
    setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> @@ -314,12 +314,12 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    {/*
    @@ -371,7 +371,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP ) ) : (
    -
    +
    setVideoCall(false)}>
    + )} +
    +
    + ); + + return ( +
    +
    +
    +
    +

    {'course'}

    + {courseInfoClass && babt} +
    + description description description description description descriptiondescription +
    + Тема: + {'theme title'} +
    +
    +
    + {/* practica */} + {type === 'document' && docSection} + {type === 'practical' && practicaSection} + {type === 'test' && testSection} + {type === 'video' && videoSection} +
    + ); +} diff --git a/app/(student)/test/page.tsx b/app/(student)/test/page.tsx deleted file mode 100644 index 217a308f..00000000 --- a/app/(student)/test/page.tsx +++ /dev/null @@ -1,112 +0,0 @@ -'use client'; - -import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; -import StudentInfoCard from '@/app/components/lessons/StudentInfoCard'; -import { mainStepsType } from '@/types/mainStepType'; -import { Accordion, AccordionTab } from 'primereact/accordion'; -import { ProgressBar } from 'primereact/progressbar'; -import { useState } from 'react'; - -export default function Test() { - const [hasSteps, setHasSteps] = useState(false); - const [activeIndex, setActiveIndex] = useState(0); - - const [content, setContent] = useState([ - { - id: 1, - id_parent: null, - type_id: 1, - user_id: 1, - lesson_id: 1, - step: 1, - type: { active: true, created_at: '', id: 1, logo: 'pi pi-folder', description: null, modelName: '', name: 'document', title: 'hhi', updated_at: '' }, - updated_at: '', - content: { - document: '', - document_path: '', - description: null, - title: 'Надо сделать: Посетить занятие resource iconКейс к практическому занятию', - link: '', - url: '', - content: 'jkkkk', - answers: [{ text: '', is_correct: false, id: null }], - score: 1 - }, - score: 1 - } - ]); - - return ( -
    - {/* */} - -

    - Название курса: - lll -

    - setActiveIndex(e.index)}> - -
    - {hasSteps ? ( -

    Данных нет

    - ) : content.length > 0 ? ( - content.map((i, idx) => { - if (i.content) { - return ( -
    -
    -
    -

    Завершено:

    -
    - -
    -
    - - -
    -
    - ); - } - }) - ) : ( -

    Данных нет

    - )} -
    -
    -
    -
    - ); -} diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index c2b070a9..0f14c72a 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -30,8 +30,6 @@ export default function PDFViewer({ url }: { url: string }) { useEffect(() => { const renderPDF = async () => { - console.log(url); - if (!url) return; setSkeleton(true); @@ -79,7 +77,7 @@ export default function PDFViewer({ url }: { url: string }) { const imageDataUrl = canvas.toDataURL(); tempPages.push(
    - {`Page + {`Page
    ); } @@ -142,7 +140,8 @@ export default function PDFViewer({ url }: { url: string }) { style={{ width: '100%', // или фиксированная ширина, например 800px maxWidth: '800px', // не даём контейнеру быть бесконечно широким - margin: '0 auto' + margin: '0 auto', + maxHeight: '1000px' }} > {hasPdf ? ( diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index b00cc7b6..05814bdf 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -114,7 +114,7 @@ export default function LessonCard({ {type.typeValue !== 'practica' &&
    {shortDoc}
    } {type.typeValue === 'practica' && cardValue.url ? ( -
    +
    Ссылка: diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index bb36c18f..b47f2cc2 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -270,10 +270,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {errors.title?.message}
    - Балл { diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index a28fd54d..08d317c7 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -20,18 +20,9 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import { InputTextarea } from 'primereact/inputtextarea'; +import { testType } from '@/types/testType'; export default function LessonTest({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { - interface testType { - answers: { id: number | null; text: string; is_correct: boolean }[]; - id: number | null; - content: string; - score: number; - image: string | null; - title: string; - created_at: string; - } - const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); diff --git a/app/components/lessons/StudentInfoCard.tsx b/app/components/lessons/StudentInfoCard.tsx index ae187da8..9e6bffc6 100644 --- a/app/components/lessons/StudentInfoCard.tsx +++ b/app/components/lessons/StudentInfoCard.tsx @@ -1,6 +1,7 @@ 'use client'; import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { lessonType } from '@/types/lessonType'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; @@ -13,22 +14,22 @@ export default function StudentInfoCard({ type, icon, title, - description, - documentUrl, - link, - video_link, - videoStart, - test + streams, + lesson, + stepId }: { type: string; icon: string; title?: string; - description?: string; - documentUrl?: { document: string | null; document_path: string }; - link?: string; - video_link?: string; - videoStart?: (id: string) => void; - test?: { content: string; answers: { id: number | null; text: string; is_correct: boolean }[]; score: number | null }; + // description?: string; + // documentUrl?: { document: string | null; document_path: string }; + // link?: string; + // video_link?: string; + // videoStart?: (id: string) => void; + // test?: { content: string; answers: { id: number | null; text: string; is_correct: boolean }[]; score: number | null }; + streams: { id: number; connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; title: string; description: string; user: { last_name: string; name: string; father_name: string }; lessons: lessonType[] }; + lesson: number; + stepId: number; }) { const { id_kafedra } = useParams(); // console.log(id_kafedra); @@ -45,71 +46,67 @@ export default function StudentInfoCard({
    -
    - {documentUrl?.document_path ? ( - documentUrl?.document_path?.length > 0 ? ( - 0 ? String(documentUrl?.document_path) : '#') : '#'} - className="max-w-[800px] text-[16px] text-wrap break-all hover:underline" - download - target="_blank" - rel="noopener noreferrer" - > - {title} - - ) : ( - {title} - ) - ) : ( - {title} - )} -

    {description !== 'null' && description}

    -
    + videoStart && videoStart(video_link || '')} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > + {title} +
    -
    +
    -
    - {documentUrl?.document_path && <> - - {' '} -
    ); const linkCard = ( -
    + ); const videoCard = ( -
    +
    - videoStart && videoStart(video_link || '')} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + videoStart && videoStart(video_link || '')} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > {title} - - -

    {description !== 'null' && description}

    +
    ); @@ -120,16 +117,26 @@ export default function StudentInfoCard({
    - setTestCall(true)} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + { + // setTestCall(true) + console.log(stepId); + console.log(lesson); + + console.log(streams.connections[0].id_stream); + }} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > Тест - +
    ); const testInfo = (
    - {test?.answers && ( + {/* {test?.answers && (
    {test?.content} @@ -152,7 +159,7 @@ export default function StudentInfoCard({ {`${test?.score}`}
    - )} + )} */}
    ); @@ -161,20 +168,31 @@ export default function StudentInfoCard({
    - setPracticaCall(true)} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + { + console.log(stepId); + console.log(lesson); + + console.log(streams.connections[0].id_stream); + + // setPracticaCall(true); + }} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > Практическое задание - +
    ); const practicaInfo = (
    -
    + {/*
    {documentUrl ? ( documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( - + {title} - + ) : (
    {title} @@ -209,12 +227,12 @@ export default function StudentInfoCard({ )}
    -
    +
    */}
    ); return ( -
    +
    { + + try { + const res = await axiosInstance.get(`/v1/student/course/lesson/step?step_id=${step_id}&stream_id=${stream_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; diff --git a/types/testType.tsx b/types/testType.tsx new file mode 100644 index 00000000..36a9646f --- /dev/null +++ b/types/testType.tsx @@ -0,0 +1,9 @@ +export interface testType { + answers: { id: number | null; text: string; is_correct: boolean }[]; + id: number | null; + content: string; + score: number; + image: string | null; + title: string; + created_at: string; +} From cdaab0c03e7415e1e6d071c7a679e06eedd74ba1 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 09:07:55 +0600 Subject: [PATCH 189/286] =?UTF-8?q?=D0=A3=D0=B2=D0=B5=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=20=D0=BF?= =?UTF-8?q?=D0=B4=D1=84=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=87=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 2 +- app/(main)/faculty/page.tsx | 6 +- app/(main)/pdf/[pdfUrl]/page.tsx | 11 +- .../lessonView/[stream_id]/[id]/page.tsx | 170 +++++++++--------- app/components/PDFBook.tsx | 12 +- app/components/lessons/LessonDocument.tsx | 63 +++---- app/components/lessons/LessonLink.tsx | 16 +- app/components/lessons/LessonPractica.tsx | 47 +++-- app/components/lessons/LessonTest.tsx | 70 ++++++-- app/components/lessons/LessonVideo.tsx | 13 +- app/components/lessons/StudentInfoCard.tsx | 23 +-- app/globals.css | 5 + 12 files changed, 239 insertions(+), 199 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index dc154d31..9dfbabb3 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -58,7 +58,7 @@ const LoginPage = () => { } } if(res?.user.is_student){ - window.location.href = '/'; + window.location.href = '/teaching'; } } else { setMessage({ diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index 290af41e..26b56451 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -87,10 +87,6 @@ export default function Faculty() { handleFetchKafedra(); }, [selected]); - useEffect(() => { - console.log(kafedra); - }, [kafedra]); - return (
    @@ -100,7 +96,7 @@ export default function Faculty() {

    Факультеты временно не доступны

    ) : (
    -

    Выберите факультет

    +

    Выберите факультет

    setSelected(e.value)} options={faculty} optionLabel="name_ru" className="w-[90%] overflow-x-auto" panelClassName="w-[50%] overflow-x-scroll" />
    )} diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index b7612004..e934dd1e 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -10,6 +10,7 @@ const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { }); import { useParams, useRouter } from 'next/navigation'; +import { Button } from 'primereact/button'; export default function PdfUrlViewer() { const { pdfUrl } = useParams(); @@ -17,11 +18,11 @@ export default function PdfUrlViewer() { return (
    - - -
    + + +
    diff --git a/app/(student)/teaching/lessonView/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[stream_id]/[id]/page.tsx index 6e65d5bc..3b809ec6 100644 --- a/app/(student)/teaching/lessonView/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[stream_id]/[id]/page.tsx @@ -47,23 +47,14 @@ export default function LessonTest() { // document const [document, setDocument] = useState(null); + // link + const [link, setLink] = useState(null); + // video const [video, setVideo] = useState(null); const [preview, setPreview] = useState(false); const [videoLink, setVideoLink] = useState(''); - const handleMainLesson = async () => { - // const data = await fetchMainLesson(Number(id), Number(stream_id)); - // if (data) { - // if (data.length > 0) { - // setHasSteps(false); - // setMainSteps(data); - // } else { - // setHasSteps(true); - // } - // } - }; - const handleStep = async () => { const data = await fetchStudentSteps(Number(id), Number(stream_id)); console.log(data); @@ -114,7 +105,6 @@ export default function LessonTest() { }; useEffect(() => { - // handleMainLesson(); handleStep(); }, []); @@ -126,6 +116,9 @@ export default function LessonTest() { if (steps?.type.name === 'document') { setType(steps?.type.name); setDocument(steps); + } else if (steps?.type.name === 'link') { + setType(steps?.type.name); + setLink(steps); } else if (steps?.type.name === 'practical') { setType(steps?.type.name); setPractica(steps); @@ -147,43 +140,11 @@ export default function LessonTest() { const courseInfoClass = true; - // doc section - // {documentUrl?.document_path ? ( - // documentUrl?.document_path?.length > 0 ? ( - // 0 ? String(documentUrl?.document_path) : '#') : '#'} - // className="max-w-[800px] text-[16px] text-wrap break-all hover:underline" - // download - // target="_blank" - // rel="noopener noreferrer" - // > - // {title} - // - // ) : ( - // {title} - // ) - // ) : ( - // {title} - // )} - - // doc section - - // link - // - // {title} - // - //

    {description !== 'null' && description}

    - - // link - - // video - //

    {description !== 'null' && description}

    - // video - const hasPdf = /pdf/i.test(document?.content?.document || ''); // true + const docSection = (
    -
    +
    {document?.content?.title} {document?.content?.description && (
    @@ -208,15 +169,36 @@ export default function LessonTest() { )} {progressSpinner && }
    - <> - {hasPdf ? ( -
    - + {/*
    +
    + +
    +
    */} +
    + ); + + const linkSection = ( +
    +
    + {link?.content?.title} + + {link?.content?.description && ( +
    +

    + + + {' '} + {link?.content?.description} +

    - ) : ( - 'Документ отсутствует' )} - +
    + Ссылка: + + {link?.content?.url} + +
    +
    ); @@ -224,14 +206,16 @@ export default function LessonTest() {
    {practica?.content?.title} -
    -

    - - - {' '} - {practica?.content?.description} -

    -
    + {practica?.content?.description && ( +
    +

    + + + {' '} + {practica?.content?.description} +

    +
    + )}
    @@ -315,25 +299,40 @@ export default function LessonTest() { const videoSection = (
    -
    - {!preview ? ( -
    -
    - +
    +
    + {video?.content?.title} + {video?.content?.description && ( +
    +

    + + + {' '} + {video?.content?.description} +

    - {/* Видео */} -
    - ) : ( - - )} + )} +
    +
    + {preview ? ( +
    +
    + +
    + {/* Видео */} +
    + ) : ( + + )} +
    ); @@ -343,18 +342,19 @@ export default function LessonTest() {
    -

    {'course'}

    - {courseInfoClass && babt} +

    {"Название курса"}

    + {/* {courseInfoClass && babt} */}
    - description description description description description descriptiondescription + Описание курса ...
    Тема: - {'theme title'} + {'Физика...'}
    - {/* practica */} + {type === 'document' && docSection} + {type === 'link' && linkSection} {type === 'practical' && practicaSection} {type === 'test' && testSection} {type === 'video' && videoSection} diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index 0f14c72a..7b47e995 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -130,18 +130,18 @@ export default function PDFViewer({ url }: { url: string }) { position: 'relative', overflow: 'hidden', isolation: 'isolate', - maxWidth: '800px', + maxWidth: '900px', margin: '0 auto' }} >
    {hasPdf ? ( @@ -201,11 +201,11 @@ export default function PDFViewer({ url }: { url: string }) { ) : ( import('../PDFBook'), { ssr: false @@ -59,6 +60,8 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const [visible, setVisisble] = useState(false); const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); + const [skeleton, setSkeleton] = useState(false); + // doc const [document, setDocuments] = useState(); const [docValue, setDocValue] = useState({ @@ -205,10 +208,12 @@ export default function LessonDocument({ element, content, fetchPropElement, cle // update document const handleUpdateDoc = async () => { + setSkeleton(true); const token = getToken('access_token'); const data = await updateDocument(token, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.type.id, editingLesson); if (data?.success) { + setSkeleton(false); fetchPropElement(element.id); clearValues(); setMessage({ @@ -216,6 +221,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { + setSkeleton(false); setDocValue({ title: '', description: '', file: null }); setEditingLesson(null); setMessage({ @@ -239,44 +245,31 @@ export default function LessonDocument({ element, content, fetchPropElement, cle {docShow ? ( ) : ( - document && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'doc', document: document.document }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'doc', icon: 'pi pi-doc' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} - urlForPDF={() => sentToPDF(document.document || '')} - urlForDownload={document.document_path || ''} - /> - ) + <> + {skeleton ? ( +
    + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'doc', document: document.document }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'doc', icon: 'pi pi-doc' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} + urlForPDF={() => sentToPDF(document.document || '')} + urlForDownload={document.document_path || ''} + /> + ) + )} + )}
    ) : (
    - {/*
    */} - {/* {}} - accept="application/pdf" - onSelect={(e) => - setDocValue((prev) => ({ - ...prev, - file: e.files[0] - })) - } - /> -
    */} -
    +
    { setDocValue((prev) => ({ ...prev, title: e.target.value })); diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index b7c9f954..b6f3d25f 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -16,6 +16,7 @@ import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; +import GroupSkeleton from '../skeleton/GroupSkeleton'; export default function LessonLink({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface linkValueType { @@ -39,9 +40,6 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr url: string; } - const { course_id } = useParams(); - - const media = useMediaQuery('(max-width: 640px)'); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); @@ -60,6 +58,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const [progressSpinner, setProgressSpinner] = useState(false); const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); const [selectId, setSelectId] = useState(null); + const [skeleton, setSkeleton] = useState(false); const clearFile = () => { setAdditional((prev) => ({ ...prev, link: false })); @@ -153,8 +152,10 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr // update document const handleUpdateLink = async () => { + setSkeleton(true); const data = await updateLink(editingLesson, link?.lesson_id ? Number(link?.lesson_id) : null, Number(selectId), element.type.id, element.id); if (data?.success) { + setSkeleton(false); fetchPropElement(element.id); clearValues(); setMessage({ @@ -162,6 +163,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { + setSkeleton(false); setLinkValue({ title: '', description: '', url: '' }); setEditingLesson({ title: '', description: '', url: '' }); setMessage({ @@ -181,7 +183,11 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr
    {docShow ? ( - + + ) : skeleton ? ( +
    + +
    ) : ( link && ( { setLinkValue((prev) => ({ ...prev, title: e.target.value })); diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index b47f2cc2..5ab71152 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -19,6 +19,7 @@ import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import { InputTextarea } from 'primereact/inputtextarea'; import dynamic from 'next/dynamic'; +import GroupSkeleton from '../skeleton/GroupSkeleton'; const PDFViewer = dynamic(() => import('../PDFBook'), { ssr: false @@ -70,6 +71,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); + const [skeleton, setSkeleton] = useState(false); const clearFile = () => { fileUploadRef.current?.clear(); @@ -201,8 +203,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle // update document const handleUpdateDoc = async () => { + setSkeleton(true); const data = await updatePractica(editingLesson, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.id); if (data?.success) { + setSkeleton(false); fetchPropElement(element.id); clearValues(); setMessage({ @@ -210,6 +214,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { + setSkeleton(false); setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); setEditingLesson({ title: '', description: '', document: null, url: '', score: 0 }); setMessage({ @@ -233,20 +238,26 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {docShow ? ( ) : ( - document && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document, score: element?.score || 0 }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'practica', icon: 'pi pi-list' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} - urlForPDF={() => sentToPDF('')} - urlForDownload={document.document ? document.document_path : ''} - /> - ) + <> + {skeleton ? ( +
    + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document, score: element?.score || 0 }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'practica', icon: 'pi pi-list' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} + urlForPDF={() => sentToPDF('')} + urlForDownload={document.document ? document.document_path : ''} + /> + ) + )} + )}
    @@ -273,8 +284,8 @@ export default function LessonPractica({ element, content, fetchPropElement, cle { setDocValue((prev) => prev && { ...prev, score: Number(e.target.value) }); @@ -366,7 +377,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle useEffect(() => { console.log(element); - + setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); }, [element]); @@ -456,7 +467,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle />
    )} - +
    setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 08d317c7..8323a374 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -21,6 +21,7 @@ import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import { InputTextarea } from 'primereact/inputtextarea'; import { testType } from '@/types/testType'; +import GroupSkeleton from '../skeleton/GroupSkeleton'; export default function LessonTest({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { const showError = useErrorMessage(); @@ -39,7 +40,10 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const [testShow, setTestShow] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); + const [testChecked, setTestChecked] = useState<{ idx: null | number; check: boolean }>({ idx: null, check: false }); + const [answerOpt, setAnswerOpt] = useState(true); const [selectId, setSelectId] = useState(null); + const [skeleton, setSkeleton] = useState(false); const clearValues = () => { setTestValue({ title: '', score: 0 }); @@ -119,14 +123,18 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const deleteOption = (index: number) => { setAnswer((prev) => prev.filter((_, i) => i !== index)); + if (index === testChecked.idx) { + setTestChecked({ idx: null, check: false }); + } }; // update test const handleUpdateTest = async () => { + setSkeleton(true) const data = await updateTest(answer, editingLesson?.title || '', element.lesson_id, Number(selectId), element.type.id, element.id, editingLesson?.score || 0); - console.log(data); if (data?.success) { + setSkeleton(false); fetchPropElement(element.id); clearValues(); setMessage({ @@ -134,6 +142,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr value: { severity: 'success', summary: 'Успешно изменено!', detail: '' } }); } else { + setSkeleton(false); // setDocValue({ title: '', description: '', file: null }); setEditingLesson(null); setMessage({ @@ -181,21 +190,29 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr {testShow ? ( ) : ( - test && ( - selectedForEditing(id)} - onDelete={(id: number) => handleDeleteTest(id)} - cardValue={{ title: test?.content || '', id: Number(test!.id), desctiption: '', type: 'test', score: test.score }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'test', icon: 'pi pi-doc' }} - typeColor={'var(--mainColor)'} - lessonDate={test.created_at && new Date(test.created_at).toISOString().slice(0, 10)} - urlForPDF={() => {}} - urlForDownload={''} - answers={test.answers} - /> - ) + <> + {skeleton ? ( +
    + +
    + ) : ( + test && ( + selectedForEditing(id)} + onDelete={(id: number) => handleDeleteTest(id)} + cardValue={{ title: test?.content || '', id: Number(test!.id), desctiption: '', type: 'test', score: test.score }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'test', icon: 'pi pi-doc' }} + typeColor={'var(--mainColor)'} + lessonDate={test.created_at && new Date(test.created_at).toISOString().slice(0, 10)} + urlForPDF={() => {}} + urlForDownload={''} + answers={test.answers} + /> + ) + )} + )}
    @@ -236,8 +253,10 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr { setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, is_correct: true } : { ...ans, is_correct: false }))); + setTestChecked({ idx: index, check: true }); }} /> {/* */} @@ -264,7 +283,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr
    diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index aa9cf10b..57194da6 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -86,7 +86,7 @@ export default function Course() { course_id: id, status: status ? 1 : 0 }; - console.log(forSentStreams); + const data = await veryfyCourse(forSentStreams); if (data.success) { contextFetchCourse(1); @@ -96,7 +96,7 @@ export default function Course() { value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { - console.log(data); + setSkeleton(false); if (data.response.data.cause) { setMessage({ @@ -318,7 +318,7 @@ export default function Course() { }, [courseValue.title, editingLesson.title]); useEffect(() => { - console.log('Курсы ', coursesValue); + if (coursesValue?.length < 1) { setHasCourses(true); @@ -441,10 +441,6 @@ export default function Course() { ); }; - useEffect(() => { - console.log(forStreamCount); - }, [forStreamCount]); - const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index bb89b461..b226409a 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -26,7 +26,7 @@ const SessionManager = () => { setTimeout(() => { setGlobalLoading(false); }, 1000); - console.log('Данные пользователя успешно пришли ', res); + // console.log('Данные пользователя успешно пришли ', res); if (res.roles && res.roles.length > 0) { const roleCheck = res.roles.find((i: { id_role: number }) => i.id_role); if (roleCheck) { diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 3ad86a2d..71a96fd7 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -48,8 +48,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle document_path: string; } - const { course_id } = useParams(); - const router = useRouter(); const media = useMediaQuery('(max-width: 640px)'); const fileUploadRef = useRef(null); @@ -141,11 +139,11 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const sentToPDF = (url: string) => { setUrlPDF(url); - if (media) { + // if (media) { router.push(`/pdf/${url}`); - } else { - setPDFVisible(true); - } + // } else { + // setPDFVisible(true); + // } }; const editing = async () => { @@ -166,8 +164,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const handleAddDoc = async () => { toggleSpinner(); const data = await addDocument(docValue, element.lesson_id, element.type_id, element.id); - console.log(data); - if (data.success) { fetchPropElement(element.id); setMessage({ @@ -274,9 +270,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle type="file" accept="application/pdf" className="border rounded p-1" - onChange={(e) => { - console.log(e.target.files); - const file = e.target.files?.[0]; + onChange={(e) => { const file = e.target.files?.[0]; if (file) { setDocValue((prev) => ({ ...prev, @@ -357,9 +351,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle type="file" accept="application/pdf" className="border rounded p-1 w-full" - onChange={(e) => { - console.log(e.target.files); - const file = e.target.files?.[0]; + onChange={(e) => { const file = e.target.files?.[0]; if (file) { setEditingLesson( (prev) => diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 8323a374..fe5dbaaa 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -1,19 +1,14 @@ 'use client'; import { lessonSchema } from '@/schemas/lessonSchema'; -import { EditableLesson } from '@/types/editableLesson'; -import { lessonStateType } from '@/types/lessonStateType'; import { yupResolver } from '@hookform/resolvers/yup'; -import { useParams, useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; -import { FileUpload } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; -import { useMediaQuery } from '@/hooks/useMediaQuery'; import { addDocument, addTest, deleteDocument, deleteTest, fetchElement, updateDocument, updateTest } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; @@ -41,7 +36,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const [progressSpinner, setProgressSpinner] = useState(false); const [testChecked, setTestChecked] = useState<{ idx: null | number; check: boolean }>({ idx: null, check: false }); - const [answerOpt, setAnswerOpt] = useState(true); const [selectId, setSelectId] = useState(null); const [skeleton, setSkeleton] = useState(false); @@ -55,13 +49,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr setSelectId(null); }; - const toggleSpinner = () => { - setProgressSpinner(true); - setInterval(() => { - setProgressSpinner(false); - }, 1000); - }; - // validate const { setValue, @@ -160,8 +147,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr console.log(element.lesson_id, id, element.type.id, element.id); const data = await deleteTest(element.lesson_id, id, element.type.id, element.id); - console.log(data); - if (data.success) { clearValues(); fetchPropElement(element.id); @@ -310,21 +295,6 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr setTestValue({ title: '', score: 0 }); }, [element]); - useEffect(() => { - console.log(answer); - - const answerCheck = answer.some((item) => item.is_correct); - console.log(answerCheck); - - // if(answerCheck){ - // setAnswerOpt(false); - // } else { - // setAnswerOpt(true); - // } - }, [answer]); - - useEffect(() => {}, [answerOpt]); - return (
    { }; const sentDelete = (item: any) => { - console.log('Delete theme ID:', item.id); const options = getConfirmOptions(Number(), () => handleDeleteTheme(item.id)); confirmDialog(options); }; @@ -252,9 +251,7 @@ const AppMenu = () => { if (user?.is_student) { const isTopicsChildPage = pathname.startsWith('/teaching/'); if (isTopicsChildPage) { - console.log('Вызов функции тем студента'); if (studentThemeCourse) { - console.log(studentThemeCourse); contextFetchStudentThemes(1); } } @@ -324,7 +321,6 @@ const AppMenu = () => { className="w-[90%]" value={editingLesson?.title && editingLesson?.title} onChange={(e) => { - console.log(editingLesson); setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); setValue('title', e.target.value, { shouldValidate: true }); }} @@ -363,7 +359,6 @@ const AppMenu = () => { className="w-[90%]" value={themeValue?.title && themeValue?.title} onChange={(e) => { - console.log(e.target.value, themeValue); setThemeValue((prev) => prev && { ...prev, title: e.target.value }); setValue('title', e.target.value, { shouldValidate: true }); }} diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 4d8da1a9..4c8b6a23 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -109,7 +109,6 @@ const AppTopbar = forwardRef((props, ref) => { logo

    Цифровой кампус ОшГУ

    - (в разработке) {pathName !== '/' ? ( departament.name.length > 0 ? ( @@ -137,7 +136,7 @@ const AppTopbar = forwardRef((props, ref) => {
    )} - {/* {user && user ? ( + {user && user ? (
    @@ -147,7 +146,7 @@ const AppTopbar = forwardRef((props, ref) => {
    - )} */} + )}
    From 831f54306533bb78fe6e8ab4061bd20e6f3acf82 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:12:15 +0600 Subject: [PATCH 192/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=BE=D0=B1=D0=B8=D0=BB=D1=8C=D0=BD=D1=83=D1=8E?= =?UTF-8?q?=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/AppTopbar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 4c8b6a23..f7d49a74 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -129,7 +129,7 @@ const AppTopbar = forwardRef((props, ref) => {
    {media ? ( - <> + ) : (
    Сайт ОшГУ @@ -150,7 +150,7 @@ const AppTopbar = forwardRef((props, ref) => {
    - (в разработке) + {/* {media && mobileMenu} */}
    ); }); From ac6b7848202b15a6cb2d11b942edb2da7372bad2 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:23:01 +0600 Subject: [PATCH 193/286] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 31461ea6..f37b5bdd 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -376,8 +376,8 @@ export default function LessonStep() { }} > {idx + 1} -
    - +
    +
    ); @@ -469,9 +469,11 @@ export default function LessonStep() { ) : ( )}
    From 544ea5559fcc4dc75928144bc397c5343d26b397 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:25:36 +0600 Subject: [PATCH 194/286] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index f37b5bdd..7ea0e130 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -452,6 +452,7 @@ export default function LessonStep() {
    ) : ( */} + {steps.map((item, idx) => { return (
    From 0b75bcf480835d9abbffdf177687a0ff555f75e7 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:43:35 +0600 Subject: [PATCH 195/286] fix danger button --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 5 +++-- app/globals.css | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 7ea0e130..95094d3b 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -452,7 +452,7 @@ export default function LessonStep() {
    ) : ( */} - + {steps.map((item, idx) => { return (
    @@ -499,7 +499,8 @@ export default function LessonStep() { icon={'pi pi-trash'} label="Удалить шаг" disabled={hasSteps} - className="hover:bg-[var(--mainBorder)] transition trash-button" + className="hover:bg-[var(--mainBorder)] transition" + security="danger" onClick={() => { const options = getConfirmOptions(Number(), () => handleDeleteStep()); confirmDialog(options); diff --git a/app/globals.css b/app/globals.css index d4a0abd9..a89a4976 100644 --- a/app/globals.css +++ b/app/globals.css @@ -678,12 +678,12 @@ h1, h2, h3, h4, h5, h6 { padding: 3px 2px; } -.trash-button { + .p-button-danger{ background-color: red; } -.p-button .p-button-danger{ - background-color: red !important; +.trash-button { + background-color: red; } .p-column-header-content{ From c8a7ee54f9868a9f54884c7d7efa8f66d2ecb92c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:48:56 +0600 Subject: [PATCH 196/286] trash --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 95094d3b..ddf6faa9 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -499,8 +499,7 @@ export default function LessonStep() { icon={'pi pi-trash'} label="Удалить шаг" disabled={hasSteps} - className="hover:bg-[var(--mainBorder)] transition" - security="danger" + className="hover:bg-[var(--mainBorder)] transition trash-button" onClick={() => { const options = getConfirmOptions(Number(), () => handleDeleteStep()); confirmDialog(options); From 9ad27f857ef8fbc57cb4dbf324954fbc7d45072c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 10:59:31 +0600 Subject: [PATCH 197/286] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=BA=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/layout.tsx | 2 +- app/components/lessons/LessonTest.tsx | 4 ++-- app/globals.css | 4 ++-- layout/layout.tsx | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/(main)/layout.tsx b/app/(main)/layout.tsx index 122640dd..70246c45 100644 --- a/app/(main)/layout.tsx +++ b/app/(main)/layout.tsx @@ -6,7 +6,7 @@ interface AppLayoutProps { } export const metadata: Metadata = { - title: 'PrimeReact Sakai', + title: 'Mooc ОшГУ', description: 'The ultimate collection of design-agnostic, flexible and accessible React UI Components.', robots: { index: false, follow: false }, viewport: { initialScale: 1, width: 'device-width' }, diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index fe5dbaaa..0e9557b0 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -233,7 +233,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr
    {answer.map((item, index) => { return ( -
    +
    ); })} diff --git a/app/globals.css b/app/globals.css index a89a4976..f2c79eec 100644 --- a/app/globals.css +++ b/app/globals.css @@ -679,11 +679,11 @@ h1, h2, h3, h4, h5, h6 { } .p-button-danger{ - background-color: red; + background-color: #ef4444; } .trash-button { - background-color: red; + background-color: #ef4444; } .p-column-header-content{ diff --git a/layout/layout.tsx b/layout/layout.tsx index b6fc8faa..7ccea33b 100644 --- a/layout/layout.tsx +++ b/layout/layout.tsx @@ -129,7 +129,7 @@ const Layout = ({ children }: ChildContainerProps) => { if (!user?.is_working) { // window.location.href = '/auth/login'; // setPermission(true); - console.log('Не имеете доступ! working'); + // console.log('Не имеете доступ! working'); } setPermission(false); } From 45fa476736693cce0df33777ea34cbe289a46519 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 11:10:09 +0600 Subject: [PATCH 198/286] =?UTF-8?q?=D0=A3=D0=BC=D0=B5=D0=BD=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=20?= =?UTF-8?q?=D0=B8=D0=BD=D0=BF=D1=83=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonTest.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 0e9557b0..3c3570cb 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -250,7 +250,8 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr { setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); }} From 1aedc983964398250d69dd41f48e2efbc7393a80 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 13:44:11 +0600 Subject: [PATCH 199/286] =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 40 +++++++++++-------- app/(full-page)/layout.tsx | 2 +- .../course/[course_Id]/[lesson_id]/page.tsx | 9 +---- app/(main)/pdf/[pdfUrl]/page.tsx | 10 ++--- app/components/lessons/LessonPractica.tsx | 4 +- app/components/lessons/LessonTest.tsx | 2 +- app/components/popUp/Tiered.tsx | 2 - layout/AppMenu.tsx | 2 +- layout/context/layoutcontext.tsx | 1 - 9 files changed, 33 insertions(+), 39 deletions(-) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 468a07f6..dcb32176 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -15,6 +15,7 @@ import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; import { logout } from '@/utils/logout'; import { LoginType } from '@/types/login'; import { useMediaQuery } from '@/hooks/useMediaQuery'; +import Link from 'next/link'; const LoginPage = () => { const { layoutConfig, setUser, setMessage, setGlobalLoading, setDepartament, departament } = useContext(LayoutContext); @@ -36,26 +37,26 @@ const LoginPage = () => { const onSubmit = async (value: LoginType) => { const user = await login(value); if (user && user.success) { - document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; + document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; const token = user.token.access_token; if (token) { const res = await getUser(); try { if (res?.success) { if (res?.user.is_working) { - if(res.roles && res.roles.length > 0){ - const roleCheck = res.roles.find((i:{id_role: number})=> i.id_role) - if(roleCheck){ - setDepartament({info: roleCheck.roles_name.info_ru, last_name:res.user?.last_name, name:res?.user.name, father_name:res.user?.father_name}); + if (res.roles && res.roles.length > 0) { + const roleCheck = res.roles.find((i: { id_role: number }) => i.id_role); + if (roleCheck) { + setDepartament({ info: roleCheck.roles_name.info_ru, last_name: res.user?.last_name, name: res?.user.name, father_name: res.user?.father_name }); window.location.href = '/faculty'; } else { window.location.href = '/course'; - } + } } else { window.location.href = '/course'; } - } - if(res?.user.is_student){ + } + if (res?.user.is_student) { window.location.href = '/teaching'; } } else { @@ -93,17 +94,19 @@ const LoginPage = () => { return (
    - {/*
    */} + {/*
    */} {/* */}
    -
    - {/* */} - -
    + {!media && ( +
    + {/* */} + +
    + )}
    -

    Вход

    -
    +

    Вход в mooc

    +
    {/*
    + + +
    diff --git a/app/(full-page)/layout.tsx b/app/(full-page)/layout.tsx index d92cd44c..4f4a0497 100644 --- a/app/(full-page)/layout.tsx +++ b/app/(full-page)/layout.tsx @@ -7,7 +7,7 @@ interface SimpleLayoutProps { } export const metadata: Metadata = { - title: 'PrimeReact Sakai', + title: 'Mooc ОшГУ', description: 'The ultimate collection of design-agnostic, flexible and accessible React UI Components.' }; diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index ddf6faa9..813aa594 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -443,16 +443,10 @@ export default function LessonStep() {
    {hasSteps ? (
    -
    +
    ) : (
    = 6 ? 'right-shadow' : '') : steps.length >= 12 ? 'right-shadow' : ''}`}> - {/* {skeleton ? ( -
    - -
    - ) : ( */} - {steps.map((item, idx) => { return (
    @@ -460,7 +454,6 @@ export default function LessonStep() {
    ); })} - {/* )} */}
    )} diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index e934dd1e..014d68a7 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -3,14 +3,12 @@ // import PDFViewer from '@/app/components/PDFBook'; // import PDFViewer from '../PDFBook'; import dynamic from 'next/dynamic'; -import Link from 'next/link'; const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { ssr: false }); import { useParams, useRouter } from 'next/navigation'; -import { Button } from 'primereact/button'; export default function PdfUrlViewer() { const { pdfUrl } = useParams(); @@ -18,10 +16,10 @@ export default function PdfUrlViewer() { return (
    - - +
    diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 5ab71152..afe61de1 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -286,7 +286,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle id="title" placeholder="Балл" // value={String(docValue?.score)} - className="w-[50px] sm:w-[70px]" + className="w-[50px] sm:w-[70px] h-auto" onChange={(e) => { setDocValue((prev) => prev && { ...prev, score: Number(e.target.value) }); setValue('title', e.target.value, { shouldValidate: true }); @@ -411,10 +411,10 @@ export default function LessonPractica({ element, content, fetchPropElement, cle {errors.title?.message}
    - Балл { setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 3c3570cb..81a2cfb3 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -325,10 +325,10 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr {errors.title?.message}
    - Балл { setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); diff --git a/app/components/popUp/Tiered.tsx b/app/components/popUp/Tiered.tsx index b7dc58a8..66683af0 100644 --- a/app/components/popUp/Tiered.tsx +++ b/app/components/popUp/Tiered.tsx @@ -35,8 +35,6 @@ export default function Tiered({ title, items, insideColor }: TieredProps) { })); const toggleMenu = (e: React.MouseEvent) => { - console.log(e); - menu.current?.toggle(e); // setMobile(prev => !prev); }; diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 39190c86..ddc3e615 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -72,7 +72,7 @@ const AppMenu = () => { items: courseList?.length > 0 ? courseList : [] } ] - : user?.is_working && departament.info.length < 1 && pathname.startsWith('/students/') + : user?.is_working && departament.info.length < 1 && (pathname.startsWith('/students/') || pathname.startsWith('/pdf/')) ? [ { // key: 'prev', diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 3ae09b90..5a149738 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -113,7 +113,6 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [departament, setDepartament] = useState<{ last_name: string; name: string; father_name: string; info: string }>({ last_name: '', name: '', father_name: '', info: '' }); useEffect(() => { - // setContextThemes([]); if (pathname === '/course' && !departament.name) { setLayoutState((prev) => ({ ...prev, From e3521bcbd5e7b874ed324e027418b7ff7a23c4e6 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 25 Sep 2025 19:16:07 +0600 Subject: [PATCH 200/286] =?UTF-8?q?=D0=A4=D0=B0=D0=BA=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 10 +- app/(main)/course/page.tsx | 11 ++ .../faculty/[id_kafedra]/[myedu_id]/page.tsx | 11 ++ app/(main)/faculty/[id_kafedra]/page.tsx | 97 +++++++++++++----- .../{ => testovy}/[course_id]/page.tsx | 1 - app/(main)/faculty/page.tsx | 83 +++++++-------- app/components/HomeClient.tsx | 2 +- app/components/lessons/LessonPractica.tsx | 5 +- app/components/lessons/LessonTest.tsx | 5 +- layout/AppMenu.tsx | 15 ++- layout/AppMenuitem.tsx | 13 ++- layout/AppTopbar.tsx | 14 ++- ...\260\320\262\320\275\321\213\320\271.jpeg" | Bin 0 -> 297963 bytes ...0\260\320\262\320\275\321\213\320\271.jpg" | Bin 0 -> 139934 bytes services/faculty.tsx | 9 +- services/query-tests.http | 4 +- services/steps.tsx | 12 +++ styles/layout/_menu.scss | 12 ++- styles/layout/_responsive.scss | 3 +- types/layout.d.ts | 1 + utils/axiosInstance.tsx | 16 +-- 21 files changed, 216 insertions(+), 108 deletions(-) create mode 100644 app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx rename app/(main)/faculty/[id_kafedra]/{ => testovy}/[course_id]/page.tsx (99%) create mode 100644 "public/layout/images/\320\223\320\273\320\260\320\262\320\275\321\213\320\271.jpeg" create mode 100644 "public/layout/images/\320\263\320\273\320\260\320\262\320\275\321\213\320\271.jpg" diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 813aa594..72963f82 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -26,7 +26,6 @@ export default function LessonStep() { const course_id = param.course_Id; const scrollRef = useRef(null); const router = useRouter(); - const pathname = usePathname(); const prevLessonsRef = useRef | null>(null); const [lessonInfoState, setLessonInfoState] = useState<{ title: string; documents_count: string; usefullinks_count: string; videos_count: string } | null>(null); @@ -160,6 +159,7 @@ export default function LessonStep() { const handleDeleteStep = async () => { const data = await deleteStep(Number(lesson_id), Number(selectedId)); if (data.success) { + contextFetchThemes(Number(course_id), null); handleFetchSteps(Number(lesson_id)); setMessage({ state: true, @@ -281,6 +281,8 @@ export default function LessonStep() { // заменяем первый useEffect useEffect(() => { + console.log('Обновился ', contextThemes); + const lessons = contextThemes?.lessons?.data ?? []; // делаем "снимок" важных полей (id + title) @@ -361,7 +363,7 @@ export default function LessonStep() { const lessonInfo = (
    -

    {lessonInfoState?.title}

    +

    {lessonInfoState?.title}

    ); @@ -483,8 +485,8 @@ export default function LessonStep() {
    {element?.step.type.name === 'document' && } {element?.step.type.name === 'video' && } - {element?.step.type.name === 'test' && } - {element?.step.type.name === 'practical' && } + {element?.step.type.name === 'test' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} + {element?.step.type.name === 'practical' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} {element?.step.type.name === 'link' && }
    diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 57194da6..6d56c467 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -720,6 +720,17 @@ export default function Course() { )} > +
    Балл
    } + body={(rowData) => ( + + {rowData.max_score} + + )} + >
    На рассмотр.
    } style={{ margin: '0 3px', textAlign: 'center' }} diff --git a/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx new file mode 100644 index 00000000..acd39ca6 --- /dev/null +++ b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx @@ -0,0 +1,11 @@ +'use client'; + +import { NotFound } from "@/app/components/NotFound"; + +export default function CoursesDep() { + return ( +
    + +
    + ) +} diff --git a/app/(main)/faculty/[id_kafedra]/page.tsx b/app/(main)/faculty/[id_kafedra]/page.tsx index dc688b7c..ed116215 100644 --- a/app/(main)/faculty/[id_kafedra]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/page.tsx @@ -33,6 +33,8 @@ export default function Kafedra() { } const { id_kafedra } = useParams(); + console.log(id_kafedra); + const [courses, setCourses] = useState([]); const [notCourse, setNoteCourse] = useState([]); const [contentShow, setContentShow] = useState(false); @@ -114,8 +116,8 @@ export default function Kafedra() { }, []); useEffect(() => { - const forNotCourse = courses.filter((item) => item.courses.length < 1); - setNoteCourse(forNotCourse); + // const forNotCourse = courses.filter((item) => item.courses.length < 1); + // setNoteCourse(forNotCourse); }, [courses]); return ( @@ -124,25 +126,57 @@ export default function Kafedra() { ) : ( <> -
    - {courses.map((item) => { - return ( -
    - {item.courses.length > 0 && ( +
    + + rowIndex + 1} header="#"> + ( + + {rowData.last_name} {rowData.name} {rowData.father_name} + + )} + > + {/* ( +
    +
    + 4 всего + (2 утверждённых) +
    +
    + )} + >
    */} +
    + {/* {courses.map((item) => { */} + {/* // return ( */} + {/* //
    */} + {/* {courses.length > 0 && (
    -

    - {item.last_name} {item.name} {item.father_name} -

    - + */} + {/* rowIndex + 1} header="#" style={{ width: '20px' }}> - {rowData.title}}> + ( + + {rowData.last_name} {rowData.name} {rowData.father_name} + + )} + > (
    {!rowData.is_published ? ( - ) : ( -
    )} >
    -
    -
    - )} -
    - ); - })} + */} + {/*
    + )} */} + {/*
    + ); */} + {/* })} */}
    {notCourse.length > 0 && (
    -

    Курсы отсутствуют:

    - +

    Преподаватели

    + {/* rowIndex + 1} header="#"> ( -

    + {rowData.last_name} {rowData.name} {rowData.father_name} -

    + )} >
    -
    + ( +
    +
    + 4 всего + (2 утверждённых) +
    +
    + )} + >
    +
    */}
    )} diff --git a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx similarity index 99% rename from app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx rename to app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx index f397394d..2abb4660 100644 --- a/app/(main)/faculty/[id_kafedra]/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx @@ -4,7 +4,6 @@ import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { fetchCourseInfo } from '@/services/courses'; import { depCourseInfo } from '@/services/faculty'; import { fetchDepartamentSteps, fetchSteps } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index 26b56451..e0291d87 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -28,68 +28,63 @@ export default function Faculty() { const [facultyShow, setFacultyShow] = useState(false); const [skeleton, setSkeleton] = useState(false); - const handleFetchFaculty = async () => { - setSkeleton(true); - const data = await fetchFaculty(); - if (data && Array.isArray(data)) { - const newFaculty = data.map((item) => { - return { name_ru: item.name_ru, id: item.id }; - }); - setFaculty(newFaculty); - setSkeleton(false); + // const handleFetchFaculty = async () => { + // setSkeleton(true); + // const data = await fetchFaculty(); + // if (data && Array.isArray(data)) { + // const newFaculty = data.map((item) => { + // return { name_ru: item.name_ru, id: item.id }; + // }); + // setFaculty(newFaculty); + // setSkeleton(false); - if (newFaculty.length > 0) { - setSelected(newFaculty[0]); - setSelectShow(false); - } else { - setSelectShow(true); - } - } else { - setSkeleton(false); - setSelectShow(true); - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } - }); - if (data?.response?.status) { - showError(data.response.status); - } - } - }; + // if (newFaculty.length > 0) { + // setSelected(newFaculty[0]); + // setSelectShow(false); + // } else { + // setSelectShow(true); + // } + // } else { + // setSkeleton(false); + // setSelectShow(true); + // setMessage({ + // state: true, + // value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + // }); + // if (data?.response?.status) { + // showError(data.response.status); + // } + // } + // }; const handleFetchKafedra = async () => { - if (selected) { - const data = await fetchKafedra(selected && selected.id); - console.log(data); + const data = await fetchKafedra(); + console.log(data); - if (data && Array.isArray(data)) { - if(data.length > 0){ - setKafedra(data); - setFacultyShow(false); - } else { - setFacultyShow(true); - } + if (data && Array.isArray(data)) { + if (data.length > 0) { + setKafedra(data); + setFacultyShow(false); } else { setFacultyShow(true); } + } else { + setFacultyShow(true); } }; useEffect(() => { - handleFetchFaculty(); + handleFetchKafedra(); + setGlobalLoading(true); setTimeout(() => { setGlobalLoading(false); }, 900); }, []); - useEffect(() => { - handleFetchKafedra(); - }, [selected]); - return (
    -
    + {/*
    {skeleton ? ( ) : selectShow ? ( @@ -100,7 +95,7 @@ export default function Faculty() { setSelected(e.value)} options={faculty} optionLabel="name_ru" className="w-[90%] overflow-x-auto" panelClassName="w-[50%] overflow-x-scroll" />
    )} -
    +
    */} {/* data table */} {skeleton ? ( diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 56185f2d..e040de0e 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -55,7 +55,7 @@ export default function HomeClient() {
    - Пользователь + Пользователь
    Shape diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index afe61de1..bce70f7b 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -25,7 +25,7 @@ const PDFViewer = dynamic(() => import('../PDFBook'), { ssr: false }); -export default function LessonPractica({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { +export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: ()=> void; clearProp: boolean }) { interface docValueType { title: string; description: string; @@ -166,6 +166,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const data = await addPractica(docValue, element.lesson_id, element.type_id, element.id); if (data.success) { fetchPropElement(element.id); + fetchPropThemes(); setMessage({ state: true, value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } @@ -186,6 +187,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle const data = await deletePractica(Number(document?.lesson_id), id, element.type.id, element.id); if (data.success) { fetchPropElement(element.id); + fetchPropThemes(); setMessage({ state: true, value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } @@ -208,6 +210,7 @@ export default function LessonPractica({ element, content, fetchPropElement, cle if (data?.success) { setSkeleton(false); fetchPropElement(element.id); + fetchPropThemes(); clearValues(); setMessage({ state: true, diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 81a2cfb3..07e9d140 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -18,7 +18,7 @@ import { InputTextarea } from 'primereact/inputtextarea'; import { testType } from '@/types/testType'; import GroupSkeleton from '../skeleton/GroupSkeleton'; -export default function LessonTest({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { +export default function LessonTest({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: ()=> void; clearProp: boolean }) { const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); @@ -86,6 +86,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score); if (data?.success) { fetchPropElement(element.id); + fetchPropThemes() clearValues(); setMessage({ state: true, @@ -123,6 +124,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr if (data?.success) { setSkeleton(false); fetchPropElement(element.id); + fetchPropThemes(); clearValues(); setMessage({ state: true, @@ -150,6 +152,7 @@ export default function LessonTest({ element, content, fetchPropElement, clearPr if (data.success) { clearValues(); fetchPropElement(element.id); + fetchPropThemes(); setMessage({ state: true, value: { severity: 'success', summary: 'Успешно удалено!', detail: '' } diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index ddc3e615..bcca6145 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -259,11 +259,14 @@ const AppMenu = () => { }, [user, studentThemeCourse]); useEffect(() => { + console.log(contextThemes); + if (contextThemes && contextThemes.lessons) { const newThemes = contextThemes.lessons.data.map((item: any, idx: number) => ({ label: `${idx + 1}. ${item.title}`, id: item.id, to: `/course/${course_Id}/${item.id}`, + score: `Балл: ${item.steps_sum_score == null ? 0 : item.steps_sum_score}`, onEdit: () => { selectedForEditing(item.id); }, @@ -374,9 +377,15 @@ const AppMenu = () => { })} {pathname.startsWith('/course/') && ( -
    - -
    + <> +
    + +
    +
    + Всего баллов за курс + {contextThemes?.max_sum_score} +
    + )} ); diff --git a/layout/AppMenuitem.tsx b/layout/AppMenuitem.tsx index 2e3bc7ca..20dc89f7 100644 --- a/layout/AppMenuitem.tsx +++ b/layout/AppMenuitem.tsx @@ -66,7 +66,6 @@ const AppMenuitem = (props: AppMenuItemProps) => { ) : null} - {/* {item!.to && !item!.items && item!.visible !== false ? ( itemClick(e)} className={classNames(item!.class, 'p-ripple', { 'active-route': isActiveRoute })} tabIndex={0}> @@ -76,14 +75,14 @@ const AppMenuitem = (props: AppMenuItemProps) => { ) : null} */} {item!.to && !item!.items && item!.visible !== false ? ( -
    +
    itemClick(e)} className={classNames(item!.class, 'p-ripple', { 'active-route': isActiveRoute })} tabIndex={0} style={{ flexGrow: 1 }}> - {item!.label} + {item!.label} - -
    +
    {item?.score}
    +
    {/* Кнопки редактирования и удаления */} {item!.onEdit && ( @@ -104,7 +103,7 @@ const AppMenuitem = (props: AppMenuItemProps) => { e.stopPropagation(); item?.onDelete?.(); }} - style={{ marginLeft: '0.3rem' }} + style={{ marginLeft: '0.3rem', fontSize: '13px' }} title="Удалить" className="pi pi-trash cursor-pointer" > diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index f7d49a74..2fc415b0 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -1,7 +1,7 @@ /* eslint-disable @next/next/no-img-element */ import Link from 'next/link'; -import React, { forwardRef, useContext, useEffect, useImperativeHandle, useRef } from 'react'; +import React, { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react'; import Tiered from '@/app/components/popUp/Tiered'; import FancyLinkBtn from '@/app/components/buttons/FancyLinkBtn'; import { classNames } from 'primereact/utils'; @@ -10,6 +10,7 @@ import { LayoutContext } from './context/layoutcontext'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { usePathname, useRouter } from 'next/navigation'; import { logout } from '@/utils/logout'; +import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; const AppTopbar = forwardRef((props, ref) => { const { layoutConfig, layoutState, onMenuToggle, showProfileSidebar, user, setUser, setGlobalLoading, departament } = useContext(LayoutContext); @@ -27,6 +28,8 @@ const AppTopbar = forwardRef((props, ref) => { const pathName = usePathname(); const media = useMediaQuery('(max-width: 1000px)'); + const [skeleton, setSkeleton] = useState(true); + const router = useRouter(); const mobileMenu = [ @@ -102,6 +105,12 @@ const AppTopbar = forwardRef((props, ref) => { } ]; + useEffect(()=> { + setTimeout(() => { + setSkeleton(false); + }, 1000); + },[]); + return (
    @@ -136,7 +145,8 @@ const AppTopbar = forwardRef((props, ref) => {
    )} - {user && user ? ( + {skeleton ?
    + : user ? (
    diff --git "a/public/layout/images/\320\223\320\273\320\260\320\262\320\275\321\213\320\271.jpeg" "b/public/layout/images/\320\223\320\273\320\260\320\262\320\275\321\213\320\271.jpeg" new file mode 100644 index 0000000000000000000000000000000000000000..24b7b514f63bac4c248b275cda891f860de21034 GIT binary patch literal 297963 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

    %~Nw@}c~Ncm;kQh8`o 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ν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

    +
    {/*
    */} {/* */}
    - {!media && ( + {/* {!media && (
    - {/* */} +
    - )} + )} */}

    Вход в mooc

    diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 6d56c467..9f67ca11 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -235,7 +235,7 @@ export default function Course() { }; const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { - if (e.files.length > 0) { + if (e.files?.length > 0) { editMode ? setEditingLesson((prev) => ({ ...prev, @@ -301,7 +301,7 @@ export default function Course() { useEffect(() => { handleFetchCourse(); - if (course?.data.length > 5) { + if (course?.data?.length > 5) { setIsTall(true); } else { setIsTall(false); @@ -310,7 +310,7 @@ export default function Course() { useEffect(() => { const title = editMode ? editingLesson.title.trim() : courseValue.title.trim(); - if (title.length > 0) { + if (title?.length > 0) { setForStart(false); } else { setForStart(true); @@ -732,7 +732,7 @@ export default function Course() { )} >
    На рассмотр.
    } + header={() =>
    На рассмотрение
    } style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => ( <> diff --git a/app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[myedu_id]/[course_id]/page.tsx similarity index 96% rename from app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx rename to app/(main)/faculty/[id_kafedra]/[myedu_id]/[course_id]/page.tsx index 2abb4660..2a4cdd3a 100644 --- a/app/(main)/faculty/[id_kafedra]/testovy/[course_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[myedu_id]/[course_id]/page.tsx @@ -46,7 +46,7 @@ export default function LessonCheck() { const data = await fetchDepartamentSteps(Number(lesson_id), Number(id_kafedra)); if (data.success) { setSkeleton(false); - if (data.steps.length < 1) { + if (data.steps?.length < 1) { setHasSteps(true); } else { setHasSteps(false); @@ -112,7 +112,7 @@ export default function LessonCheck() { // САМИ ТЕМЫ, присваиваем в локальные темы useEffect(() => { console.log('Темы', contextThemes); - if (contextThemes.lessons?.data && contextThemes.lessons.data.length > 0) { + if (contextThemes.lessons?.data && contextThemes.lessons.data?.length > 0) { setThemes(contextThemes?.lessons.data || []); setThemeShow(false); } else { @@ -124,7 +124,7 @@ export default function LessonCheck() { useEffect(() => { console.log('Лоакльные темы ', themes); - if (themes.length > 0 && [activeIndex as number]) { + if (themes?.length > 0 && [activeIndex as number]) { console.log('active index ', activeIndex); const lessonId = themes[activeIndex as number]?.id; @@ -173,11 +173,11 @@ export default function LessonCheck() {
    {hasSteps ? (

    Данных нет

    - ) : content.length > 0 ? ( + ) : content?.length > 0 ? ( content.map((i, idx) => { if (i.content) { return ( -
    +
    { - -
    - ) + interface kafedraInfoType { + birth_date: string | null; + courses: []; + created_at: string; + email: string; + email_verified_at: string | null; + father_name: string; + id: number; + is_student: boolean; + is_working: boolean; + last_name: string; + myedu_id: number; + name: string; + phone: string; + pin: number; + updated_at: string; + } + + const { id_kafedra, myedu_id } = useParams(); + console.log(id_kafedra, myedu_id); + + const [courses, setCourses] = useState([]); + const [contentShow, setContentShow] = useState(false); + const [teacher, setTeacher] = useState<{id: number; myedu_id: number;} | null>(null); + + const [themes, setThemes] = useState([]); + const [steps, setSteps] = useState([]); + const [hasSteps, setHasSteps] = useState(false); + const [skeleton, setSkeleton] = useState(false); + const [activeIndex, setActiveIndex] = useState(0); + const [forDisabled, setForDisabled] = useState(false); + + const { setMessage, setGlobalLoading } = useContext(LayoutContext); + const showError = useErrorMessage(); + + const fetchDepartamentCourse = async () => { + const data = await depCourse(Number(myedu_id), Number(id_kafedra)); + console.log(data); + + if (data && data.courses) { + setTeacher(data); + setCourses(data.courses); + setContentShow(false); + } else { + setContentShow(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); // messege - Ошибка при добавлении + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const publish = async (id_kafedra: number, course_id: number, status: boolean) => { + setForDisabled(true); + const data = await publishCourse(id_kafedra, teacher ? teacher.id : null, course_id, status); + if (data) { + setForDisabled(false); + fetchDepartamentCourse(); + setMessage({ + state: true, + value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } + }); + } else { + setForDisabled(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); // messege - Ошибка при добавлении + if (data?.response?.status) { + showError(data.response.status); + } + } + }; + + const imageBodyTemplate = (product: CourseType) => { + const image = product.image; + + if (typeof image === 'string') { + return ( +
    + Course image +
    + ); + } + + return ( +
    + Course image +
    + ); + }; + + useEffect(() => { + fetchDepartamentCourse(); + }, []); + + useEffect(() => { + console.log(courses); + }, [courses]); + + return ( +
    + {contentShow ? ( + + ) : ( + // { + + // } + + rowIndex + 1} header="#" style={{ width: '20px' }}> + + ( + + {/* {rowData.last_name} {rowData.name} {rowData.father_name} */} + {rowData.title} + + )} + > + ( +
    + {!rowData.is_published ? ( + + ) : ( + + )} +
    + )} + >
    +
    + )} +
    + ); } diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index e040de0e..1784b8cd 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -48,6 +48,7 @@ export default function HomeClient() { )} +
    diff --git a/services/courses.tsx b/services/courses.tsx index b8332d4c..718d8e24 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -344,7 +344,7 @@ export const fetchVideoType = async () => { } }; -export const publishCourse = async (id_kafedra: number, id_teacher: number, course_id: number, status: boolean) => { +export const publishCourse = async (id_kafedra: number, id_teacher: number | null, course_id: number, status: boolean) => { const data = { id_kafedra: id_kafedra, status: [ diff --git a/services/faculty.tsx b/services/faculty.tsx index a89d0cf9..1aa4ab42 100644 --- a/services/faculty.tsx +++ b/services/faculty.tsx @@ -44,6 +44,18 @@ export const depCourseInfo = async (course_id:number | null, id_kafedra: number const res = await axiosInstance.get(`/v1/teacher/controls/department/course?course_id=${course_id}&id_kafedra=${id_kafedra}`); const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const depCourse = async (myedu_id:number | null, id_kafedra: number | null) => { + try { + const res = await axiosInstance.get(`/v1/teacher/controls/department/courses?myedu_id=${myedu_id}&id_kafedra=${id_kafedra}`); + const data = await res.data; + return data; } catch (err) { console.log('Ошибка загрузки:', err); From 4d5ecdbffc80f15b642d1a510e4913801f4f2bb1 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 26 Sep 2025 16:57:25 +0600 Subject: [PATCH 202/286] =?UTF-8?q?=D0=A4=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/HomeClient.tsx | 101 +++++++++++++++---------------- app/globals.css | 16 ++++- public/layout/images/bg-home.jpg | Bin 0 -> 854588 bytes 3 files changed, 64 insertions(+), 53 deletions(-) create mode 100644 public/layout/images/bg-home.jpg diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 1784b8cd..72df64f4 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -21,66 +21,63 @@ export default function HomeClient() { }, []); return ( -
    - {/* {"Уроки"} */} -
    -
    -
    -
    -
    - Фото - - УДОБНОЕ ОНЛАЙН-ПРОСТРАНСТВО ДЛЯ ОБУЧЕНИЯ - -
    -

    - Добро пожаловать на портал дистанционного обучения! -

    -
    - {' '} - Мы объединяем проекты университета в сфере онлайн-образования: -
      -
    • открытые онлайн-курсы
    • -
    • программы высшего образования
    • -
    - {user && ( - - - - )} - -
    -
    -
    - -
    -
    -
    - Пользователь - -
    - Shape + <> + {/*
    */} +
    +
    + {/* {"Уроки"} */} +
    +
    +
    +
    +
    + Фото + + УДОБНОЕ ОНЛАЙН-ПРОСТРАНСТВО ДЛЯ ОБУЧЕНИЯ +
    - -
    - Shape +

    + Добро пожаловать на портал дистанционного обучения! +

    +
    + {' '} + Мы объединяем проекты университета в сфере онлайн-образования: +
      +
    • открытые онлайн-курсы
    • +
    • программы высшего образования
    • +
    + {user && ( + + + + )}
    -
    - {/* Counter Statistics */} - + {/* Counter Statistics */} + - {/* Oshgu Video */} -
    -

    - Видеоэкскурсия по главному зданию ОшГУ -

    + {/* Oshgu Video */} +
    +

    + Видеоэкскурсия по главному зданию ОшГУ +

    +
    +
    - -
    + ); } diff --git a/app/globals.css b/app/globals.css index f2c79eec..898ff8e9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -74,10 +74,24 @@ h1, h2, h3, h4, h5, h6 { transition: .5s; } -.login-bg{ +.login-bg { background: url('/layout/svg/login-bg.svg') repeat left/cover; } +.home-bg { + /* position: absolute; + left: 0; + top: 0; */ + /* right: 0; */ + background: url('/layout/images/bg-home.jpg') no-repeat top/cover; + width: 100% !important; + /* height: 300px; */ + /* min-height: 100vh; */ + /* overflow: hidden; */ + opacity: 20%; + z-index: -1; +} + /* animate */ .animateContent{ animation: content linear 6s infinite; diff --git a/public/layout/images/bg-home.jpg b/public/layout/images/bg-home.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe3bcec85e3f88dcb6f5ca87a5fa6fbb5b49ffb3 GIT binary patch literal 854588 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

    a;IDhd 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�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

    XvXEghGTmS`M22GU7Nq}+3I6d<74_Sa(#1) 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

    _pW&_b`(li`Y6u-#{IUG zeXx7~?HH99+D)mWX%r~QxZtiAwFv|+x=&NbF!X6QV@(AmyEI)HIq0tvH(`dX>9tVn zeHO{8L2;lYJnLP*Te1gacJ?OEuJ(YKs({3Ghd}B0;s%gIkieiP!(e#wmn0poRaq%O z%AnNH@iSUCb4u2x?wVTak%*rHvV9k=eHb5W+t`t2lx>&g^B&tdzfhQrn%=6(xBrjg zi)}i3Lr^AttkscJAerG3%sV@sp6;_VO`_(?SkW9uNtn)&k?dj3X`Y#24 zObL^23g!;IT&v-iQ3zBAWT4em<` zwEg6(PMy`Cc#PRE?4r89K?snNsBH`EW(Re?piM3CbG*~u43{Hoh)(2=C8AB^i zKrq#A5-ToT0~Z|Ci0f^<9Z*FfSbKhYK9Qx&&vg}Xp?ChOOQK~a$5T8>PdQ^(+|N^M z+PkGna$9oV=v*R}_h+76s^^F%RgHWoa5dZ`e{0h%c6w;}xYwv-;@L+(e68@n-ocI% zl^I!rK6{<`TBu^I{Q9+qdZR-lP@0N#*Sg$@1lP~zIVmgu_V?eXYZ^)B$}fo6RcZ)5 zR1M${7|3GbbN$xu|NTr0xMIOM|JM`YEAhcqcGuE3nM5U$UY?on7@8U%($bYccntS@ zNNxVbZv6P--mmswf{5HrmK~}i_*z?#*Y04^Oe1-wK!@3r@^+b`-yT9yk zrs~%BhplypeLea0Vet`bqwW4CKS>!ezaxJmx$H({)pF}s=FK#*TGL-CN*Vz?6MLv9 zwV2LFzn)SCQ1o$l!>O2(;+pC$`e+qo5}$g!D_!66k7&&?sX34oRN<-78^T%!e_dhO zcPUQ)lcdG>I&4u;h7xHrRki4+qc-8~(At~_ZKQ7GnSBlZyXH$0n2zaSaM~@=axY$x z%+b$d=80Ynjm!QrNS7(zicFn888j&20@t{0lY5n;UFqU@zp~wBPVsGGJykA3Sm7Ny zl{}ZH!od~unC~-|n!IsFkdtUumOZ}%i|NQV^B;b++g4K;R*{EK_Os~EQuoo`2gv~k zZsWa3j@ttjbCR`~Bc^Z47I(iNqG&^|Y+FUjyIP!Vjav20`quV4wg&2W6LzbG5lYJ3 z`6hR&*`DoR;kY#1McxU%>!;EaOx4tJA-quF?cLToEcWqR(?ETAOAUjO`vRsQp|mnTbB$t*@8Y zi(-=}iT~vtua>-+GNdmuJC zsw1MA_#eeLOCqdm(*PHoxYVMkP?i&+P@b zC6K62z7DD9ej&;fQpaQ#QWBoE`Zq3aL$*ovgxJNx{k&f{<$Xu9-fLC?@GTcJq=u z9`9S5+&jt6N`jrf+;>)$&0qLew%V_nOlq~a<+aj`{V@;yy-LZ{ttbpN)XeSwGA2*&7FmP=i&LAIcQwR!bKNbWJy_En}j#mOR;P4;@Qy1gb&4s zq_f}W)9iG6h)Q#Swzv)V8ZDj`vrijSYc_qR{$^cvRm!vH^5!@Ms_GA`27B&~TF7Ot znX5BM+e}b2a|B%PWBLoFC71p`EhE3L8%9TBEnNgz+z)>}o}=gb(myXF%Qq{RF^XR} zl2eNXjy@8QC{HkPdhfCBgGB8uzG^)K^&jI{+89fOblIG=sx!tsbY9IjZV$U6q>=V| z5tmGO+5!NZZiL^VvuVE8oZESaUi5ksEv-16#oBba-}ilPdZ+Bjo&kruT7v-Fg`FaO5lel zufLvm-{7}r7HgXv!J$wE+`Z}6d(WC8B@6BleHec6<`p@maG8I4QSUBy_O{>$yto^e zfSW^r4V^h{Yzs;+b3}Qw%h=1u2rSxSgiK=1oKc=DyCVtRyGY}wx8l$<%qa;JYeY)a zc|qQg22dHjhVa*76xM7MeM|jj2|UEn?^dpp%8bNIxw~{H(t;BFHPUi&gk22M8KNxg z=evBFUm$xyXo4uemhPla9Vbep0}>Pb+Sg-?YLb=FVa4H z_q`V)>D~d5@_e!vc*SbZBS1Xu{EiKFy>ROS0DpddaKMDy~7jCJMXKyIrpGTf~ z{gApXyjauJG}2F|jKWXiLG8US6*I@Z$gaL6?R1RfVx%3M_Hqz(TagCJrW53A+-go; zl1dtQ@UGoxN#;896%Tpu-%4O4G2_C;JQ%$|4+M5V?yCl8(`KS=TRE#VvPCcdEDgkK&_LtER#B%i1sGC9&Uzzk3{1>Dau;C8lL|^@~kE9OhmK zNf21P{iUnzywWv_0k|ga9od`^jlV3Elx{K;4S(blu8nIQF%y=iSpM$u{>r1@m==#) zYh>_HhXV9oQzKE%I;g@g6p`p@^atbf)$U=z-lABOe`~~W?@G(nd)K30e3Um%@MD`| zPyD!`_4q=m%~NndkY*|2JV)@20!8=u9!UmJ7HLf|>y2gZ* z^9^JAsHyaXor6FBkb`|gM*^m;;n3Rj(b=Y8hQ+3}a>wO-g|I>=TXd{LR4+gxLkJt` zJ!aQ@J0!X1ce6syWfRA`Z5rK&3HZwD_E-q{M5ypgWwRu}cyIl}dFVoF2S^wdNngIe z!rqd{on@w6r6zNgR>D(K9e(|o^GukgWsDWy^=L7lR5?_tvXe(t9Lcsb>jcf_uj3Xk zZ*k)lRz!-v?Wiy)YAnNO%}sllN^|V|e^`KYA$R3&rtnJtaVTBa9}cpv0Oo2)j7)s# zID$rXg)g8X*l0I8vsX)bZm~O7vFmDN*Xp$p!ObAb%iHhV;m<{xpHE*@jo-G7I{dS1$lj20@bGv2mLj{~tlR=uWy)Ea z)T{nb`|KUqyb_oYUwwl<|BI&jyjt=1Jd>YV#XfIbSF~4H8d*P=v{R_wPGY9@%i9TV0|`o$qb=E^yhp7@&-bCVbsyD!D@z@~AQ zOTZRKj!>vc@Y$cH#iGD0$#QbLxwns%d@pZ><2G)twbbLO5~?rz@0%KNKg2W2&2Bt- zv`WQkPF3vJswILHxdj8_)- z7ICM`u;>~D@`{z!_IYDLIkk+rtA0uLhK${n(@M9&wc~4CCu{clh5m+JV{v8eaDVg3 zopzBRF5R?=lG|SRlXdw4(*a9$?A}U)4~C$KCgc)r{%>55_~uHd7KYXv_iO#7VF!-j zaTO`f;Fnu>pDuyUUmvm>c!&zq{bqY*@KR-}W1fh{S?%mD^Yvrar{kDvtf;|MUvgpt zgDQLt|IzDRxg|7%zS`j*Pk`c80rzKgsMJi&+Yl?kn673{+2hrAf4NdNrboAH6KfD! zKF5EzyO$i^w3`ep+UM+F_yZQ?2%(yWO6Jy-ZuVC352V6S?mWYm3Cy}H=}Uwi^Yvo6 zBX+pTYrNIh6_pTAKi=m_mY!w}O&ysMye4XH<66}27md)6n^a?M$rjm~C%1T;zF>{k zV`dw;ozE-=6Kp_fV(U%5zPmu4^=g-PWp1IBwytvAfWLoYyivAk%v=ebA(dN@{1iO; zBqv@;-2|1c%1ih4I|~o}rGJh5`3XI%O7fpM7HRRI9ydP)jVY;W@tvJ1)<=zFD~uL@ zntR%8u|tgGe5<=-ZD;Q^k2lp7vtmKLt!szQ?52+(!k-klPm_sLceupU=9{uGyc`_l zgRa(ty?7+UOZ*E6M>=*U+BG!V8f~^|N7O5KlK);)0+zfhadrJKR!->(D|ZsOBJswm zSK^Od?!dw+zhJaphq;nAz9>y|T`%n|U*hiv9k!Q`_^d;FU+}hjb0b8t(Rg;k54^2e za#EXN5L_z8QIfdu1dDCh@}FgD5UZ%t7gf{GD@vH=nxdaA5Rvj*jwr}c@$w;6=HO2z z4lRCH)!pohoMTpr^d|;Pwig%vIRoi^9oV1z@p*F0*LaK2deme!E!hA*P@ZPwUJ!lS zZ;3LBiv7{hl#?wrPZ`B`cx6xXz{0SmknrHt->qeH7Z@WQluUTDxE6kO?OwNXu&AIr z;654#3j|2i4e;A+(J>P>-U5g0K(BS2H?Z1l*jI!@WP_`ynX*(c1xLR8wXC4Ri@Mw3 zd0#e8#-N!qlp_c%9u%NQz3^|~`_8+bhs$=>yp@`R@*!f81o$f$K^ZD((JrnVaHd#v177B1!0ig3 zr3~#(_c>=XhF_|XTS>D2QFwI^C3+tI*rP)P8|<(R zc1lPlI{y(jT+xqGS>X7ja{IL44iMrN>9Dj&vz4t|4JSQ3HLArpWhsLWMi*Y@n=k*g zwdWJLakD3&r5D8Ux`@S8W)6tR3M^Ci%x|35wTgO$@NFFUgqe^4l$0g&!2sTZ zqJx|Cl&C_JmsDO#guDUgT*RoW4Wo3#*v<1P?<)=Pa0%|p#+5!!Vy4SlGVbO)=d1Pw zdeV1CZ|E}EzEoK`CAwZ{RSNsV`M)2>U1X&x?~-#nZu(U&>vbO7A!?XRRzXDD`0dCU zO6Qt0sl5CHPsGwM3WT628_u09Ec1nca{+4`|N87swot%SfeNN!Kvc5O_h;y-oOid1 z?(fyI8y%X!!e=1W^HudJ+S8*~G%M`Q z)i#Q@YWG~?D%}5OpR)~Vj5VO|FV4&r3uNiXZ`m?1r5TSr@|Ejmn3ca{v(PAluw;H? z*)@Xp#U)mF5_6Awye3v%R9lPJ()X}uT(+{@*RnITKS6+f(AN!RPI6K(#g=$)HEz0F z;`L2s*Rw4B0V+AvnCz|vBt&H?w}3AA+T~=&V?dJX=K`3#Sn+M{^8?F^bs2~;smT7o zA1cv9d35J#H#M$jQ7i>GpbjwIor~8<@>#7@CDvsxa{1)`q^$w>P-v!72*pNQmL>3# zbD+G$B(Gt)6IWI3G$n(nmB$mLU(YX<0FxdUx?_b!?dEV#z za((aZhv<}UPr#F)C$Aj_tE+1ZfQ4Svb<>I6?tN74j8I6o)@<7TSR;B%HPgBON6>Lr z9zz4-N6@{XZslsLy;=OoYhqMBF?Urh5~YC=(G#&8UDDi??4Gm@b>u1uGv9oGEzA$} zd95kZZFkCJJ+faeYH)8KRt@tmx4b~a_eSLv8ATT27A=s9ZCKU({vi^riK>naP}I~BWu09!xkmTErbg~aI=gGyVJ{xfgT{h7MWjtf zPi9Vh82Mv!^E13_GgMnbqkW|kep3nJ>v@0mwQqsf5rB3B_dW{5g>1>-NiE9HYRLx& z@|vqh`gA|_XnP{S`BH{kow7Nw7$@J+!ZwX^T|K=2$!DJl-(>9Mo9Z)>5@Hx%{$8Xn zF3;oME$%SQAGB*mLs!0_FS-3`s&4=)gKX;0{r+g7>Hgy9=I*9lhx79T-^ATBQ;SNV zo?_w&i1&@p*Z6v}$wOp0)YoO2Y|$?G*Q0{-K{Wo5h~`~|GeN{U>o%qjjq8H9?#3}W z#7|y8OH>`x1)`zSWme}tjY%FF>~xib|H!V{$P5QI8pY`=bZTl!k=5)J!WxaVwN)J< z%Q{JXB4C$lv%e#oBdBXGzigkaaZv)U7}FM>>Z@8nrs&EHDeW=^OekSXR47~)CRKY> zGR9*AdN;jQn&U$e#A)(teU93)qZalWa29(gmVMnglrd9p#D!kwVAQM|eK zR|yf#4&_^|tA4Iv1f-FJHyCUoCs9o@7JkoSRbNv2$3{7oWj1v67E?&*8}p^S!GDSn zkKY@eC`l8yf#S*p{K%I}N`L^m0}(&gAP=HHq!1?B&$OyGhQ)pRB@&u6_f@hNU@>-VQyeLVcV*Nh(bQxt(Ev|IBUBr=v8|$2l#Wz_5s~*idSy zATCXxwetwqPhje+rlCsEwA{>u2U#K33=HaqsyEz+g=khP>I#543V6*N5wCN*fz+Nm zj*hYoX1&w<^>hCCoCo{>bi5GHQYiMU7(NlGrCO!o6 za$gv0t&V44^C@~jX!EHrwCks5KSSoNfSM7 zaQwLn(fZg^S(^XMB=?CM!Fn%AF*ip~$vDEPpq_phI2S}!OW6RoCv_&|3iEkX|3jTp50xC*y|*jWtRtR~MqZ2c z==A+rnC*EeVzru}dtzv{?kUjapIjH!X|^R)V#)GN^)20|+}a0~FS0t`^}@ejrGx6ce~Z{Zex zAZp5fx`i}-rua(kzn<6zt6jb1tw|rz1T*eU>5UF~lA6Bzx*fS#dUR&hw_%r1I}p>8 zjAX`$-E1LxNk<74(ktLGF6J%9wy+HAcwV+87t@UxVySJ+wpcH5kkP<)rtEoW>_(n1 zuL@i;Gp`0k*+>-U?@nvpy2O9wsdkzn%MhxD{y2Pj$t!v4lR@%?*l3NXlX{*xu}amM zKn_kcjH?jrIv`$==uLqwL02mB)P0&bs1|o`n74=%r{gtYz#Ve;rsrtuPYQ9S%pYp9 zSeCu@^B#v+pjPvKU#ns)dI0BbReu_oh69C@ZxTx}OU;CUD0z!F7h}QiYO6T|zRUDo zb+v=$*GC@QIyA%b#N}-Z6*|p{7Gvgz+RU}w>Ds!kEBl7&JX;RqU20jMM)_f25w13Q zkS~rc50UU^uQz}9yL0euXiM0Bq3BU>8+lWWwVI{DSbg(CIx8u&n+_GdXc8`~=!*ZB z6Xmp0dVB3ic8gjFi5F%0j{-H}cn(wVwoS%d(mq0sL}!?eLiH==EwoGKqU3+%*w?F= zcVyjm%5&fbOc-b@4C9T#;vsLp{Hh%@nBT_yyE11i-+qS_qoTH(UxAa=AJBINv(=&3 zhLOwdXQp&k8FY>=&Q_YJv@as9Pcbj|e>5!6u-L&?vSCajyzwU_i;t8}OU^ZSoTM&V zW`5e%Q`uxFMtn{X7edT^*r{;xP6)DhH;&L;$|I|lK_&2N5hxZL%qePIUk^!oxpc-XwSTo3!lfUQ16a znI(WhS+#28Hl*W3uzuQYg46{ctZH&R>hJye$6WLdgWAAa$aa4rBm;~7E--fgXoquf z*G!6ymOm18C)Gtd=n$%cZ#!?OFtL+K)_s$d(rk3jt^fD&fC5tg99R~M-5p$iIX!Xm zx)RewnP@6@eMUUVo*>-`}cMw1^+RBBr@a;r5YE{HRhXP&0QdVt$%uA^! zx)wo74Kq}ZG-9bC{o%J5rlHU_oj$Guu&m%=OjJF(>u8$Vh z*P!9=r!YPy@~x%JQ?YOtiK6kNG0CX)n)=DeRv~-Z^I7*MVFT4?ndzt7W8Y3AE3qBO|0sM;)iNP= zl46Vsa@-qdwq$jUO7b|vO6_gSng~zHJX)M|)1LoM9y&;+CN+>NZt_>b6 zm0lR?szA3|F1N~l;|%Tl>t(UZ1_O_SxA>QE!F;vUFO0{#9(a$mp%VAzAI03nv|%6#7?H~#vu`Gmcdf`%8>&nm^Q3SDbrHxLRA zEJv>UrzBCZ74=A(D`v=3Z)`0jur|k<*U}MD|K%Mof66;r{w&c_S9>=u+f#YviETj1Lx^QEiEV3% zz6Iw~UI4Ki>5|qN^0?ja-|Cd`R>t0p+*^Jzr5QBS{POnkY?y9+u}u4w z{6+e?@V_ZM(1fkPBrg6pl8$?)d*n^TlAqP=^lL6KX;}IWBi%A6Mk80fI4H=4?JGQ} z0bzc_)uxiu_~r2zw<^_aT!rq1D?LiwBhTXl1>&aW!AaO>u} zw&`k@1G|&1N8*@J)~!J8$5rDFtE|Rl9G7AUfPTg>D<8Db_KM*-(;*-uuhvaw2%Jf!NycM;_ z-!b^rjGibK&24Go5G%FXmdkw-x>hF?-18jSTeRmt$@oFCSxNnOnzPNZlEp!Q_eL}Q zrFx@bs@rH4N4&v9HTfUcVqff&S>PCDiUml434*F81MHfaDE}dAljaksIIj|~FoClPbLSN7;QKPD9>FWV7&erRgyQuJ{OTJI~F&9cCHKJ{gb5ti?I`7hDg z9YgA3;#+Q#q_^;R90Ag(R^cJ(F`E=kyX0#(aX{(b@&Q{fC7 zVLMBplV=%@QsqfSvNgm&to4@B$OA+uQ(+XOu3hJ_A@pkq=YfK{thy44! z>TAG?D#H5}`C>`n&?G+(&o+BOowZG*_ln!oqy+87#EHJ|gQ?2_JYbxBmy*{0RHm=E zCiwQMEcVA;8|x``#hVIDv2sS++I#W+3M~aT>7SXLEF3BFYI$GICqFN^(J=33A9DxFbHd}x-~vzbd2=R%N71+e1ajCK(-&4wLwN9Zor7l(QJA^%zA9scx;%*e6?y3p zU9U|W)-`gwq);iwXPb8X)k zJ&n6-+*Y+^q_Bx)w_Phm>EJ}usr;74Nt3H_1+f`yzRj^1Zzc0tHdu-ZU z1Uc*m;eI&Xx2()v(sFgM*VA>;FrHPj{z73L>lUz?ehdWRjGQgAKvn#d!<-NASUxuw z&AJErlmZU+tbGvT!zerQ_QFssT*1*ZfLUZXuXg%KWkc=WXQ{-*c5b11oOGA!sHBC` zH1|bVvENN~(RW)*!>Wp^N`@;RT-ZS|kR#(ViOFL5en*5sOS2NpJ+r9e&9;+42$?pG zr0&$hR6jMpG7|f+8hP!&E@jHl_$9~E*uk+>v}dS-Pla!{6+_KPcM4{4L*;7e zV5(U&>-3yDcKoBcvxv~w7FE7Xv0KzPsatiG=wR)>lH8)h*q1;du7-kIKu(dysTKWh z&#*@AzScov&lc#Hyt4e{6o2zTkpfP3d~oZ`Lt2{JeHYes`tQ^JRJnn42JVeJb4QP?2DV6~v{ zNIK9Rr@6x5&rsxLgCCvv0HPH3;>Dz zu0(ZdGa>ds+TTpGc**h3!aR+jZS37p6W`lx3#zKmP2rTSEAZvY%}z#|ox8w;QaK#u zUSWCwu5E6Zgo*`l*}{s0XQ$pq`1J|TM<6tC0zJwzXDg2ifke00)zipw&vy5~j2HI< zPp{Ve-@=|pteEi6R5smZP+f?R?*UKeM&`WwW-V=B=PXM0@s+VjTIDr0IQ89{N0z%j z-x!(8SfSr+M=;E7Dc`H%6r>rhKMlCV|NPmeN<%L65~kpj3|ewfW$? zOFQ?&N=sD=9p^-9Ur0Y!-}Dqb7@nD0AaM6iO#>MQJ`E&gsA?mwHI&R}vbeN$=9Ult zUbD-w{1)Z6O82~8_E}Hf&)Lj7FGk)Rx6V+_ovx?dRILC}fQHLAVw|*v#;%A*I{DHC~5!ZrtdRe$y+grj2R4 zFv>Xfo5;$cdZL)!$c>NwM`PeHZGUdjYxnGGa|iUb)!ypfmQQ;@{U~`+>QTLBKL>Ba zJW?%@@AD2b-v^t_lSdVox>uP{-U>^IYiE#fNZZ9`1WHYMwzb;6o<7h?-9>7TVb&V? z`ty2qI?<>TRD0Hgn1vh1j;tb2mm@9(iVJ70%qI3%qfF`^fJF4LpB6b}si>!SUfTlc zfSiO;qK%!SpWm;S5VUX@P9dV-uUY%{IIFPL18-T`KFQsW_zj@Snl}=!KLhIrM`Q9tGJ}6n zXeV8|TvhCmB_Rc72o55w^Wum%c_MVNWXMf~e3Tb+wN4eb&MQDu0Um3ifjR=wT&)hx znw@0Uv5h|ymoI(1Ic2|fU?hsQ`wp-7!v)`7OJL-?jULA>X=^^q`osQnGF8xp)ji33 zYp&X2?;`iOY(9qnYxj};d+z(vPLiVe93~cyoJi6B^2Et=5Vo+rT$&I-%=O0fqbv%E zO@>H%*CGiw6zl_B;Y(L?eC4p(D{cSvQ)OzW)R@l~fi-gpNmmPoPImF5pk^dBC(&*+tWV|0tA5;o7H7?GOAQ*BZ}QNOUABAfU7L zi?S1l`jU+(y%NZ%S%Y`zw8alsmjE>fNI$XlJ45st7E-E{b&ecZP6G|@BcYY&>Vu52 zDXbc535Kawj}lud2uDhA#wg2O8F1lQkffYi9@OE;sTg1~vM9VPQBE#` zBxpU77_U*0#g6Fk*Jt{??+7`|h&I}*QD#&S_*D&9l87!Oy&pGY=C@Nwv^}rFo}{t+ zdttwJL$Rdyuy&#UlcQ&B(ie5X`%t0P($IgPFEPdwT1^g$_l=XGX_Z^saDT!x6SO41 zHY0a}>281!=gLv9Cf0ZQDy3qxTbW*YC9Ac1WS?!N=u+eN?9!(ou6q6JJNHHQQsU2x zeB^KZkXGd?W|urCk=&r{L|2^lYLcmP2Z#v((t5^bQDaWWVE;gr&b)fwP4bX1Us`gN zCaZ4rwdjqOoU3XS_v#3dKLzQ4n*+tpfud2$d<-9Pr^&suNQ;M$fM3b?hv1*DaCgB0 zOqKZi+eY11cP|}tOhhvMxwDal?-E@T=+ZoL{MWd10MBRU5xBeD)Zj_L*i_&$??h^~ zMvv7Ucy(Qug+4&5Tat_;m-h(vI}VFSRS|BQiQBPYg4znr-W2}#VOwb_ z^j~z16}@Rcr-p0ptci-N&luBLg-PBK<|Fl+qxTGM5JaycsC#!6GI#Qlz&Wpws33+6 zcOE#u%^>#!oKMukxwps>8%JJF9OSmNG}fzY_DdZ1#J&__vU=+3(9S-5{lNYKrJ3DK zaR<);x8+j6jZYHM$rSC_-;RdKgSt?I3V-g zMstBZIqoakx19{*O=-Oh?3ya$?Tiw(l$QesxTPGf83#I5>V+M=yNWE<8`a$=!tZZ2 zMiD)`?gUovn>w$Fg~hr}Puz~?a+y;zB_L*w36_8ibYB~9dEAx~B$3hCB8aL@z`l}} zYC2i8p4b5Uq#p8p74M`72?>dhB$;)=>*Cs%qvV|1Vgnhw(5f`CHzhS$9A|6qd^s=v zVN#hLfDR)M0+Lp35LApf%L%D_--uTW`5rl_kIZIIw-8-q7!%1J&9Q*6gZxw#ce9a? zCmd_jZHw|MK8s!6fvrx~?Il7wF@FW*kE#|mM(UZSc3p`N&bomlrQIki4ybZdLuH-g zYOomcahe*=sZPvyd2`r3AB z-utS-pCq0w2%`qFBFLCwIy~49jq?E75miFe7W0dM!#p7riH~R zNU(A0B<}8~i??6JRx2Z|7N00I*t56w2}G}KRwBk=b8O^Ww7AFxN8GX%5Ju1I8V?xl zvYll)$)>z39?u56Hq(zlH=%Ag*SOPW{g-t_B-q`qxODzCL+;8?k=04wc=aQbIdhl6 z8-oiZGRd}-;V)$6*sz5cdXt!jW3Wr#ZBL&LZWMZw zV(lU-lJj%ZHB})XH(tH{HfMa~cFO~(L1Gsm&+zh^a;;$N)}JqNa_O&Ge3)Q!7dG+l z3iZy*O-bxzp`1~xMa-Y0ybQwkb7SCP^L3eBiQ`h9s0GH1+<~YdOLw;hoo=U8Dpnj( z(A=IC{&l;Ks(QRp8^F`s8Ii5rTb0BKj6;+HUFoO$TcjX(;mx&>JDH#-Ry3RRKVG{r z4t4{BbNQYYb$;!-{n3%H3n|tg3w)`ktlkC0Ki z7Wb3O-)PLLT5Uh%SI~mTuI^mN1x**-r{q(10YKqot9Ad&UG!?+G zpa-AW+SIreuTIk33-`}9~U48A&*Rqa6-M%mq!kZDK@kV>qg(l1Y zPuqF}`*fEuZRnp<-_$6mx>|Yu!I@(%;n|_(cV7T%F~K_#o8D)<8&goeimW@9EYJGu zy!nzcvrJF?M|YBEg81{;sR00Dsd+`7Ch)MO)nvpxI(}(V7jba86?^&Y{VPguuDkwR zMoJHpc~pNd4yWY)J@5tn2}>&^9gZOn}wqbigP`+(Yp zu^53ascO@CvncsMDGpw#Bgd4_EtWs2uXTL8w)$Z0gY5~gBp}pF?VVe0AGvQ#4A+!S zk-iVjnJi!%((yCudmwZ>Bt9E_l1KnT2ZFP60Lc|OsU$~?P)HYNiV`6## zwiw&SpSQ{CJnP#wTZc~F&v_yybe^#DhISY@LSMWXdxHK%gv?sbly#og~NBp@p zIj^NcZ5wRM&y>3^|D%|Otpo=NhP*yHS^l2Q+_KQ4p)w42cUo#=%=Gu>-t7ZcEaIcW zDBvL9x>UxiHmthR@1`gTwPX(;lJ3hYjpUB78(r5hzV?roK-CJu|4M`C3$P*aT7Gr_ z!)D1?`Eams`{MM{t+tYmCrVs>;SHOddjH;8eVTR>=wl*3=8(m)Qq%nkxuWGWp;;g8G0cPho3LbE zr|iYMnS+Q{5+aYK_jW;kAtxn8-W_Yze%z*?Fa88b(Z0k2h?=pXUXPO6JB_+Ag4`1f zHaxYaHqNDY62_>!0uOq0_1i@RskKDal=eIj=Gl=uwA&`uVAp+LiKGVXVZO}_)El_xRk&};G@t)J%xR#yeu1k| zyi%#TfPf>Arc0-8VEi@YTs2C8sTy(tBo>MS*U9Me%~kP%3;BT~4;#@BSF2?z35>v? zgj6ACE(bnl;cq~3_PbHG(QEI4T+TbhCc+jm5tAj*4!eCQ0+q+87t~fAAM#e#C)+vy z9RytzrMmU0p2tCNwNEK1lKv$ReIeRfL0?o?hkk_b=`5v9uv0zV`TLClF7$ziUM|^o z!oz&b;(M|7Y(PyiqH!u)8V@7Wp5vodHj4RM%7JyJi>>K>J!;&U=VFGTfu3FX*#VVb zVMxn;Vreh=VIWN>nH%k0ZmpZ2s9jy@Cu*azo|W5XN6D4a#&QvdQzP^fF$K_PlPIy` zPj3Bq%~y@mtVT*g*_y_AF_YphcaEhNJ000y$w(fL?8oO``rwvBHvpqLCDtee1Hd{= zW1_-dp%DIbS|uCDh>uzk*ZPImunOtAo%)%IzgvIl>t&!{ufsxMtddqV#4xnZ_+eo+ z3JFya)?2A%kll~(W0{3o0FGP}yjkya@Z4}+Nnmm1J(;xB!RXsJ^t34_z4*{cF}JX9 zuNHrI*Dgl8OPI{8_?jO_Zr9Mid+f4mHlug`QE=qmxnSVyYq7Z%^nTvVroHwe)*=k0 z?Xa4H{1t7c`9%qIqGH9G@p|gedsWi%SL~LG523Y2Dj%^6h{JtQUUB=cShvT0V-DI# zzhB2Uaeo~aaskcgcUsjv$^e%UX^ay)6PGKnc5WMlDR#!Rmwf6!6`c9d+z4O{N{~f9 z-M3gsSBmmnoriG$Tj{7%myPwg`LBDJ(Bx%D@%nL=vU?5uv@*}Hv6-~m~I{N0>O7SqmQ+HE1vMxs1L3{3{$Z`kyFB%~ba*LWLIZ#{0Vu@Dp? zWv$_W(ol&Ns)64q#q}Cj5>qj8_std*d{WVGel#ZSm@c+)-sI@Va%|Lua=qu>n@qI) zn5*0IP8WTopw_!geL_#8)i?Bj4*JfkpN!DnI#c5n=MnhG1zO zx0uX8IqwQTeP6e1^6QM6+RAZr$j(lHbLB{=YzG|md@@99>{62e?&P1Wd!(IIQpy9n zMut=b&5e0YE(%sl*zlcvP^`Wzt~-0<5qr8axb(d=s>_y~kLql<6T1lUgRobk=?4_1Pdk})3N%j_4QIT-5r zKGvV`Ay(QGs%yWMdh;KE)T3tiNpd-rWwQZTy=&wrD zbqKD9wp<>J&9=luLNK0X>1*N45}3Y3tuU)!AY(&8fW7UwDDvy{k>5AOEC z{GW9dkLcvZYV?5DYVdpM{E>5vlF2{SuPHF^+&oN=Q4&z!{2cRWgEQ}+h7td9_UL~F z15BNl8+!F;2DoBA1v;*}5}&|hk#N8^#TIc&F9MtD(_r2R!%VEEECJJjG)iF2K;uv#orZgz8z@LX`l-9+cmwfTDM-?Wf$i*N3p+e z5f;C4#rU@NiMYn|r*nHf_2A_`G7<&Y49G1}!c0wvfYRZZfXUZt%R4zOh({_8=* z-Duz9brmDI$k+~ayq?UQHtnj6<$hC#b0afreY=)*+nG$GU$uLGM2mw#NEBLPPMNuw7*>`$gY^*M1Lp z!;@BxJDQMWgE!NDp2{f*F%=Zl>Jjp7t_aM>Wnf+MNrF(`QPe+JZ8k`6dmWoksXJ?O z(GF+LIaAn*^JUkkSkHu_OP*(zM)|OI6{yAP2&)!PxMXZLK8-%pi1|qZ#_$zO_Ullc z9olmbRrjI5cr0S}Z1prQRKK%@4d_9+vT2w46Y*>8(g4FQc6atgyWu}?e$W^JpwtN7 zs6&~tW+XOUD$cza%HKF~DukgfE`qQeKCB%#mg4w(x0d(8F{w)DINGS$v{s1n=J>A# z-Xk<#76*YUIw?%7C+_B6=}nS&316?upn-YhA+6$1AZ9O;>m7|-v?t6CRH*8Xw(ng= zVqKxvRv!0rmmVQZCtbx(VWN`h8XSZ#aw)O`r^>@EC}J*&Llf{f!kJ#;(Avc971F2m zdb#XSERgWtiVRjb@I`vGeYm|L-pPXBjM|u3o3hRLS6npN?JZ7Cc<4#(>%Ld}gU&RZ z5&b>j?xB`S*&ayN{-&$t+&MSTaOUG8J)%Cai}xkIojTb6k>Yr-?~U*`YYnbU9^!Vl zPd4WSQgdIErw8etk&^G$%E^8QnqQq1=1S>uL(kXja$U^Xo>9XQcX-G`wpdgySqtQ5Y~l8s;9YbJ=@2u$so=8+ob`HRB!`W3$Dp`N=Z zK7c^_tXL;c|$A9?3SPEBLA)ZGuOE>Hze@3g-k=SQnYqf3P-{L^pqQ_ zPSgclI$f4Z6KmBgNe#am`6lWD=7ta7g)`$?36?~g&wNu#{KQV3Y00$Ac&awP=?@fhcJbnC zC&TKi%>kIx@Qxvx-uQVUr74V(7^3_AL!hQ+bZxpinO5(u)I^(-*>$<>_fW*E zSx(+34PkrRXXxp9>I^n=VM28OLxZDKRmtt&)Ut-;pk(~`>cX3loHtCGt)hs{hP*#s zb`cld@`Ym-H7#bK&!*%-B`N%Lago^)JxIUtPkXAKmPyOd175*)J1U$}!Sl#Ed)PeQ}HgG+ODVdD-1-m_@o!5nCkc>nTbO=;3Xu29AZ6zWYmX^Kq?9Ul5fJ zdyg`#1Z^`tB$FZ6HGWanU?F)m<$L94Oax(j_o4ugfb8Ubv50K8DU|$&{Rrew+NN=r z-VzJ7q)SfMaa5-+5JOKF;i5E()~#aI;~MO>O7^t+BMryt4oMBRNtuR!R}zHyb|~@S z%{k{gpE-{1q-s%a@_1=)ls*@8{<7NgPJ1>HbGENSdf^BrDG)V#s~|s@)dD=-i_7HH zLc0QvET-BM7M|ax4{?EovmDrS-2NmWDEaU|ipH$vpzr}}yyYBFwK-`Dl)ViGn36zu zRRX<5%gG^LyeV%h2Y(VswnxghNUj7cq8OGwK)t$}SnT+_AH!bOH7zB6m935JTC0*t zHsklly;DO5THs%65Rtf2eexg>EV=x9hwUy!$Jv{y&!W!jfNR6{@l&N=Ag7~NHb>=q zfM{4mnIwP_`+5l~GTtfmbaxGuM8z+f<(%J3GMsN^|KO%hgLM4b*65WSq$aw^d?cs% zZO4G%wUM|qX!IY&?U8%LDWFYEU<#`E2#JBQGlnmTB-s1lrgNWj8YgSat*Wx?3`o;Q z8)e#*L#TT9@L2n-XlbSUEzz0fT|E3%pVoPPrP3U8gHP%Jt)ZC0OKYiA?D7}#t(HH? zACj5683BDcd=&GBI#MCA*Wm+YjMt!?^_*)&rrcg$kAZaW?9sr6^3rve+>Js8{n1!6 zt1_#VAk9msYMk;H1v^jYl|>WDL78Dp@j86imGGLPjq-;lnq%A2vk0=W(9P@j_%F@D z0{o{mtaIDkB0S=9c~O0+NntZr-$isI-kr<#=pDsy`*`Cs78aAn7}G1pUhLN-GY?;1 zm}h`L|L-GVC)2;_Sz8HepeGc^=xr+va_{mVfN|6$zP$Xmk*A^jlh1L@6UQ7)!1z2a zD$bYk@dmhW?K*fvgswByl6UfB*yA-0g%%})-bbw($}4fLH7!v%>9)DL5U7fjh(oh9 zq3$uAv+(tMy}ARNzAoU{f)9TPS&4OOb$>60xdz>gBgb|3Rk$&? z2}JrFT24ZBM()PQvGB6@+Oc4<$c@T5W;G{{&3vvn`q+;Vzebz*MH7hSwCrK*irxjWed~JMuZhx!@ts^U(n#a9!=6g!#C7y| zEl8~uKNf=vX^*I)Murj8Td6HKC%qqg$+H9uDUsDz(jHQSAx%j(0}0PEd1Uu31MzI; zmE+$1>Ekbpcdx%f$H5oMq8F9tcnhbS;THJ(tnl6}fAua?#pDU<7>mem`_QMppyrvi zGszXQEIvGJq-%NtD&RC1mc|((m9xfUE5H|h$}#+Wu0@|l7pV)pnO5LN(FF^SXSa#_ z6Q>Gl*f;|El5aw*MAb9Yj(zSPQyb;BNed^Qj`(W)i7u+aR&PG_knsa}suk=?wWxtG z8*;8%<@lxM8;v;JDQm`>DEaif;&!>~rz!WweO`ufH2H#pn8E!$d<(R&u zr^0@U#k4Fl9wzPY(RtAB1n#~PGLs*K6o|j=&QN}Up~>Mv{w=TGF6Qn{7+0;3Y7!VQ z+rF3z!{1Y~9ZTfZcY<;(pIvQ-LaTV`NUfSwO^N4z6*22o(u2Wr zhRfklt?#*!@~kPCqz89wL-*TuJiuRSD;=5)7lH`V2bj2WZ#kBYd`w>+TBO{CJaW6$ zf#jjOdb6O%$L}XFpJax?uEizaU%lDdB}g>*IVm!}B8g`Fn(ZuFFg}1(Ge3T?IhuKl zo<@qCp4K0wvz+@22}N&m%K$}Bf=5yGZ+5$lJf!Cn*y4|NH2C{>UThQ5b{Iz59kdxh zbALWWs_#E^tYDpmcHWIckpdgxFU{U0Z98gYB{{v5Z*JwSsv#-|0-H42sAlT-_}tXE zp$SKtcwsP$wv18>5{ZA_b@3>%d|@}el<4B@v3(2Z)2nqWy%rx)J+PU1dkxKt5o7N6 z>Ua1gW(xk|zRvr+&rO@c8#^)H{2YVW*LT3_t27t~F%kVm99JS~Py6>%F2IxKhs^wQ z10j&l2T|7g(QZP!5W{ll>twmA^~lAhxhtu+tHYIEkFB$_$-4%=OK4Jyg9hn=710%I z6{gkvA4PW@E77X=Sz1i_Dl!!Q?Xy&_xbXOg#e{+Sfnv@yRYubjL~yDSFEP~t<1FwV zK$3#JngW^l>%oh>Z#5OwbRF-7B^-I%Y-ZX zDS6WXjP~N(c)|%;wLMgf0aUS|yd{nvGhrkE~nEG6zj$x0tuGw?z3pGUu|I zfJ@Wo8aYsSHVu%fP}udXw-{2|*}^>L(s}dn@PPgAj?5wp$~upaaGS=IG)U0LAMW*% zxVQc;fu>O}SGk=u0~^C~tTClc{hK38)UP7nd!DIIU7**OLn;ou;@G#P$51wXs4xvW z3fl8BGdM6(xS&P)Zj{0%8~yWbC5>l;xg{Za9*l!x^747=w~_&zXPYeP7Mt-ngl z{4=VX^1XlObRU^o&^&u6%3Wy1NJbkV1Mk)tW>^J~E!BY#-esI&+*f}o#OnwV$%Y6YNdcYTzxqnUbb^zmW z3onkf5My;0qHh`RO>em>Z)}Y+B;5$W%s%Gq*_I`(*zABAy8*4Iyb4uMgY&I)|-fqz+*o;n@gFiKP)KyMuT7?PJFVA9Y37 z9{xC!p;0hWTZKioJiUr*wO8Ih5Pa6fq0@Y*vbF>0kEVJ` z4n%VA;M4MmFrLh^45!7pWF{bxjX-sd-Y32{jSI!Qe`vB>i#JRPAK@3}}!z-ptB zbWc!5wAGXLH4O<1OQtDHqw4R22h3<_CYs%pnaHB^kP$O9(qS@HZ&I?5;UKU7;R^0o z;MB_*hT!^grDM{YPty(`JmY(5;YUJ)L*=jX-V68~EW))CE=8NQAI91!SeT$grQfmY zR*yB$J3BUygDqmK2C)`H8>uYeKecK^O&)kQD$cZjkc*Wm@h{t5txveK4dzPtkgNl( z%)|-y#9-h+B^m1(96*?`&p3WKQ`WjEA>&qWKEx$bX+|8TeBMt6(l)F*7|;79M;;2n7xAbW&2aV}X1y^M&A}VZs4H-UJ~*x?3*#QMiQjYjfon zTA3SXl4>OHf_jn?;aI%qskXMBc7A|wJ0c<#K+l|j~y;dP|3U7YZp)D{uP_ZU|nx zq>9+g4y=xx!Lz10m#_v8OfSl(u}EPjvpecR_b;`hEz9nkmgl2{{`|iD71tR(#Vx<8 z5U<)d#5efR#?doY7GcjZB}}Dl_l~gpu|yYA!hkmw5?CG?yl}7!gep9@mUyPIDR(q7 zB2Ym?lI++C60UDNM%6}Bv&*a9@HZHQv%i{t?Yb0iEFK)B2kX5slEswM7y{38uPe6K z69`FX8-t&(9jqNW62Re#EH6$Dv?)B?EiD7ng*);bd~M6^{mzy2e$3Af)8L!TE8yurCA5F)T1{k z)ULnvHT{PyAWL`O>$)U|QfE32%PwoGhSq$Xl{8_r7o-m5te!5ct4FrtT4RON-bcZN z)YD}u^0sayh(n`hu-OYnC5Sdq1RIE!CSuMRq#d^7D#*yVxZvl%IP>~gPA&MiLTtr= zF#}cL-dy=~Ynf<%iRCUEIz%vfyq}Aycjo5Tp0OE^Af!=OI-j)RL-jfNR@tUkP2ubu zJWI``EMaj<89WC(`Y}S9o*n-WOPCw%kn7!Z@Lh4GCQ7erM=0p7Mww|UI+!<)@zo+H ztY7hb5}ru0-l$OMph=59p)mSEG;1%^$0>*JNi2t5fW9Hm!)B4(exWhQofXXAs)Tmp zTHs8Mt+Ju z)n-yFH+@puD3^bknqXZ25gLK9$xLad2)GMuwnkqI!%OdLkq{Mdzy8Q>t%=eokB#hu zi}{Jc(Npa&%KxM2Jlxs(|2D3R+AX!`x0Keby`>99jaKcEs-nc+BciIP8KbDJwQHpI z3b9oct(A(IST#aoL`e8O=lKJYE9aampYtB~{krLaJr_UJ><^MrEDm^0zxY0rFYxH_ z*^Fmh>7?WHoHv(2Ip66VdmRfUckyNwpM$e#5(1pwXdr6+xB`jz_A| zeH4wPA^Xnv=hlQlqJn+Kd{I8~#p93Ot4-9Jd+1z$En2BE+R_!d!p^T1cH}65x8K1m zfkp5}dMlu4>7zCePpZmS8_fLh`r}&`QPBE5nv1|;a^nhDoU~%}oh*1o?GWF|pxn6X zicci(VFWvAgLu3dm%c&ihtV~2(Qkavm$8z#**oHxpTz$fse*%3Ih=5Gahk4mZs{Se zy;FK6j~cyn+RqR2okW5?m&@E@#$GRG1nFsuh`Svc+UB5|B6sP|+gF8JA4de->GnGq zzH#{mtJKR&na{_dLd28)da@91uM1!lrp|4(URLdwVY!^dzHK6gGVQ)Wg%MeYg&5sU zs%^;r`b`~wWCB^WuVp@gy@a{UE-VMEyr)wlMB;g{8|O7JnQcLdN&KFoy)sUAC217C>3>rKEOK^ z08Laczf}6XdK_GqW6_W!+L+r^gE|blsJG*|?-!fVpz+TU^77v<)QoU4#1-aH%Xg=C zecI^cmt1H~+dljuI^lTC7RR=uEr2}#HAV^#_Dg^88bw?D5Ra!E1bLIiCXzo$V}{1j@8s(6+r*IotBiAT742Pd})eD6a6JBsnW1u zHvo6v-OBBG^B(L~l-T#0B{#6bhN<3Gk^37=s7ynZrGE?>NjizTS99T5FEDQy}4SG!wa zg&6^_!L{q&R9TpQD?qrMSZ-~S1)0tg_1}s?%CmIs2kujHc1@bY==xE7b|K;Y{`N`; zOiAv7je5)>Cr-XM7Q6dEnDP=;kAPnY0XzNw(UiCYUT1Bg1*j>3l>2K7`>&Z}>MODh zP%65(IKLuPtqu1$CFT3TwunXeU?8`{Zc0WN7z)ZZ66&feZGU(onj(45qa0Je{2l); zk=)rXe8s_>HxMzVuf=LycJEP9bD{+reV`4B>kIQZIWVem7n&m-$Pi|KpDu>>MfGUa zn^A8!5tO-7UdRb zLVKtaO7m3NMl|x_Y9%o5oj=WZ)^`x-3SQJ>uU2sWxVkkK)`qm4{hs}WD30)xKjuhE zD#h3%Dyk?%>;!-N?B|hh4*K4kjohX4!VL5~ZERdX8uDjQOU3SBtqPUH8!*OezQH^x zyhcW?&U-2^smhE5Bq+t(yKoCStV<@b-8V5fD_PkeE=MCRohqIHAr#12p&toXua##K zPt0infFHU6>U5q4$V0lQD&^Fd z@uy!Yll2Z)oH>C^ZA550XX)LPFn`+|GNLb&GQYg$4hznQ?=LH}aBW*P)sv0(e1^xWxdp<2KCpP2f?^6@XO1=Ek^-mB#tdFfgPlM$pdz)TI`SbdldGc}=I`m1I!t6!fVK`_6AgA#0 zG+1;b%tlvlb3Oaeq2nRnv+`=s_nn`%m)vj{%$3}Ub0`w4^(H0qmFL{HO5}MYL35vl zMzgR&(^8)f|J?WML$5-?-vQ-qb8CE2-TLZIzDzwq0C@a$y`9D*7FDH*JB?u#7jI9I z73vdm=3B_2>8dVgPinTU?Y@=O(k*tA*NQ$BdcHbm}ck@zRa+PybZp@O1#j zp9(kea!3<#qBoE6NpP;G_R!?QoobP%hw5oPKSrdBd4F;g(rQA>j&8Zk4==V<|zxMVP%E}Aa4z~hor`KUx zWbr-}-9}@^%ht~HZPJsLkHelVia~08BfUa_-u^UevMd@`IX@p5KImW8PF-rqsnJc4Aa zTht>)96if0P58^z&mJ(}^G*HY*T2*b~b8H-8aG+@BoF?CfXPV zu9;kV-c1kfnc$=4{z2C*ISjqBVv+=6(gfDRW=}Fq6`quW?L%B<&n~bJ7mCMx`Lq`o zlJc+oIIcqKQFx%Q&#MFM#a|LnqLoIIA92quO^voRCj4r7O!J>ruc(uBt2nyMZ#3>; z`^9FAWc9JPQ%9YKBEs-*$G7|%#NFzhnbNaRg+1?gMJ<*CYLTyj`}vrt8xO>iAdK2j zhRnBT=~@&1&41fvj&->+>h};o7;>^}5B!(Ci4}NO$`iLj9-?@^GGR6Yitr7t`mgBz z(>w#&U&>fGe?HL`bq%V9+mA+F2@HV-oFvw`Th^aGS{tessNp2`-e4#ezN~2a)YO<( z-^(2xjkGQ;^-TO|^LEqv!3###fxr==TBxzs5Xa^%uzb8| zUIP+&G=~zYJumB)p+5No6Qw?#)C9Q_3RexMWb1@Rx+!)lUa_wdrW7M()(`!zPiO`p za*(o=@Q`X!7+DSiS%t@h0YQG`tI7QCvoL8+|ApPu2G93a2XoSC6G}qVTV^Y)DZ=MK z=s*3b>|M^!^&;Ze1mB{0 z_Ok?ZZ&=kd%yJs_eJ^7b{vo>qJis`nq;$2RebLoBFvKzC<)yTiRaJ4{AzD9m%M3%Q znu-Y%@S&E38luUd;7Ri`s_M)UTNKr@Btd+Zdy)jT1_)#BCy5MzIW86w&YgC7DD@Gl z^MizMzL)A+KKkCO$=~IN4aBRMf}%m@N6RM2&^^vs(xOaBfwk2yGgsD_aeW6Ge8L3z z|Mj&Dgox%}$`=yf(VAQVc`x+$Q|+zF!&tSY@Sy#>TMjBj5z?m?@*TqPs?Ny=sL_f& zr?jEH3a{jdi2X=yZ$P<5WpR{{1ngCB5BI1bb42&!LGGFsFD2ns0gg#q@R;I6#;O-< zuS++s29$JJG?K`_A-4_ejD2rqR9GgIlY7Fm5S#3y&3{OPOY}M$N=m?HdBwCe?TB@Yd!K6bjONI0<0!4VSDaM7@<#(kq+dybWyS-Xvjj`t_qH`J6m(NKqO|DBe3t%einy1K z12uW%%!hTbrV9DapT5iujk9gHHFT8C?ZH1kbnbjZnf*lggo?i!8n8Xml%btK(5>uN zCVP@X*V@`J`iWOFuV`Loy^?>p<&c8~v*-Z@(j|O-%3CMCYe%0k&aV}c;9dV{)|_&Q zkufJHORR*lu1_t#WBjExIU4UKTD`*j9h$KP#*ogcU4%%Ro3hl~jDpIzq-%Enqgg%P z#AS5C4U1eqWa1EAzyWH>#l+#M)6Qb(7f?J!xYOAvRr;hx#bpC}bk_CWEYaVeu zq{=3ICp=t#?!_|Kb!)5CP#O}qs^C{-sA>P$Px%B?t`^ACLe38H__r)-aKWc%752n>7E(h%8i)$Bqv3pSeG2EC5TFN#%uT~ zWWb;O;a6t!A)Eg$vq3u7z`r1UDWQ7A6#Y_iJi)v7LiP{OWoc}~L7+6qcVu2dDBm}q zL!i-ky2*Ra6=xE+F^M)J2KSTFGF{-t(j5U>uqVRzH3j{DTjq}7^2Wdq5)BK)a>`Bd z{0#MR5-4Hccd&n(2oa9evyGB(_7DlDw7OtuQZ)}&;UGrf>2T|+uHZe5sf^@K1&Nt- zGOi5v?+iTrKN?yX4^)oO+|~L4CIK~_Jx=@x?X;JC`MtR_sZOEABJ*kTQ-OHRFtk!Q zfv>k)W=gnltf{klw$-{WvMC_2b!ju!{B6E>?@In9hj7AhZ}5^LF<&{iH2v)jt)%SB z5FjJT1GIA=MmQy3i6&bWi}X*gU9ajM09MSzf*1*z?2jd#xkB5RNw|tbc--Ne9{qWLC-@s43x07P8RWFsg zLQ_I9S`aKE8pV#s%M{Nl$tu`1O=1H))wnD2wTTOJyR>@kb=7^~W@q>iD$Wv+VFXjS z2F9QhZod3Fp3?XUwIKhr+fmI=cM2in`NTSw`$0DLWeaB>`~;t}puC7YZ6t95_ywd0 zf=TkxF_9DXwF{56X49E2@0`EH!-Tzc&+I+jL$Cpq_q_1p62@x21&+-kzRZ1g5z&P+ zD0FUUH5asHU1V}~o6tN~B6#;iV&eL{X$cx{TX|z<%Oc!F#vq|}9O)Wtf3Vm zk!wZV;H!IsMuW0CRcH1%a1@9Mrn;jNFPJA5<&B-STQv0S7+Nfi_<4n`(=hd^!+>j7 zXvGlU|3^mCLcL4eN(SLop8h#C{w5=Hg-wKRuRLVvfrt`;3tvr%oFgX? zkCv~EM7nyp0(VE^DV?wI4gH?A!-PY`2cf2*(pRkjF<1rT*>n-|u~RWs z16t_5viF+KT%4OOVa?h>Bh6w15+S%gJN|te(OBLciQa&vn)njgSefQ+Ln7@6Cm;9l zn{r(hb7|A}dKvz_f%b+c3E82A00I@MoE(jvc%M7_g*LjJ?4{D0e$&@YLVA6&^s8FX zkG4C{TL`pzufxzkvb(hbBrDbI4+4Ypq@CzbSFE>pldJtA*`|_f@83QT&uJXG7P!nG z=@F_eGPljC4C9%U#%#YdJn`YRMe}&n>E4{z$RB=3y(}pa0)92U)3iSm28gz5nTXZ{ z_V;v+hQFfhRZfNO0gB0!X_9G&kd4Xgd}vvlnRr2DNx&rcmB-XUzKPHJ`tW!uF~{?xMO=*MtgoybFy6E) z8V3K(!dapsiVhSow9)M)bOI8ggW1)g z4uR>^Q=i&jetDtwUCQ@g`KfO59}h`xMk*gu(aOuc`) z@aENK+C*8X{r&)BNPcKgHBV~GYTLWGZtU-k9AenDCL({jPB6rmX}##aVV7aRS|mOG zA0+Ghq-fjAEc5iIrF=#CGh4p?nGRK+({)1VrJlBSY3({nw_m>cwVrh0R+X zom@ongK;fNo%FKBAIqk{+dqs??AU9~w9IHCX{jP4W|W!H7rd+ zi3StTY^!f&{OYhex&FBz{r#ow@S=%?!-{CHd%XeyrTHG?iG$kWtuq0tHdu>2?gECs zp2i`K=)$?JV*~?{v&83Ya601=2^Y$!D|c{hTkb*$RULxEk=WT4bf5QLx7CPfeBpLt zN`61}1DP=z|Gb?>#Z;I6?7}>RUv`EQ1JeyyRXkRs2;KOxP4}7Sjp}gmUZnazq!upd zy|a1R8?%7~mMP&QDkLqsKl{0Qm2=GVmiMgQHtku;qiDJ2|bpaciZ3^on( zwhTVHP;vFLTqmLC2UOC{myJ88q|fu}vD0+M1;_CFo~bYNy0byn3;Sx0l{wdLQ3 zSpI@TBw|u!V3Gb?M;tT9!Sw!mF2=3uD8?Pj+`>;|BB%BJpQ&|ajZ?>!Qq3_#}p!{&p@7lEGQ2AD$55V7?rxDy zV<$1k^JC$CXR>hto!pzUfv)9S%0!Iqp2sPK-a^pf<)xW-`y)z+7p;gv7ZHp9T4H?| zUwIADM%?SZN*u3tbD#Y;<~8}nu^xnG+RQ&5u64bbqnDV5=&R!Qm7Hg1rw@rdE`01< zyo47f0mn9>LiIufW58}9nH>kchC6MZ_=sZd<|7OBec!U=3P!67#bDL5z66**vc3Ja zAW{6+u5s9*YI_y3(t!`-&sDayr+fWP56QDx6@X)COb?3 zArFM)MB`r0@!==wdyfqEgcMp-dDfoez!-mAE8eKIAG<6Nl5Ip3OAM&06f5kw#h`fl z@?FDYF~*_QJBF9(dFX`E+lpk1hPakIyO!<~m^}-x+BhG(y;)iHy!VdNVf@8SJIK&X z-R@xjJSvCYqx#;_j|<&S%kxy|BVvD*9a({*+^6K`wU7LDy0TKTdlfIt@2EGHPXwD# zACY5LKv9A+Qy#}-VrScsj}}y0o4I)C5gQO$x}UA;u^yr27U_l}-{tBfVui#XG|wtQ zx*iAt6HKiS${xt16q`q3ulSjmhz^44$*LMJ(!FbUBeWRgqPsksKo$VVJ+i(qdqtLf zrwbK36kR^Q1E_@en(26(7=yZ@#0J|R*eI--BVb*n?n8agQ<_a^n@L60A;1GNA#x-i zVLW_4cTe2et>=_^RLJ*^RcPr-ZTRvBK-{$o#<=#p_{Zr>9vXI-glb7NDYs(YJU#Kf zC;V75Eyndx8`zYlci#?R901L-2~m%F>oLwGW?$19tKp`EV11kM7c*9J)BEzcbt$C1 z#N++10q2(~H|545L%l;YBKU%m>8;wN{-2+wn&&$Xw!966g#THr_Dd=ut9)8-j>J0! z&>`sCtB`VtMO(XTw$-6QpGz{Al)5T5AS;Doq&NYi7`}D0l1aS!R1qnbJ&oai{s41kHQWC;22H zlQ29~C|o%W2RK(CpS}Lm7}Wz5U^K_vtCx|Ke)NIBa|>)jtjM*_6yPFlb|2)K$Knpq zrsfCo-%9zLoa&aLuQoA=n?hlee|@thwLhH$7z}r5))m>|BDU?0+Cl`55p;82RK%oy zGUj;Tuq0l@ISJY$L$C2r>Da505<}3i^TSvXwOT!Cf+vZSIIYt z;NImX+1*trG?bzO?B#ha1(LB0}iud z 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 Au22Ws;iD|gJd^n{? zF;ocB)HSYGN}!7Sbx1w9}SYnK~#{6>As=D~Ae9d^kE$LVzEx zaMqss>kstJFRlhLM6Tdj_ONUSdbu8F{5v7-gIf+?HrRozdHD-BD-6KDL8kY`@}<&$ z=uhv9ev{z)DJ9;&fTlqh{DM5_Tx1R9?Zf5Dn^liag7s3aCR0QsyBet6K9EK9Sv^-H zunkGfl)g*aPI}9m*) zt+)9vKI4a+r=hy2+GU{#eFq8I0}jRU!r!MA;ud z;JQiUF`#@ah@k}Z z$K{Oa8rZ~afw#8$&#>B;pc8oN3AZC>QxhWL*LN+?Esm(GyGu@s%(#ydRS`M@>oYJ7 zc|RUg%oW>A_PcDo6dPlgg4+$()Lx$f>dTc(6CY1_08_y=$lZ^|=h=i!RZzUOiJl6O zH#gz@a@y`6L-R?Ar469$Z+fDvGnyid22Js_%a$(rSRJdHnm5OGr(|JuHNsBZva?e# z0{LA*#+h|t51f(JjDoKNsQCc;^U-hxZhG%V5g*R?hrp)|AKF8`sn5t|6TD2TV@|p2NQ53x-l_7_k$Vq^%2gYf$39cy5rh8CFL;%GedNb;WO+_?CU?IHSK#Hu9|X{ z4rwiFXufS2-ch4R#Ld!CG9vSO4{$&&?Qg!n?zc%r?G?0F_fpxCSEmKn?Hz6cKU)n1|GH z+(9#TX81j}Yu9R)>+vHk*5iQZt|rnl;xUeHH*fftsvcS8OnNM?-do)c(Nu9MB8HRt zlpUID>U3?Doi8V}>#6*~1!U0ZG3q)|7Z)AgtXwc{{lcljc|ZoE^eIMNW=u|wCb5&J z$h5bWkr=^U4wzm!+TgV3N@(8Ts~WM`<0FP6ktvkMS}p(P6!4^{&!@2BfMrjJn+B(8 zc09Z|;c*;XAGXZ=d^aSJq~h#DRO`AxmiU!zp3%c*<&rU`v}gYM->Hwr0WC@xB$0Pn zXU=BJJIvYHl+HmaL4AI z82<0_e&!OawV;eRcBm)b5x`{qqOS9Apl72+U!pm2X`{qq-52~xGR%?4!>!&C%G+F* zb^AdV<|bAyZD`K_NlK!sIS3bajd%iXrPSVXQrtmf%h_+Q{x#;V-&X0On*C4gwozi4 zw_adC&j?YFHbzC2pnqg^K+gIiSI0v4!7Wpq|Kr?stUXg&IB-MYs4^=s#6BH)o`rKA ztMNvlibC@#o-_}lh9AyapYb6ip!0$~%Jx{BGJagw|98BYyaKlg@`bsBPX&n5EX7Y| ziJ^zip2aqz`c5zJM6_RDM=>8$VA58E>+-A|Q6+&PrP^!pb%rwW4;l0gK5UIOC9s~t z33=HRf(9x^{8yB0#}g|ZV=W|uuoKrS-kvMH9Eg=Bj}$mPr1xCSaB`z+a%|E*OHJ|U z`3PW#NHV2>KpX$zM0rRi4z}M~Px!dQgjW4#4!r?^H*$Nn532#Wklmn1RD-JFncxxmfzY=8M1D?l8*5ix4JGunSI)?gqv%c z5={(be}ljE$`x*;hPFnPcAu)6^i9oWvp=*;yQ-U>RE7nPJr^|x5Z--_zH>9k>tdom z)pM zmbM({G#fWjtKCbTtfLw^tXB;r3#Vq9SPT26{PowDDDmW)n)ua{s_Wy*QE9YAFMOJ6 zP1}KNWXR@=S+Wyzu%5BQ2sB(ASHNR<*~C?hn49Cg8nqclQ}4!0=6^pCm>p{t8}I%| z_%e&^Un2k5+Ud6XJC$|gh_$ai?ZdgHA}uEI%PBk;)>->*{uLsq>BI>j^krMr-3QbI z5NJvTS`J{xyo3|w(q@x3jPZC&eO)={)kNUE-kIyHBflw82{AFzmHPVGRSB_ohp5-a z`41t<#AuDVF?GfaoWy^MRtyh$W{xX+wbC+jSaM$<5Y|d|$1tS~g}6;SlsSKPKtJ<0 zu{}oD)5QqvB@CH01(U5!nS1&B*)Rvg7pk!6Mdrh`^`DDay4oH*6Su-$Q2l{g(msoE zWCwrX@Y;W7L0;#<7&)(RjYQwlW93cM2N(VjAmwJ+j$^#DVCj0{p1Wi5JSD!lQKHST z@F)Digt!cezpg&h;FAVtpsVB&b(83Y)AdPJ&Yn6<>+`IOLl?0E=hG&S=}Ov?Pz4fnv6Z`IgiIj9!h@nC_S}6J z?+`aZC_8$)r<2`{FYb2H{Gj5MVhEzr^D%j*od0ZXlKoc#U&85)4(d;gKdJ0?Yyy|9 zfwiU0TYJr$MK@GBE+J@xwoqfN*(>xb7nW@~8&hY+l`6__^YnZC0KIv!mVN5vQ+V%L zy{*i8q}Er&c`jmWJgi%kp|HK~E1E0R(w&UP?4}4Zl~eU^S@o;xbR8X&$^V#>$;NXws#cRII9`F@)X;z z8;?*!EeKkjc#rLUtw|$bV+zkqiDzoUm!(gN*O`V5UaEq|`nMZp)6I}A_k%AsLwMZv zqr_>SE0ii*iy~~CPm{jdJe@+hQkW$ej>+&oE`JyAjHD-3$eOxWOyr$}!9s2ZgI3{B zgvuY>^QnE@sK?iyt*t-ft7QBaJSF!7m+%2m9=Eg4WVOxc8!+U*_u~6XA=mNgmZ3U) z0A@b8;8!*$NZT(jRCbxjNO=DqS5q3DQzDeHO=(GEG^JIMk?<;Z;PscY$pWAAP%LNy zIF`?q76WCjx`2eTKF)Pcw~Ei4cj)lvo<0ZpElE>%!$*wKieH^=JEe z_zEAl^mrD*fNg=8*ET)9iIiBh7zTG@L}118g!ZKvaKvKybnmZfU1hO#@naFqD29HF^Q zZajw@?Gbq0v7Gozcpk8zFlHcOZE-;wu{ZUOefhA)YQY4GF#0K1it#B zvgDA>nj!}Ljq&+#?(%K$|50?-QBA&m7)Mc25fGG)iIkGk%~X^W5Ri@$l9R3hgDD6| z3rI>xOHOh$lB1EFG;D;#U?T^N{ocL*@0^|O+|T`d=tVI|w-MfnK~Zd#cdS6m6IrTgpP~ zF!B_(>s~#K;)M^q2anL1@@=PiJ-o8wEYWq(LH>rMhQy20b(|!qDvt)}sE+~9+1Au# zow7?5xG*?CFv=?a0vr3D@^aF+QX-@OO1H@%I-X)-#g&XU`e8Aw*YK^eJ=go+@*5~% z5la;yzo^G}5vm?BTnH#Pf{qCu3osy`sVuYzM5b=M7Vnb;qpsa#A+T+gm~Q zhoxxuh&2!m^xX{igwpFWNS)rIg9p9Jw|PiwMzSfAT9K2SbM(L_7s41Fg3he8o~Um< zFFE3y|M?$9_tG^ocg_#Q;8!8W;4&K&)FWM?q3S#Qg!0ZoxM|0OsrvsYq9o!Cd-bW) z8cp{aM&wV6U=Q4- zg2iZ&jGz6dEX>vHNs~!tv6e&4+`J)O{!jbw2c!HhMM)?Hk3Qv4=W3!5uPhscHFy%v z;eFrx%R_%k;ImOj(rhO)b1%vtzwKpCt%-Ow&i3%DhMbLhr~X2o`Guv3l8D0B-$tp` z-?iHtoXWE7pFvEpww0u@^c9_Pu36{{&Ngq0xe6f+4Pt{L=x)CXz;sIz^ek&5UA&); zg2Q_`Ps_}aG@kBVJLtVg>-}JRC*;By@woxZ-c90--0dZKO?Iic{#fE612q%`zj127 zBSMfVdR!Gl4{I0@l3E9D!RLO@upL}<^o#7VUzT4q-S|Ko^@EZqR9b`6R^Jh?G1es5KKEw>Bx!tRTxu$wnW z?oVF6ZHmjE_u~5{zX91&ekQbqH(R=Gkou~@JgAcg>dwVtu2sZLmhWg+<(+sK2CPPP zD^vG`K0~0$ao~;3oQQ)*Q*RWj0{l$Ae`TQ@>-Nt*=P;Q#TWL6pc-=khXOCW(V^IF` zy58b#c(*zWEKNKP`h!BjWa}WhLv)92r!pX`VNqu9uW4`G->V>Fk@Q%&O>0EqwCFwy zhr2%pU|nR=i8NtsVPsIu`FNl59V z#001+R|9$>WLQY!BdfMg8ep=nVbtAC3%{Q9$%f+Z9TwyZ%ZxZj?ovh}PzaF6>?I_| zdZ=V_aYq>XA^LKV3FD65O^~2^P8a&ELl|G*!8cWORFtx5L(So<TZhltI1YzLjz2ufN*J1Ydlz{@}tV`aT{LUQ#@gFua!b6>5c!n8J{c_M0zI zxO`*v^Kp=20#(`i^fHf2Jy2naB{7geMpi~0?hcN@4XcOzR0S;Dka!}p85f_2Qkj|D z&4Rv#xSBa+?YJ=Mx4Z`Oemta8!Yo(6Gm({4a5a=X7%}{oWPgRm53G?I_&Q_lCqwP- zd=EeKF8z;U##jXaRtOsQ;v{<2p3}N5b?hHa37{s)LvJT_AK@yt%I-(31Hgc3%BiD@ zRJlP{^*ZfECl_4dX$l@e&g`fr0??yAJ^xW`Uk`}Yoi0U0uKgBdGo1+2{-|-@^?P93 z6i-+%#Or-2O7Tq|_2PN6Q+goIn}%#A`Hjyx*X#)K#!6aLV}DjFTqJ|F)$lZ(5e3P& zQ=O7k)BHdgSHN-Cjb1J5;W-h5IbRcbr%(CV5X57j2Kej}{4e%+f&Gq>q?D|IR8UH? zQRZ2o{a=5T`b)Zd&KK=ruX!W}Sq4*em1dCwRe>8@F$-8hTqCQ+2CD$@%5^HGmwrrE z__D}o>B;lw$OcHmGimNh-V@Xm=~}&WM+rO{yHAv~WsPw37fBS8|IG=!@;#+OjD@2C6?J;NUKMsth{@(q18qDb(@5x&f`XG#Odlq-iuex(?2&17+g9K z!C%WX|H1Q*jmv(zTvUqhcTU>2tQA2Dc-@t3xU%n(@wjOJlr_D(+ZS9>cKqA z$Ome}Pu7wGDE_i;DeGzBg#hf@f$p~Pb_t9r-abb{0H56p!v^**(ARFfKG51%+G?s; zva3HAtR$lJ9>D*&F!^Y4yYx$$j$CzV8I+%Jg$8^!My0qYe2(=BOnKzUXQjn~&$iF| zjgqf~YP8^urvEfx2E9Cghw)yHA~tuYSm9h9?M)NaMPb_gE)Ov-Pz;dN(!5%Mnv#y6 z@~}v|!9$-chc$mUxK?Gg@uxghoFT>_6~mccHoKdSQeo@>OM@QsE0PTJWGVB$lg};N z7QA7-wK>W5wHd4T_?YJIs2ic1u&bc0?p3Q8k@RwaYJ|#w3N>F-{UL1t=DbjX%JgsM z3G?|Ij54Ov5cN9S7e$Ulj7HvoWoA(8M@YnfA%?*U)BLB=P!5G~0n-6&ojT!CZ z;4kJYEUg1S?Thl7-7TTl9MtQXZKhGf=I*8GWn^zy6bDVC$1e0YCvxNc(3%FLv%G?Q zq@63wN=#RZK~u8qSFO>Fwan0c@m>9vrJmCHQLk1BHPc6&>d(PW-72gpR;^aayl;kE z49?wt`(xUj_*hEC4GSIjVu5tNG=_a077Ghlw*^iA-xOpiK|9y8hF08uI>X;?l(&_; zhqJTHkxDhM7DvK=9V;I#f3GG8X-%(oB+F^5a{dyn{*U5` z!Qvj$2eq)=;c*E*oBif1odz%xIOC#T?R==cy6c$)Jv_6!M!l!3Qds3{0%R5w#d4}F zoCbUF7Ddwwv6CpL5A~qNV&sfBn!o=LcUuftMb@8>a%ae<&0S{fA{qPtx**sJq=ddq zV>|^|v4)l5fiSp!yM^f z=W00wSF3?s@^V}4-iR8P3&!F~=onEg*v2WF&U{(#fmPt+m9t?E&{OK{n|qSS)tM6! zl}V$5UTNiu+i(w_#v1(9WZerTukp<%hMU(~r1vDJea657=!R81R|Z1n^oZ`)vp9#& z89FrZCHU4H;9dNB18n&TP&jH+rEu}eRT2AY=a0Jk(9lOpK@JShr}GOF5sru4`nuHb z1R=gzr$MF-t7KidqyZwwY!>~2Va2cULJWnP@0cX-vRsH-QEOYV(o!uoxfe)7Ul&o^ z^bbigEOAf!$*R^Qlr(<))HiGFyN3%0zZsjKMxo)65Uh@Dk0BGh8-TY+W1Vy|yUW)Q z_{fT%oV(K4o`ShjfZz{+%zovPr?_r@r zBGcx3<5{{R8{V>9#W6T=L_t#52PAr8*%T zU6SYEP(J=1XLj(cxVXTAf3ttnrf|!ff<4jJdQ*IDjaEZ;WYo*3;Ji#|$-*Orm@vL3 zmQYC&B!>RkQ_^JIY=XY{i9CfX{Cj(nKOl;{rY{)%B|6@eFV z_l~-;M$YoEMcif%V|@3)$oiqcGzufuv3v{acM?z7z#j}PYUSAvM??oufSOX1nO~W5#Jm*a$~~P z3;-nWKP&u{tPDQdMZ;o&YYs&7&S!%xhyyFmWEkX$)i4O6Bq9!fYP-cMZI^H0Xw zM$ud!7(mk?#xNETC>XPlteQH|udAjo`#JAkeGdQ4$nE05B5TIZ#5l}3s?0?K`Lm&N zQcCAuZ}mEfe(B3uwLL~4Tol$&)j-X6R8Ai^^2X~bcXrvd`u%?t>cW~Yrp0-W2TnHg)6q}y zuLtYEe#weqY7l51LIl^~5)<8sx^)&6uh}(JmH0ZILoPd(XV!sCebsrG%-R0213g5O-H@o`0}VA# zy{VX#ZhmEUkGX1IC;R3A$|Hd5rLeH=O}3honztoIm8U9cjreaWY$)tO!E8f3o%s}> zrkjUv>ttssxOZo zJ~=dGX8Ms~LAO!Bag*D~G+myo3O*p+6-S4NttIX~C0|{G=n9YPgatHhXCt{GOe!*6 z_;*@KGvd9cV$0y3pj5}i_e(rHZy+yng-J;bG4GzqxtZ@(IyaWmW#{oek~dSb_Dvbf z`$6ug$L$N~tzHozx>p>si!>06mabA+UhaVgyzUrfNH*e$lH---yFeIkw#Uq+U2g|E zXO&bi1u<3N!;vU$-p8sxHHAHDD3;+f zEGeV=)YfN2MSN(xsKar(kd<$^YTV|kpwlUy8RHREG%eP_>3ngVhHsp!Us5t#8tUvp z3<)(QtDMqK48obOl3=TOq1S5bXPMC^VbUQWgBf1uO6&=ZL9p?p&2K83SeMJ^-ky6b z_JknRG?47Aa0h$_l2PL;Yy=Y>JmXAb)LMm`in5}ChpZt21&`x~KTdEsFNo(%viD}y zWT5!_fcFhcWA5*+;ceW8%fgnYJ%`^zcGo+{LeEQq|_@ zp5MAA-MwS|5HI`r?Hr*{r-8cRTctz31M*Qdjy4#djhX_~9uOZM_3UDnWRb=lTvJeO zKPN9Qn#Smg{Ir#xp(tPTLb>jQyK5`{7Tyt5x7r`{t>CQ1s8(E=NSvs8F*?HB=da}7 zu#4zmi&Sf|8*}I6!FcL#V3kc%vhCWSJpw%~UKNIm1~X)zsTfa3q=QRW8sqp6jTWjVYx_^{0CA(k@$(R}bfx+QvqTkptT2#$DH#WZbrX@ORK( z75nL3*IA3z3HZ(CSmkD4t|L+;%N8C1{)xJl^X}fK)=y1ahj5j~TXL?Uv#GCD=E)AD zn{VDb-B_;@T|uc1B7f%ybepiboiuZQn;F_Vttt{dxN*k1J#h)WxrHmP&^G&SYrouqxR_K4~-OW zi?XxvNUe)|d7LMk7#6uvU;is91#V{d(5P<1TCWjnTA8n#ryVaVQ2)Op4<9^`d?j1r; zvVT_9xh(nw z4C}B}RxqdCwdd56u#?^IACzAIn2~-+W_&!cbytoT_spb zT$sy_F5{HrSjiLY-P8NF%ihi2v-2@=j-}_>7XA??2^Dib^jCqnc+e561FX7H;7WYe zFzp*m{kE=u_7{BckqztcwJy$QA#}x_^j70!sTY&8vD&qdz~Id>btrA;x=A5HyRR{5 z?}3Z#M8iodJnKC1%z2Uc`($Z>^Jaj!m2;@fFYORLokX4HNt-)Pfj1sKd-?o!PsLAc zN?vzunnDTJpEAu3EZGz0w{jp=>iln9>nc};$%1G!w|4%yF_eGu`Lu{*JMU{>TA*Jf z#cG&_O^`qQIeuj?^(RpVcc~NN;r`xvUa9YK>%I~#)sMmLKR(v7YjpFfmNm0B4Z&sA zkugSYZ(ngeD@P;NgTO6p#rS^#wi@ zMn<P&K%u3bt#<=F7bm5|IWBy$zBLtG;uMltRRpo^pZ;BO%*rBAx% zj!CU~bOd{3qrzCGhu_u>mv8P24qxOST|4-DX`+l*JbjUf{@i0U+1NkDz@;%%Ueh0V zij)?JB?&tRSU*m3!;mdmRqKz0y|4)nvN;0!gL6}5QZS>o?kjsOpMA{hsG_I$4ZQwQ zab;i5`iW;`j2)W@9sR`#I?{hXH880`ljF=;%Uu)}zgp_lE{cB{sk~;%1%W%_WFz;8 z@+InSUOz2Tjl@3*S2U$8UikN!prG`DFg(M~&gL>&Q96u&>0#$n(Pmba(v(E4o?ir` z;uXTD!j6t4p5|MxQV#l`D+OPi!d+&J9%nEA+v{nXniaw;v;9Z$dsgLfz09GyhXUjI zS&3yFPQCdQE>1|il-N$D=Vi)!Zzev(iCIY~Xs_$eqmjzsKH{EnNCur~EeAZJcqaZQ zAu7Sk+?sE)q;Ycn^Yc21>d9XpdvGM^mC)_kZvxJBEyXOlvdJnUowzPsWbJH+dOBP9 zudmmCoe0d=x%&s@Dh_g^#kvoh$WI9X3gGcPMBSL_sn=%CiQ|0oxl0JWlH*b zhvk=*K>b7kW%9P7U9L-WX$M-(Lp!5xdtqGzZK+-4>ruM=&FZ~Shss?7PfF#ngrxmF zPtjzr44yc1O6tD}NgYWy51EpWeD5~rRvu(DM>L-Q27BUw;gknl1x=a;S6yE$g`wdr z^Mo{#OxBH-OBJowyiCpAK0B8dzUrJ1>GfhaEble|-^|&OiEduve#VGcJNl|I7VKM{ zrQt5NiHP!yey<-fX5_VNDgCr5xa^;Oi0*LD!P@!woKE~kg{As`6oC6GTU)!xhQO2M ze80k-WOYBjp*9J|ct`g4&Vv}9?QJWrWJDHkGP@7Q$nPg{jW4rL0T}CGH1_#8nmyuZ zJ@d?_veZj;`eTT)5JxBNRb}ci;%%HqK6ZsFlxKWZd$wcZpjUW6f9~ADy4VDT_^{a? zt9w|T-(sS1s1x(?4FxEUw+bpo0O7e zihm$soAW(gr8B~>U;1a`Pn})z$n^VGcs=Vb>_MoI4ti8~&9P-l1u2wyOP5Ja`8HMd zRS0;f&E#IA6ZWqCVURnZzr7i2d6gHn(5tZZz1`O6e0|Yd5~XxnH3}IN%^p=AU%3DE z-4E<`jFEttb9S-68>`Evy>q-5T11y!QEt7dt=a3L*Q4`nC*qNnDK4SRzCbf15FA+A z)M%EMhwdW>*u--C*%lW;o1@;g3@Cuby+<3EbLpbPKe-YKXCPSLq# zHSsN?DG@6!G@N2DCRnV2-6>6I7?1DQ{e~H4N5Vb5le3Kf;7z66bk!p{1#~VQP-(D< z>A)&ErDVoHxns_X6hfv;nKS?7r8y$2&y0O|NS7_n*jU+6n)LM+-fJ5~H*nka6JZnp`8o2B%znq+oXwHwOcFu)Hf%Mra zDUU=3fsmM^@wu&cc&gq}pRQ1De0n74-GoDYwE<~ZqahLN>F)SCiTf|@)_R)dNAX3I zHqs=ZQLoG66OIr{zWmy(szJ-{8GluoPwlqp-(SZw_`3@bDCDWKP4c7H_WTq8W^gLD zAorZM+?4>IaM5vsccTM~L7!pSmzZRILtX9jbiv>XaPdro)GDeTc#AqV-lx08zY6T+ z(MFvj(f|Bk&#<4+M}_bKtTlHrtV`e50?z0<=?tV>c!%rAafho^HXd2@6u5u=?8t7) zvS>?{@nT$FdWxt@i0lv`*!qx5go)9g7J;#wzXRl;wJ8Z}8Z4*qFC;b#q5)18xkQWU z3d)}CP)1B6Tv~Fjj{Sel|Dwud@^ovfZB0D*M49Kh-8FWX*2r8_p#3rsL~Q+g(dH0T zhMapngmv?n!EVFfhlo{@7r`$oNsl1S3vVaVhI<kstU9pyF>J<|Evf7-k|6#8&Wj2bHv(<$26m~|Wq-j^IvX%@8n zYusE7_bYCxn#nsUyGX=|oigKrSc_6iS1#5mDDYOIYwm}vlF~Bd4dDpcqVnQ5@$Q(2 zY=Jc7qX*%M9Qdd`eEz&ETWZ8KS#Xf0GfWl(go`XnHho}Zr=O|5Hf-lH!yLutDNmIq zc+yQKLiwQrICJDxx=*!BtvP3s)(yMGfm%itN3UP@fvfkuETw9i%rI6@&<`T!C)^0c zyyLiS`$CgDemAiqbwQwp8L~AF33TcFoXbcs*)%7FJ;)#R0%RnCEb4u3+W3nnvY%rp z;}U}Io|Ay#9gk<=^#oC<4mh}|RSn;bV(--$PC^1>;MehivmAD^|K`^8BLf(McZ*E~&V&OFsw`g}-&EM4p@r)Df2J@G_0--P2`>fY#Rf!U^+DiF|XTz>@X_A$1)<@QDH$ zlPf!>41RT0tQ45Pv@{xA?4rWa7_MC(|1QEsG&=B^y#0do#nn9_ufPpS^(JDc+}OyucS=LORZ(D%{=Ktgmf}{OmMmL@bzj{mcN|! zuigD~S%-G&NkVf{zKfWBZLuql)mBrn-Rz%8mRxinIO9OArDNO4wwho<_$3|T)r3lrBFI2UvFn$F{WaB9+T5QmcAnldw*DHaDq z1EQ6LDoqn>c7j6VQ23>u=12mu*2+Ylqgq$-?ld9&@|G1;scF_Pc%1C%d{}kN&h9_G zk#fo9m)t+iNV8d)RJ~N)r!jc4JsKKDz8(aD9>L>bd3C^^&b!O5>D0n(LV?ZM6>8ls z-l0V|j~P!7$p8Cl5x}+P14z>^rCt&sZED}dyVV{rwPyMLX@3oloX^(kXtY*@;$>xFisIabM6B$c3fz$su7Hr&6h*Q;R`t#kG ztRyPloek~`W^7y&rhw6_bs;A^i*o`n$Q}Tvg*#q0oOlzi`uH#_EgI~}4m=PDI%-!x zRlbTN2@1zo67LYe95JCzlT~WjJ!F*yE1dxZF4(A_`Qk`T>`0+7=EoUg8K%fq8ZO!< zTevXl{bzAuj9R4ow|^;6u$jc5Za@F47!hUgX$@3&{y{|_FpQe){Bghn>tcY}!M{*l zQEA}QBkXKP6o4`N$-v7^FP7d`Cw%k|Y6r^{2q{-2WoJIIV33_Ef0VmcQA=c)^m`ql^&!0Bx=Vk|Mf zaGDDyctv*Qg$a?!-YM7z&_}k8D0F{Q^DLAP&B7BmH!z{?;Sks=xJS#Xoo}1)u51sy zwIp_`JM|xhL$eAu7*tQ!O^y?&mHy+{h#UNK0?D7^p5b*%TCy5tzr*y!^U>Scsk;8R`(KFFYTnHQhEuG?Sq_A3nnG() ziR2awAippi5Y?wWZx|5f-?Cc=%gIGzm&uxf8*Bu2PZmB@4E^*P5N+36b~+0Ej&D7+ zzxoz>8>-XxM_Rsv2U6ubEDZOD6-B{yb*u~Pd2Pp^KCZGN$;Qco3RS>;4 zMhB?Zf|#z4cB^Nv;-{+_ytz6gpU#Kirh4>qz+pQa*`51@@TolB+o7ec1)TZGcC&G{ zH@CD}Pj2u89$oRJxB1ZUyVXhai4mSfW70B7r&Gv+#Bs%Um8e2R8Vgk<&{ zT4r+|wf>s6!A~@#u@i15^P(B-MG}4_C2aAUEL&4gkmy3^6sr0&@sht+a9^RSe^jOS zlQ8W0!2ujMFyr;9{zbDzf;kh{>Ju~HoseK8PQuPXw?boHIoYIUb#Bqt{0%tzR3(Ri zWJPzJT%`hCS`*n^gFGULwrC41la9?}f<-U2peld7%8R8N>&yvnKHkkPylxbEr|kD; zMhqhp`~CBL0diY*cyw@{O|PHjU0QfWH|a<|AC93zvbE>QP-i6l9T37mLUDLT9@y-C_C{*IAfM~TU)C!^|dQ8A-#H#tVLjXu7 z{hPS0=;4q)e}mUKQ(l*d$Fe}LxUX>`1 zf~|fB)C$M?1P0%Q5oE`HVJjOyla+8 zlq|I-?5<_iq+zfi6-gk5x{c3eHlJS*nt8-W<+fKPXZ2-SVjY>u;f4@ynR62MzIBkNgeScJ~y%0tqbM3i<`9sEbbJ> zl<8XHgYw3=`T@~rc{QN^W~cz3dJTJ;gdWy*Oih+gbwC&cLs^-ldB_tPc6Vhx#*JKl z0)B0LJ_`929#@k0B7xnhv9>b}BjjG_8{;4V4E}s0fJgdr>Jm)q1=7Jh$kC*@SjeSj zvWp0%N)mhyn`ne1_ImNPWo*#lU!ALSK37UadL#gF9_h$LDyVvjI#P}CF>z-aGg?1TtKy`)>bl);jgc4HgLHEP$7^uR9X|hXwiVoL|f5b^!eTPqfx&8 z#@05Bi$O-?_qvo#RK7Hh1oF+pd_V%yR z`LCI#6PJS4+G}~yvyu>h^yS;umU?_>E}NUozIODoNsJ|QBEo4Q`Wl8)VJ6;wwE-Cq z5LbQKI@~AZgm1D#p#v<1RRln#BH(X??`ET_?{#A;z9$QA5eKY(05rcfM6X(A(Ha zL`jrSu}fgnr<3JB3Oi1VSIr8Do>4pW1--af>GBe+$f7f(cJ>%WdQ;83<5v zxKw~d_Gse8>v6N+%dJ@7PXpelCzB*(25f!bR=)jtPJ4S$`b=Q&=+Xcxb=3?N@%@j2 zRqBA2VA6l6^^0%(voxprmDIJ7R!p3m-P}-$XI@sNp=ZjC56){yT93!!kb-lp)&`9<- zc=Y^u4aZffUK9h<`N#PewhNovi;2m6|+VuoO};|r)P`cMNZbK4DAjjQ#3X#4kA?evlQhXHj&@JevBqcTOXL;yy%zH z7YIGsioP@?l)+EvXo+tpU=333Y6d8UTb1RtY6GxY^Rdi(13?lG#v8$NrD26J{t*So z6DOP;x`N5x#iGt9`=QoEIl_b0PI4dugV^Ig|52>TA#i(4$(C=@CC!mPTf>oQyl>-L z1D~FKIw8YLhjG`*AGs&XY+k6=c*cBPS$r+i0bC>xY||g{e*CG4K91b?rkv(nWvT#j z1U=Xx9?1EKdT%*!Z1AvWOGAkUOVaK8mL-toDvoTQmNpCI@+}-ZLh2I6013YY_u7pe zl1*V%2GqPwHg|cxu9yFM^jTShMOrSd%J6Ej-f_B=E$K8z1*;dKM1H+(-{d|j{P1zF z&F#j~r(@zS`HKbc<6U_a1Z#Hx20U}LG_^N>YanV*PuzjqBz^w&7KQ!eTBxeW8f-rF z?8S7$&y)1Fh;?m8{o7b zUJOaeDm}0miu#X&I+SncSx*QK(VNRQMX#ClAH}7PXi*~vbb-12P(ofAoYeSh@+3#s zO|_?kGg*Y@+iM6s^lakg`Z|;U+jlnhoN{n~a&>51rFdFF@I%wxH?v$J7>{e_vb>K3 z)B6a|aXD`AebPs&d`t|2S6phqk}Av9!i_AmW)~1;n;=G@<2b#GzfUkzZ6neFA^8|z8tPc<0qf9!^gAMDn6I#it5Ao-Si~CRTslc z&jF7ib*FK-<)>=Z%mlvgml3cBX@iaIm(taf151)zGS) zCwMtBZB&xPCTlAk@=@oC$1|fyp3w9L6b%u^>%?wXZ}KpCbp=k6x`cZ*hL1oNbdgs@`0CVlgsn+B;d- zvZn)wfM2xWs%AFw!u^H^<>STPXF?-F7L&_R8%lJpt8KDqEOWO>y8hC?TD`}GPhyOn zi%dw&G+{3|yEqbrrj9}EE{vQQ|^AD4=RKDT}7*yX0K#kGb@b}c1?PxQe4_L=B(}X#)>0o-+#LZA5*n*Rvv*ymw(ML}OnV<1~*X?@5+% z{oTU-^j(4ozd%4MWjt)N{dadQ#bdMIjfDnlZOwpc$FXZ*9MBS{lNVk8pxjyI&a{{x zHG8}yz%6DUO-YwEfTU&A=&q(?-E8B+^k#X@o(vB!EZH3fS43Ca=B4l!@>U-%{_HxK zY;F>*s)8GAykFY5|B~VMQi6m^sy4`_L0Llw%<~v?qmHIh14-FQF!@k1q#w`vp+Qm5 zo`+2|2iO26!bwj5@`wyaT`GKdrcd_e)&!sy9u*<2{6cC}Ynk+VsknsMVMGIB*Y0yx zlS+uf?U;JkcEWF%A3C|CO<&~7h^ zasF^Lb>mcFU8JfvnW|2&1rI+&P`M1SlF{_S@J?qyxa_V+6@)Aq3275);BTD5R?b^` zOA4wVaYf|@k`>eMSLRdRqNEb3Ai55dCn7T7)I{TSi)InwC#-Kg?%R*a9OY)4pkUWU ziFEi*^h$4tiRLuCLBxBLr(`F{x?rLH@7C+9nO?yaQT7dk9ypIY7&6o|RBC(}A6=z4&k=V{w96}O3$Xscjz z1*w+MyiJe`TFvfJX3Tnj?ftgIRBe+?s2)MSf+&nv9!;nqM}oYZzTt0juUrl&bUo;# z$6spewPKmbcxz$Iu;i0qMyHPN%2HFuKuOXQA|*b(TOd*grkbV5nl~JC!NA}6HBsGi z6?6Hw@}_<*pC%A8_}5lV@0?h1Tzl{~VOhTFpmMFLF(c5xVkFar;)IiqD|IWB=PF%^ z5-smueSF0=hJ4rL(5z{jnWY%gEL?S8j=hy+w52EFVJf**M|(dTB*SKM7<{$W&HT%H zd#pk{LwLAH5?V^u5NWwhDu1i2DQ|sWCch&-c&mL2Q@WRg(Xr^$0Y)7MO6!OX(_%}7 zECp5MM_gqeZTAa}O2Oua`%x_$8##GVe%i>oy5#+>(Z;l8xzt;mZ$~IZ{!#JbW46*5 zT;`Djvt84r`cvPmu4n~?&e@#jO^-glungD}#3sh_C$N8W^tutXAK9gL!gbPai-YxU ze6xnYETgc|o4xqIiV>_NB~dj+lmiAh7pxPdb!nYfu_8U~`6SrKc_e|rD%kacBd?`L zE9Uk(9s7oTQo?ggO!P!!ntV}~zhYA;@1RrQM)S&D48_sK3D=B= zDgN%tc9%7i@%Js`+w3gcBv_7TGWLPTy~>BsqImLz3T2*%#$Nb(WtjNd+*cpYga1ci z-Lw@Izn`R1(wOaWaN=xhF!J@V$*r}8)UeCN-kkAQony*9S(^LB4xMhpT8l}HsF>Ed zw^Xp+$UB(%K^tpGa2cq)$Fs6h<-;-8x_>43_0(B`i*CW2Q=#U2Np2E>lf3quP8%F2 zqxzsPUJ#W{Rvu^bZSVC$d)|aVuI6n^T||}j@;{TC3&YO3Cc|oxO4Q?1UO+2p{3Cy(B|UCYe?A*+o& zQVQtKt0lGjJ&gp9s*JMnb3qNxn*~Zt!V{2_(H%Dl7>(2_yV|Mh!p~SUyEZHMzU267 zkVyz8FNRGwDa6YI%=7w@LDL{+>K_?*$KN55IW2RJS(L2Ti8E>c(r3%A8{@7LoLwJU z!+6;bUx#jmP+CViV>GpCx}S&Ih%c-(DE6f3S86%h)P|`t0e$_t7=_6rW`*b?$9O}I z#A3Ja)E4pln;2KMiIRWAH09)oPf<5vD0E{uUv0RT+7_~GULiI2oWtI!T|KaLG$63m zM~6pT_~)Yi{Lk$y3Gf+c7r{dKZPPsdhU-{Yv`z76PwzH3?ca$v#Y z=jvtdOukdlS@e;uxp=?)1>VF!X{f(}2U3!#HhI!yE>F9elwtGKsv-`iQ0TuhZ;ZXa z0LWM@+}hwN_6~AeOzM)@UqXDPHqMKHdU!GJMe`b;-5UzDO$Aj2t{8a*M1OPcXZ{u- z{I7%2*-xx)QI*$QL$ORs9XCa zp3eV(FO8|6_qn)S^ajY(gp|*#MamqpgWZKVCQ~F z9B5n7Vl29H+R5K%6Hwalwg&$O!ClSkN5iuI7|ZKhb){`F;X#+e%Nk$Us|tIfO!a5l z{5hhbDS;6YX`0Wvs4l0{iLvymKL3FB)6(5t5+20gec(jFdc8*sd}3Eirw7ZY2u z5GaG-g5J%~xHg=!dpxe^iqCtfy1p~@T8f6cY>8_sC1FVr6;1@ol=6^!G-11xeYo)7 z6Qpa!%Ty8n_AbLj7Y|)#D_zEYpr~tPD}0yD=}RR! z-0H(V*ZJ&|`+t#PL0|tOx0ahTjyZv9sx)y)gBib*=Jmr|XR15woTnE97uN!|HY{y0 zD;$&y(pU#*U_!w+9{DGt(TCe8T~cZ6%UmnA7}~J1>LU{vxp!Mj48bE3$x@);wa-D; zWY|2DK%$6NF-FrKER)WY?Xi%UW1y59=y(uwqz$0orMJ}kkAl%LO5)`U<2yGL(}570 zO!?#Ti}A=k67Oz+dA5R6RJ}v;4S@aR+NJc*+aDQtZhX~XwbQ*LUrAZu!WJ40#Y6lx zWeSzpGS!0pD8ug4r9UFeyF(c-`~kfJGFwq?KXP{rK|zh3id?#Y&$z#NE(SUR{42uW zKq99xAq?9cS!^oL2z^z~^J@+1mY3ehUOkHYg-_QXAXrbjHp|HITwn2kFs0Y`{)k|%vz5V4kRHOpm8R$gRW|CGJX z)!(T+Ch6KV65Qt_H3e;Hg{yat9DBDV6HGl{!2j8k zZX+&VLf?~nRn|6H{CCw^kxJ}wSK!)48}3NeE5Md~%lQ7iQ-7fMW_HMX!{B!DF&CA)F@UQkLjE z<)Oko4lY~#XL7)K_StXA^G9>9z4+p*N#-w~9=9C4q!z^WJnqzjtrn4~ET~=`=Cz#u z*wq6jh((vbPfxs|iFWX}Y4-`_MTO2ko`{;f>^d2h{Ygns(gko2Mit>Pzb17Qz`N3Z z`JwDIvxGBN<2S-9ZcBP1WkawSXfIebd^y<~vOIi&MV)*|?^U{d{CoIXbk{_gT7bJ@ zF_oh9@GvV_uHwUVA@2+Zym+NVxJC|aw8g=DuIT!-iwHtJ9n2H+rjE5yI;{^>L;U#l zlcnEwO6*znl=9+)j8TopJXt3 zWN{I}O?dXG=M)`cfWFj6OzufFor5GSqI2%sv&`pbA79V;Nqk&~z%!1;qRV7ua*g(t zE)ykWhoa)jsP0u(vd9+FM#WrFi48ol+0iNjwapa4LoVjeW_CAW;*Nh=9h=4-;Vjio zI?CxX$&ESH2!HhlahyyLoFm)6E}^=YzKKntJS zx2!C~*X9&73I|#B;y*ULq1BoEt0vU#H+tIh?V6z$Shz@B_zPJi0NZ%9$pE$@s~~C>U(#J8J0c3#8fp9!Q<*%hpy^ zVdkK_)VdXY&imJ)orXyjLb{Iy+a5pCo!T4i9U{lQWaXzh6n$`L6>m#A%s_k}j>e!lx8LkA`icVjG{9%~ z`{?!BYDnetP6}1gu?OedR#61Ts}LNbb0NIWrTsom5|UKx3d8 zQ8ghja{e|M$<2;>wLK-!qnJY@AgR@JvhK`QR|T&Nk|0x<>kFGVRLt2XmK)+h<_;Kc5!Mt$&cpc7d%OP3^^# zDhwT{NPmXG!<1Ufwi>{{0aRW}B=>jq9BH zoJ}wP05-S%`dy5=YBkfjF|K(+p6UywUNrBnsfsoZq9#MIhVdSeY}hxPt2tjK?9H!I z{$bOA8euc@9Ra`9d;30_I=C97<&$+(k@<5zf(Vw;E~XY z*(E{Psxm=4Y&E}9ZyqhE?IxYB=wgn;DG-gyLeeyRI#OSD1hR0d&8&bHNmPY*=PGqW zKJyH>NSKspsa)bttc6RORlKi*QR+7qtxvE6StCvwOC@+CianO^WBsy#YpwB?pPhN) zm=u1clH~w(#y(;fz`Rt3W2v$ zvmfQvIS_|d4T7}WS&i*Fc7Sh0lEKY{H7X*QmNZpT>%V?7HdqM%V{T$)C2YibOx;O4 z1#{UQ@-+C-4mE7HcDM}sk1ShnVs3Eu^pS8{+S`~!FTD)ak0)EF)pBmy?{jlLn>nn5 zdc!qywWfb$#z+B|r9{(Y4)_^E_$n-Vd;>D2ADNgp&Ndm2cs`oqU2ZSQv(+|xKPfu1 z_&3)2n721L+&8K1dZ#yxE4AUyFwpggMn`!ZZGzoq$i%|q0kU5oa)o|Sy3;O?d9cSN5oa6m1MyuLjI~Ke`D|*m!MvFYnvud-CZxivI6U(9J%cl5z*@S zWqMZmTVWC)-nS{SAYhDH+JY3av}@EJ!^Lc2OymA{?)w#3Hfw{og(igdVm7sOl;vGq z#`Cmx@GPQmdxbp2uyWU^@z~k_gXM||qQY!pDY;I|7x3%>>i`!&rCZ8d$J^e29a_7v zksM?$4@!2VnRN>MeQ$@^J%IrNQtP9h-}SxFw^xuEdz?BNxD?w5$hYkkcNt1uY^c&R ze>%;u@ACXTf2H7;^x;mldgoxj7(kcg0H^1|ImT_kwK=q~Ctfd>Y)hZTp>8B;K65}Z zUd@p+agmYJH~N0*9;Pmg>JSTp&2Y#^CE1hIar+?^Qu9J!H|x{&V5-OT9@zptcus!3k#R>b z#OE}4$H{t|_V>P6z0PvS|UhbPsP0Xdc&#!fuCbqF{U=L zsOgB>w*2vO6nU0pF4VEgdPu!^kzHJ(edhuwcE?#cQem~4+Kb8+{Lma#@vh7s_>!(l z4g|+^0Egh`1RbsT{M}~rnSixwlU+LVfen+x^~&I_oKtR{e=BpPIQI0?-I_&HZ8sqB zv7q?~FL0!Ya9%~aRYk@gaPd7r$ESAZw<$9Z{)JXk7uCLXogDOdWk_L~-%2K*eu*Sy zgg0klaa^OyggD{q4SzZDu^^ZaKvX*+APcQehqUOenywd4Pi zf7r^(N^x4&FJU_}9;6@5sLB#nb$qyxi}42swbTFkk4)W7CbPLIE3KKs^YyLU{=5w# z6W)H3w+Qp}AtQXs18YUd5Iqt)gu(cH@*>MP4L+rA?ze{Ey;#dH&@IE0-o8Rk6K&H0 z-*jELoF8LLUUpvfV(%SVBo$T24`2bo$KE?Zj$OJD0yxB)a4fom5^|m&6sa|Mm?nCr zLcW#ihpQJR8|O|g4l4-Y>}mn_0Pk+MNF@SU<(|afi<{T`j|_v3n44mM8Mw%x=ruZ1 zIq)BuP4awShvQ+4$7tCrF!pCa1%2k}_eEEs=7oET$*$+5FAE~ym&B1)MdO_-bO0?6 zFv>{IIhZWaRv;yH|L`bH&XL8_s{KiPA-nUz`H@;pOyOyWJj5V$<${BnRDNkH3A-pM z;*Uk5h_jd;B0X)d;6!6p-OClu+GKbjnd7g!aIjj3r68nNR5Q9JV{DDQteXB%q#>Mk zw92J++0w#dz%Iv`wZ5)-y@oeEXPcq_5B@vxT@E8MEy!`3NWZ#CpKsdi6P~)>ujA#N zx#h|GeGL#;Y)naz<{untW)o8cP!Rgqy-H?%96FyX91QH^k@7(3LUHe2@p{S^=8`ar z%j1u}p_)Qc|0MXkRe?XBY{=u1C*cim2nEyU6aV}`VtGA@D~=|eAF2Z1?w%@TsF~tZ z1HE!{?9&)KDJzfaI1Vt&O>@5U)t`;5rBuhn@Tjk6Bs>4H;eljF&A1)`38t~A*w?7 zp8iGG!nC&@zWqR4vaK{{b5@Bpk8MQp-YI*7MY-mLcv@?%R1!Z*R9Z>S6;0c;GC0n_I?)R zJ$UwE==oxkp)3>obyKy=k92L}LVa^KRcPfu|GLUuW_K`m@4#)KMBouZS)6u|>vA^h zt7It4$99bZSVI!}Ll*}tfAX4+3}+*tU%?SN=nJt>X8<13;OwBXyW1ZnEQ59g`U2*2 zox7BKw&UWm%`=3!rcNaiSiYa|eml+PoGxrQ`rK02?Ru;$Mmwfk8p58Dg`+$5L3|yg zSXiYIG+{ks`aPVF3mh3-oB7FvQ zNjqc|z#8|SPiNe#X_j}Ye!hC9i0_6v zGc4=)ec9oM%v8Oc@BcfhGRKf#*z0O-ZH}j&6>>jrH}!m-LZi^QhNh|f~qe|If0VvW;F4xAwp~Y?J=91 zj|1S4%*mfc38za<;r!@X!f*?pWRKWo#wv5mp-tt$vuwHtk#`xx8I&4MrtQu0eZLum zEG@WQ?;WEf3bkeWkH#j zbb`^7LXu2_JV~Pp%IT!>{N4M5+n+A6ilU3iIjwKcBq~S@h8b;1K7o?7`O4jJYb|y* zB}VvqIWmuLPy)jMkUAX6F*65n1AyL>L@9i0=Qdg(IGnOES0U}?=UETeqaTjXj-zsL zc#&Qf*a1*f)m-+9@3&!FIJcXf`F94FyxW7P3O^QD-opiF(YeM6Z+|}~Ue~KGhH4!- zP)sdJcBW{Fk0odl)Y>C2m&ZIJ8RtuKUM$F4CXsD?x$QR^5k3r?^g?H4lN8T~q>TW$q#!)qFDdukLuiXy& zrI*uBR1@JNx9)QY+|?Htwu?8y@{Wg$%nlLXdp#afd-|bI&4NAeye}Bp1&mu}nmx&t z!ZF0`H!SQ*nC5JgXZZ^F^!(W&Bc26rHXl&+8;B*J}DlbxYw#Igg~*uDJ&d84h~WR$Wl_DM2pPRx|#*kRpUUVpu`U!ij6 zx9Hc>i<2Yj{{a;wE3F1gR#da%*#_w>=H$H$JTBBv4&>u5D%WUw^R*D9oBNP!=Ac@* zYM-sJ;VD|r>$Re2`ZV~hwP}`PP2Vc#_kv)_;#ruPeDxOO8)R==WK$7=$?B&e$ERsa z8%-Krt{9s>F$CQf9ks&iBic?mSaKFK(`>fHFq!0tWq$1-# z#CgAtT4ULg&2v&o2d&+U8y}_Ktc&J$p8nVtDJvIvLN!f!O!!Ki9`1d%_>$bG7T60f72RoVvmw zt=>Bim5To`OIDrDlrGTG@mFiZ8=r+^S4h1vmHCneCJ?Ude+IAz1e{EGSllz-6dtQg zGO=Z1go+@E_q1$Dx+}VpDG+0^0O9QAU4*LQtEGN28QE&joozF_B~Rp@ZF%|s=rEBpQ+~P@_(e}DU={Uwmi;7J{*6YGB4kJz=sk^ zaA-&^iMy1Kk57>*OCO*tZQ4f^`=d&Gq169c_QIW#*xst;EQ@~^njUr8Yj*UU@(XYA z5Vx2uc5}p09IfrXJvuCa8B#r_@OM33NU-zi^P0+#E$l!6?8btvCmJ}I=Om=7YJ61| zZ}I7V@QzAfDI4{);=InS{(0fAH@GEs!`36rLUf%on3WbZvn`c#A~ycmZKF6TZ=ss! z2x0MwsubT=*?~18Jq{13P4;`oW>@#AC!!jHQVQ$H1o({dnXC)K#w2GzTL~ezuCpX{ zS(ca0cbK)b*L%lnKhUR?4N`=GqXVt`Ip*W0v}U;hOdYic+zx$tUs+RAf_z8;Sa;A& z?h10K>fC36j)`~AqQ5w!F&w(++hENL<1-vyZS94Eb?}<~u(SKbYG9!kNfWIX!xp-& z*RNr;Jea-q$1{dW-UU=T2t+R|D5_Mg8^x&rmz7p@k0%=^_Upf)uTR>66sn8s)J5LQ zWq_8^<>KevM+#Y#3vbiM9A#JrqRMW zYuGVtc-u0dc`7ROd(~>p^0G?0xGGbjtFLw0{v98y&f@nS+>CnkYn=>L$Ddw! zQUiCGouKA`U@D~fIbBY!^s%Tti1~H1yGP4e zEF^$NKUo7=Pk<<$$r$O@HQo5Z{+i1%ecM<;Iasm>Ql&S@sqPnOn<>lsxovH{r}jz< zTRfW|s#t_dfB()){g;Fe14}%+x&n1WcaKdtHoli+j-EZ+ME{VJQ)%_1mKONrb5`}I zxfU8^poJ3t{_hHD&Jrv>ra<*;QTm&3LAFB@Mr*mM2%YeC|AAE&w()F}Ef|=^)pJ++ zTmDyR4_$Ya&v;B<$9xCFCg@zpCvDrN2_)5h(f5P)DPm~=VMRPWS zi+X>a{j>ve#Q=+DdtNv1Ew*norp}wBczj{}3-5gvIt{0CD+>%#Dp;@j?T~3+ls;;U z7-%!}-i;8bAvFfWyQ8Yhm+Du8&pal2uOeOzuwtr32RGa1bRI@m2Xh#BO(MqGxo1eS z_fa{c=wiICaR)%2jfof3Ynt2mHEr+s+c#c^zrUgtK7lfN@WcJPgx4X;fN@#?s-#&s z%Sm`mgZ*A<+|C=r85+u2jMIf^#<-QhK1Z?=`wW~MH?D?b6;okN>2b8BV;pK#uL-ZT zA`A#k(^`?^rn;?ZR%Z_x^s%Eq#K&b@2=6>|#aq7UvXC?qr6b}_A=L0A%4T3Ts4l?ne6&LFuY(gS0*Lru9gsC?m^me%0@ z{ReTd&f&kH;At_6*uzxd~FwPRRv%n_$kC$rdtHe}hiwPhzhg<)S(EW^h?& zCCNRcGV*zNH|^?t{k+-meopS3c4)vzYLB~!jC!Q~#xOY71^OP@W`6bQI+K(*2t;Z1 zt=#ho<<-LRD2>xesNA!J?;`PJhbu5$d+L zIts8!B#G_qWBeENwJ_Ufz49Gq%b5`=BiP^Vw70BCF?ZVT0-}R0Eb&*QJdy(gj37Bn zm2SA?Hneik1!$KDKWl1k$Q&*D;Gs!(ca?@iSUVJeBM>R1LkX`A@WHFsfIh!)DkO(1 zgM<8c;gUs)!G|8>?u8sL61#ZGH@2+`vFRA)uk8X(M(sE7Bv0GgDWv*G{FzKcZ~b&t zgUM7f|Etd;j}ktG5LzEu(AUhA8EjQnTBgqEibMxCXgUKHuR3s4C1qLAGK+wCW5T;O zd#ype+!g-r*713Re$;Eii1#=glT!1;mY;BG40QAnudN}nbO}5&| z-B-NyXEgi%r2k=Hie#Bjb9;;CX-4M;KH;d>MlTFfb%2>Z3=1_L1w4%~;H3g(Y;x3y z>>XAHXq~NMtJ?XnGfR=qseKAJPj4|*-=bN5H>B=xo38M0j!8&&bclQfBwSm^dM{6h z<#C~*ui1&yCFYDC8`}$==S48&NPn+7u{7v9er%T^{C-NP(?WxvNBo$hJ$v1z$!2^O z#D$OkjbGlRqR{4WYgm()ZJk2VV^ThB@shJ9#j+wyX53Fm7U>bVn|>CbOVeoemhHs36go;jq5jim z{nNuz!!cd@zSt2Q>o5v6aG5hl$zK|TEE)E-p!LAd|H#CO zQWHCUnFd*>!`SfO3+8@En`Nf6L3U|f;T^e*p9^9bSTxAl#N>^rVq@E1lHwJ@V|_ON z?z_3tzdNTCENswnP@v~|qrv~utGywS00^7T46|i zp&X5w0Ge~9BT_lvtJo=Nu8t2Uux+PGcyWBWwCv4A+r?Wpz(90fRSA#*cXi%KngV*# za6);tj0VfUJWkL>w>PjQPH!$xIv@6^+buL_{JHyzas4KVRlf2l0NknEn7l7gfIn8j z2Sfg~a}s=l{7Ri2GV9FnF`MsfSZb9-pBlP0F}VuARzTXz4e^a#vZnQzg^d|+$_W{t z-ICMY2Le`C?&6Po+PU$8Yo4Cv&S5X6PJP;%u}knku?5S(_qPV_-=}rGe`Cyx(U|lo zKTux%X2pbKh}{F$Tcg1Jjrx}F7{7-oGS`bFef*-dLYiSeK#%VY0NXiTyiEVG3;tp5 zPkWj(d$`vqe;e5F^^MYqx{Sg>7n^|Nnay==1I-tMo!QI&HV@*Xse{eQ=-#8)mc+FX zk)Myf5QI+Szjll}P3 zPt(bQk`;W)f00~VuL5=+bYz{CVcjlkKe2$x6})KwBf9}dkYW(CtVo|X;q`eIIO6LG zGIm_=kX$h-U;f&8AA~wTB2p}%nN;8%*qnb^qFb&NNeP2fWt?1o+so~>iSJPy)chJ} zo4Q!X(X~G^X3+D$y6eFqqy#!^4ktV}NzG*o|~+;t2U_S2l*6^q)a&F^E0(7Mq{k1r*>zT&OJ-yx`Q(CmD8 zOCozLO|gtBEwgmUW=_6&7iPOkFaHHo5pgH94u?D=8K;T#gV*sDDAcYI$;*4^yP?qs zx&EEPO;!EZY`A@Ejw@ZPJD6bRJWCYBE;mr@R=RL@OgLuw_Wg)I|B+N8=4FVCEb_lw zGcK0XoOI)p^WaD5lMVWVa<6$l?%y53KxDx>!IekX%A{h#XInQz)@8NW-{E{?e-z-F zOXb)p^nIw{zN7#3r&@fMFnRIZKj3?X{eo_ zoUw-a?htR_NETXb-!#CHdlL0Uj(;!;P92eSf#6KHa<_T%yP19oxfB|9RLFCX-Y`ze zRQyb@xhq!7!U_Odlh+0oVBxn^gLB&u?FkRdxs zHHDJo4){?B$7;tT7b^#tRF?Bo__wCxH9F15GK#mO9E>^1anL$t8*9|~o9kZ^EBH6? zkAJIwk;T5Bw$oz`>b3FQXpyE}6!xq2s+P41fWim)KR~`(Z1=ULn&g(3YFkMm+el_| zZT1Jihue)U(bWZa3rbhs)uAlR-`AQi_AgczRvZ3E_!JeTw*$IOTuDSfQe`}KW+4-~ z*pr1OhS1ZH^ogq==IN;b{UIPjh(LROwMfWQ?t5o|I zl>v5qpLUf+nGUb~G1+9|U}YGXQP@ z6m3nbYzw9hk;7M!#$?7-+btY%!aumTewb;CSd-RJf+BACrKCxbLx#GCqLzNSgjZKy zQ*Y)G1UZz|3XE=?CQ0aXBq>8Y=q1kmBX0@|*b4AZoA*`B%!qqyk^B8y2iG*vHs@iI z_^10#bdX(A+pgTtVxhm&xier1b0SHv#f*bET<4#(No@zrhhoZ%!>gq_y?6VVv-U*^ zuilCwfLQr1zXM&GC~dm8ZnAaZ4u6svlEF*J^DEx$i|2>+{8;#=U2LzeGPlu5J@l*9WJw4FuRj^fnm|x z6gXc}yYY>e)sdb{?%m%ve=n>YR@xq85Br0?)Upqk$>YS|af!wb$3JIV2j^OL$<((MRNIn7CpoyOM31f;zxR zZW*sN4ZB<|d#>9`pXfd%(6&ZEBGj3n+th4QI}dzKTn|1c1{yHumxEu07Y8KolPu!5 zx3S9m$LQEboMOXREQaydk;EZ`b4taIQ~;q|F7Lt5*F0&3bQA)5_Y^ z+5Uvy31uRD4(}3e7YOUN5(R{_n+z<|r0G#5$NT&MB=YJB<(JK0>~B70?R!DaxglgF z3B6KinF)D`3atzWsFl%j!w>JN#i;x%)8*tWV+(+?7i)UtSIE=k6wba0d4Y#Oo#ZyE z3kr4&Om;+@oJwP?h1C~I$*0&GE=#fLXh}q$Zfp+QN}PgPCB8)clc}9?tC6uI*)hrP zc`J_RTOY>Q5hykLX&RR&&tCe$A_{aw;^)4wkmvgEAAxjF8Ml zLG4+d+zDwTSqv!O(FySTnTQXiBc@{XkqNYaF*Tb_$;kp3A#2hmKl+Np(J>Is_GAON zHc^l~ny&4^vSBjDxJ^quHMWQ;FMs$~6O0T65l?RtNZAmK?ith3?|WLZyo}4Tm{cq8a2ya_k5Z}1$%+>w zj(dC=k({$cd?RdN^N(7*uD9e4HTWO5gcv` ziKu?H_CFH{K?9FjOHOVOlJ1jZ+l+Gb^>~7sI5~^a;?@svekmqrcbT)*=iP5qQh$;E zlW{VGWjcT5w0Y0Eo+JulA;_id9v=5*;=w(}O?XWB z<12x`62UCWvCO4?bF=DSv;3H63)%Xr{NK;te5{wE_GaiYh}1%`&Q~mr`qFpHzu*D* zxvKvP3bKVbh0vuL<1DL-of5^iVJ}DPYfvK`{G>g{v4381w(Zvnk0w3!&iS>8`?aRWgqhb#;+y)Fr(zVgI>stefdVxG-i8)mGd+E1+B z{+*#l2~$`5`4tn(bhg(15|~Kmk|lN_R{}YcA^%Y+kofP{mh*Ni?!0-VCC+4!CI>YSwVvK5!|hs}*Y?j^!92ee))l;0)` z!dWYYka#nZfjdt+Xo_(w(MsH4W<2{EZIB4?RHSAUNXxXuo3p^eUeS4(fE-X}6YM}U z;dt^(|ST1sHsFJ-Fd{%RWLVY9eBt{denV@LL@4+h+nl-myEgDQfRX3-G&V^C?x{p{zX@Ru>s} z^bb>NmY!%h>c4&QD7J@NTBfnZ|7yHS*%6wsOW+D9)x|bl{|;lv4|f@79<%H#;gqJF zfqw-(Q?#fqlz9aryad**@h_6UD?Qv^dFa+K9`gwAW4&Xb-jekF_gj&((4>h}FX>|z zS(zi`#^D!pU z2}br)*zNhz!6)EBGjIOf?jAsMntM+&DPO*@_AwgATX}eK36|R>3d)_wz7un*(+=I- z5PovgNb*V!v^;~@X=&R`4YP?5qsI&rIx#hO+k*RAs3FBJ-5Bk5cq+Ve^~G~_^@|wQ zmtnt~bst}G!Kdm4!da~Y;$Jtn&q(swq^nWym#ck&FAhbxnq()D%knCGhOapMYQunj zgAn(Ncf@od7byn~WcgicLnF!%-xlAs6~U}D8Xgv(70yS0Z{*GD#`tE=obm~d!f!eA z2Iv~BTp$4$H(f1kcsI)cm#*B}*_y;c9mT_&CXPr2T)zOQ9>~qY*ypQ&I_~wideJPc zm2pfx{mL_%P4?0#Hs)F8jx7!9CWxTR791S6?&cd4Nr^Z@fXHk1jU|BeO4)&D(I}=s zPFWsU22a88O>S=Q#Sro$ytTS&M^3+1jQjmS;<-hQ+2)n!+9A!{Tz8A+qWM78dl0~V zaPReQpXVPy>aux5R|`m%!y_P;LYe)d8fe)xK3270^5oh0vg9V(!}~1BI~|C8?d@#q z9?qzBHtXZI-{pLNOa<@{B$Tt`w4Pe1UU*^jN<8&?V!4SWu<@BQ^?_HfAA82czn01C z>`WQk#B9G9-c5_kAmc*)q#VX$mmsN1oG8%MOv`-mSsToPj}bK_PxJP2Cixa|hIuP` z_CVge@*nfj4WP&0v7xc-u}SarabVDKzL%4ZsogBxnC}eL=z1&7ybTfB#k)8s1#LW(4Cd_RPNDwSKj5ENvHz=bR(q38G zQ?7YCb>8YTN24?roqMD0-dM147YdeGR0AhS^?i6*$)CV*XpXevwRG$eSM&5_>#lVi zPF16nPu@-fZ2Y;%Q;2&RC!Te)91f0!_$?`6|`~w{h1xN-F!mL(FeKc zP^rsznJaozwogQS7)pBe)vdgGL4f`SA!~hrGyGajFV{8VHz{`F;CdWrhBrW;?;GMc zd)OIcwWqF}q2Ug5uuI9RgGkQ186V=`ba;nr#yT894`Waz!v`AMeGp}hW)fxso3}&^5 zeLE1GD3H<@>P@@P*-kLhV_+>$R%+WxDz9E?%%KQO<{^gZWsQ3-a6m$Li;2BY9$=F- z@`=oNE#e~$VH@Vrc#H5tlTK^8TIHY8Dex~~Z1GIEO&hr;zOLLH8YOWD+iD*BH(z*B zw@l}`Uy4rgH}&(qTbw1@J}(*%0&tl3Tn!tc!Tzvta7pPVI5|X`CaKD7K_6z~{?tN+ zL{;EZSBQ$rM_~Ix7I3;}Ot`xR!QP?2cAuc?M;1WKI7}qE_0;+YY_;L?w2FvO;{1;+ z#$j4mLG%^UBvxGMN!MJLX1#wUz`w7GEqxE z_I9Ax@a7ASx0dW>IULan&zu@x%=(M-^aW>KXb_*PeGa`7vRKyd|3m6nNlUb=JJFHC zeRrIAqjTOR#hF70&P6`1Q#ft7FW=82oti1BD)Zb>Mj;%OF%C!+U&&^ce5LfM6B`y; z-p6xle@x$QiKw|m3YL{LDC}qdGXo}~h#MfuH*h|KG;;;JAicFvCdfY5v`s=fc)7CO z&~qCE0AbyxKR@IV$QCn1#u)97pFrPENXmyl#>;8T>sunJ2#wEFS(6eG*4^;SiL;>M zf)8my;*paIfUSFmzY`VUYwA-pqzmW_8td=vB4^*XF8ZCx2IVEw$@c0>4$0z(Ez|;A z!?N8Aj?iBvuu*w1-Pwi)n)(1+?I%H=Em`Ld8c*Xz4-F7hE9@D=gPIL0Y+3q+K7m;X zKH|dKto`-qGCfFU`~c5Nds?l@LARr)$}olw3Tdw1wZNVx6?&hM#2$0*jNV7FM#>hB z^h4uVj0wm;;Dpd2^fRLelRVV66A;kNFYwV;Vxbw~B$dTH(`%nadx+qL;Xk)An*-z* zJ|;q*wItXu(!XF?^tOnymdttH-I=rA?ai%q*oS&VW!IU zS@UoWt$7I~`7578zv8Ie1U={ClQ)oalV=N{D`Xo9zWJS$p!t)n1=FBPNB7( zSS5bX&A#RQGmEtJupj~Mox=^=HP1z0Y^lMV{f=aDXn5c~6@O#*{Y#z}t4ogiWvO{p zt|KdZCz5SwA!ZGQ!wbh}ER7k1)}E)(DdlhA+H(?_O7V&%*%DujUZKLr_UoJ6k8a2; z^#t$~iidXB^b!n15teN?csi67Ofibe`^c!*lR^@~8u{>_bgEw8f`rex@`BPwLuP%` z;kVX*RIlh%B7;M>%D=8r1mqlbPe$)Gq&asfAtzu*Q; zwS0?lF$bs(vPQQxh1i;;z;r4sWccCd82p<2;f&)Uxw1=t$2 z7R*c20|Vxcn#cH1eknN_<9TDlnS+YT{JUp<6ZxWr#S3!RB7LwR!-|Xa`h>Y;cTWVY zX4}j->|PsADut`YH%T_&h&WYa+0mNVgIlYG-}x2Z?Y#yF=4ooEPf|nKHDwK{N9<-Q z7}pPDOS@axL6!cPWNK)d(%Mj(UGN=!ZU2qHkR6Q{Hx=L3KO6cFlUg_w1Hj$V#JjCY zimFR)A)RbuMk-wg6zQgC=QU9jYT}w@T33~ch1*u&aV%X%atGy(j_5$1+0B*?ELsZ+0O^iF#72nG$;{D(kiFv;>B6bD0$m!qT0 zojL#|jr-e+C&_bA<2o#2|JG`o?S~1{wvQTI(WiXoBQ0t^7(DZePCf1ULz9;)EPMiy zFTIqll-;3tK`%T2K~id?LxUEV0~~dOjsNaB zB8|QVXht`f`)hsQukKCj7LO?6lM$3Ty)+&N-*1-@8sFOoqL<7rHb~hu)Ap3z3hC)1t$S${s8%Olh|iLS;v4 znkr}uM+fO0E`rWGs>?fC5dY5iY_P_p6`?OSnc#Sqh*j=1|C&4w2xsoW+-q?2b969H z>R+B*lt{A{)*WT}^%}Ohx`pOQ;-Ig$X1p@NNp3~LpOya$a<2&&+DQ7&Q>X;-cVqDi z8MG7JL$EAxH)e9m+=L_avsAE?^*KslN5J#6+uy)a=42_Mx=aX?Yc2UYBm9%@;~hSZ z_^S^{X14Z%Cv!d%d`U+E>zzw4I3!$N59kzy9#DlY$<-8$>Knj|?HyM5VRj41R+4Ev zJOPq98pLdkqCDyQ2Y zhYf|@nfA#y=(Q57n~?xhI(aj?ZBDr7?5yo0cw~MFrS+~eQGX1hKT+-)pQ}W}dRXx0 z7Sq)V8s!#a-6%zW1H1Z&q=4@p1v33Q-j)pgx;NTNn(gVQoS)zp$}>?5?{oMdh2J7y z#wh<_zdE)SH()YGwGPgMt#vYZHN1MP_VBhJuq0!AsL_!!O~B3F4>@bve}(o>5&4c! z_U>j+f8q4uA`=7D{=Irsa3zH^$|`d)qlxt)d_!j*t2VSXWW3IlyjY?$vUePR`bPm1 zccyX;-apO%9IDrFPhw!z0#OqlD$4fw;j3G_sG1P()t_OCE-0n=a*awCg8=U!vr)>= zfkML>f^nkFS`)*nBaR1f_EQUQP(dTToy^u^Y9BPjWEI?P=cvi)PdoMt z%QUdFL*w0N>1L!JuSWuv);>+c{t?mD&myZ}N4snNk~odxjg_!w*=}(wu7>zm3g_SH zn@(3}USj{iW}ECp?sVG@_B78}Sgr~eVC;JU@!g%eywVks>#{M|0erl0TPAGREtL1d z`q;GeGrYZ)UFgb&JR?FwD;u%k#44mt%o211{?ktSFwCD9rkv<;35{~puxUu5PdjqW zqNR;OyuXY~SI4VV5BdWo^Ao;G%Wl_$KL9rVspfIJ80ikIcJ)WbmFi3+XW16xlWnLg zYPDIX-afW<`fh%2-QOnXSZhV}bC3JSEy~xoj;lNRl&KUnincMnB!2jiNem@TX&88` z?eh+Zy&WE%Vm`Y0ViiM@(t`vh6I^Cy`8wYDPlG5P&&Yf<3#`ohJhcM zo{LG}{zB~_1QhZ-64X?QG2GpSLwJv0h%D_Kx)w@bHtSgM!|-LL}xy1G4e#fLUk zAhap#PqX+Gr_mumuhx@RCgCglg6)jSm1_bohBx;J@~mQ2&1{-sN0!+~$4*GP#|w{> zJ)d?*TY+Ow%T76NxG-DXm+Y<=61|?hk(Js?rnoyTtf1^`zb4s993uG2QbZhi{GZO_7jq@RDg@ z(1}=m{*&Xb7Ooo@TTdT<@t6OR8H3SR(XXojsS5IWt!_{02{kxS`{~NgvS@Peu7syh zRpOuYgl5bNENEk$Ae8s+PmTO5SEYO7<)^#WvblQ2Z=eTun{7fzVwZh7{`)qLVM&*v z18e=+p8j^ildsxs(-`ngBm^8JxLkue_c?zf`aDSvsY{*gS-z;X5$~@rV;Gbpa(iL< z+oWmnML-HY=Lj3gSdKie;+u^#&Q)ZbC4Sb8x!mYA6U-9n5L_^3yGyS5SFR~fI(IX0 z#A~K7CSkgK7nt?6S_&k+iv=kU;#Hq;AjHxgS^gdpTdtM8zN@Ydtd$@|aLJ0{kM?3me_BxZ>XyN?hSw$iAEg+Spw^nFpM;@&ipx$VXF09%bkc>gey zn`G;t!Ujo7#wftMq#3A`v~&$nkrDwxI#rrUjE=#S?hyhq zN~Cl2=5zd{M3VHiohGw~R9n~pU3Gc!;WQ&YYcp2t=_T_2PNGhp!@~ck8y`XX1JRj)y9J&e(QRSwM!E$V`EPUEuakQ?X z7Or&$6&cvU>Hiw!Ejs*mBc z*cjPu)V9VRIx0SWkdtQfHRbt=In722r2L-)5-LmK^vuG3v^UJ+Y_W#d9Jj^J`;w zxjr~ce2&muR*id92sjz}a$|*wISK=^{lO{k_R8t7QPmtcoj?A?aeMucT=uci6vtD2^^fcUjcQYwBfiA<3{!8uQ74vGz2)#Mg7%>b}5?=C=W*Vk87 zIixS8^Q@r}wG2&&5J6jiy(!h8R%zm&*Z<1Jxj+%Hu2{uChs!r zv&WZ{^-+v09Ksjb@4mMr=Gb7(VZA}kC{$eRgL7_laQ?Y_#@#4-ly6OyDe$9djm^Bc zW0UHqWXp?KUn=w3Q#|6D=|%u&La_2k>ey#ehUu6*4CnwCFTVIPZLJ+0bD@5FD5Ao8 zc5cW@oXJhDMRTAlJ+ps!>gQg2um#El>vNMv6g~K|sUvn_zo6TIX!6{tyZ8rDzm^Z^ zmlwOuYnGT#2|i^Wqgl?on!kJytUOV8Iai?21l!`xHr%XkM>iXwuN|0#qC5mdb!tG& z2Qs!ba5@-hq2`-j+*O>is6}2@CFu>VEP*|^*JepUuZES2+L_-9;utsFndfj6oBwq$ z(e2qhd(`&V-%r$egBHXIXQeQ7Hx9MlV$sK>6}r%6tZ_P6_7%nIUhvTl75UYI=< z49TL*x_{2WY!y{yclRq1A=y;bgHc%;6WtEo95#E7Cq)lR+7b?ZVt-)z%(bWilGlQs zjag)O*q)EEZ|#f+8D|RODA3MCd&v^M`7l|D%J|Q-T_dskL4l8BFZW-I&)6%_3O=7L zi1UeZ?%w>6dOQHE+QvwgPhO)Bv(ZtY`}MP=86a8H-kyPY6P(rQJ zW+hh-LP;e%y|J&G02RxWxQ3SM^p_y@_~du)_g;<~Qh$fC^6h5*2q3P<)WK2o(HzqV z1wSu|jv?XE6`ec4D|iWpxRaF@mt7{XA>(J_9n-Zq5dI&L%kYDtD<|oHA`eIW=wrlW zorCdDT4rnMZ$}cGKbNGqdYj80`}$EPol4O%O}G5HhJh%5emQ`$_EBM@&?9}FFmj(L zn*;%LjXL-|4`%s2VE1-^b(=jl340XjP9T_t2a2^o#b)*wMpi9$4jy zKy+|v4Y}}hX^sbhyW%l{cP=~;Wb$F$K$OR7+fx-I-bZ>a)GT$s^r%!MSbkC ze0$KpC+D71ctQL)0XNO|`NoM6gca70JJ!Y1b|2u&EJ=Sb2|uIkrnwQ{pn*tY+PdX5 zoIJ=2Z{&QodPoKrNQ7me)F0*dK7+^1L8qi^%GIj_5a#@yfQR+U6E#tKfs<1q$=vNL z>;*a|_b79PxD(CmG*Z{FZ1n+qnpgi8&gK^SOIw2-Q0G;Cc8R?BDGS;oc`^tkRx(0h zURpdjScUi!%1_h(mKz}P8|c|id+CR^h%|qOr7RGitt}@U2QAXD4|us+o%}j$2NDd@ z*94X@25Y?3%4FaAB=Wkybw-F}I?k$^A!l@4_3W$6Sr0@AJt87GJ>y>QR4yM!GB#1Os$db)X zPIr7A@pzg*C|TqB78lcNSV(ZUZG&`*{N$(<=6mMd^9tg-yi4BtQ!-nNmX^6Ze3=7! zevs7#ADKqrXXt+|H23JK1jNKiaW!c%kJ$ou>#z;6GY_7qepgikCf<^MLlJ|&U6tq8 zoo8DmD7WjlP|5K*xH$1{>oE=*i)7{%i&9i1$1u1^db~)xd-;*Xo?*kPQjYKIdi#Z1 zqFj1fb!;;+PS4NCgEg!}5{ z5L~3qzL6e}A|=imM0n?DS7Y!gav77CS@M^{1cGXj_3!CFVMBT5HZyjSgIfZc+|c`G zea|qHYvxGE`4HItc6f8q_q%r~zI4+dV_&7RxgpwFuH0!QU|XLf!G{owo^A!;BFDOx z@5PP{#i|J|YVdr{Gf5{{rG5~kZC^vm{w%h=Kr-Sz$}GX0OBH4l2iigL?Q)eSUtjH( z`k42gy@1QTRfwr_pw}_IT)K1Ob(gULAUw4=s}&=D?f)fvI@_}G?YoKW&TYgJKxMXp zpsiq<&Cc6p3JFaqG~K!S5MX^f{i-I;SlRo&GBFvY3O8+L%CU;QNWoQuDJ1o}Eyhwy zAVj)2UjJ6p!kYOSVOa(18#jRoGFU3d1)Mx64qlJODvj29fD2UcKP%Hhmxp5d0N$(x zk();lIj*#)uEJy|LU2op6UVcX$Gg-6c{X(Qe)*p%Ntd)&7O&6C@BAM7H zx@9Ai*Hp;Nb=7J3D99(Iv+}M;+xBVsRQob1!Ey*0nv+yzctRVV{7ULl#d6xfcAbDj z1xR68n8c?=ylvFO4g7ciqJ$P-$iut%5NN9oMS4Ej~!Np=#*ZWdy z(~hV%aj19}Jz(d@bQ*0hPY|JOw_r^68^~L+n;t&XosvS)`c$7cC#GN=2Hi1QeukRy z>}^o7cO_kVphX%xqu43W5jx5!;Kh~>Tc-J5pFh8|hZbx8KLRsxI;3ML68e`Oz*LcEc7{B=OnFB4(Y18B;j|p?C`S#B0BKHdH_klQgWak^0l4Xs5f0|L80c+IB@9>Kp7dfD_&yWQjlo2(h{} z6Ho-AoNHp(qA6CoT{e90_}YLly#_?u(T!_3Aq}YOm77N)-MwBiKaS515|n(8B5pLY zAr{zNnS$_U69PvatNmQvUvSPQeywBo*D;E;2)NF%)l4wdkTol=X*gV6zr`Aa-dO+c zU%?(QnmE4g_r1-M{t^ut>Z|pq`_x-+R5;#ko}pi>p`LvE6TS)c$<-6>mlwqu4|U12 z8XX+igsu-S9;fKXpel&mE>VdK4x(x_eD8I)D_Q*59QIqKaeJn9bLq3rB(d;eJ0Kdor~L)g-nY8m2e*M=-uL-Erq;z`Km z2McOr-w5T#Eyaufe8uw!_|f1jo%U^yWg@#}32T8AZ99&y=i@)&sy^910P1k*ssF)W zBD}|>J?mrWW9A(Wo3Q=CDXsDtJdTZRX|L9oLdL$naeUE(lTr#KRR;++XGBxFXZKpJ-mL6&C#U zpyhnuQPR_&25P&_&@U$+A zY9(0M>3KD>Vm4T&<+gX?e7ottKD4|C3fp?2ie7vi*%(EJQMdzf7M+ zby8ESAI8ufnfe!)`DW2TiV^X*DwD0VRE)bhxBTp|(bwWkUcXfkf&96R*{_*jx;}um zA1OF0gt4&z{hluKPe5#)^SxC*HO=MiJfEDj{m}|`{qR}rN5j^K_*kh@3kv)&w8m?n z2OFl=7}iH;>_4;Nc@?>A@8zoQ2z(L;oRfdeq1f)y9!Cj|X1XHnw4jCXT^r-(<=9MT z2&%w$o; zU7;OBH{$49c>-H4pY4_F4W^n$+`NpnMJ5BST5{6s!2KanJlpo4LKN(7p5thL#kuj6nljho+z6mQhUuf$RgfE(XItyIOw!JQSet_#Ey|A!dVh#?~JBa9CEZA^)M7Bv*x!KG+a^PB7iQ&FWt&0!RsKn+arttx}^ zq9o-*qE(au{s2uGOg-y$e^&SF=Z zal-M1%53t={v=Prq>p+=6(5hR6`);KQw?D_8vywKo*9I=U_`E^?6MyD>T{bCUqhoW z)cf>)1AthgH3-j{f})eumjoxxyC&YPX9W7j`e7(kuv%z-LLE@R;}r+bGB4IFXM)*- z`ft;K)TnRaqWyHy=%1n^f66O+_+3UF&I`{Zxv^c~f+PQ2cs~Gpn zzkUNHiuh~3h@2N>9__lTOo;7fw)A+Kv*Tj8YD?7ET@zGIgDxtxfL(>P0)5Ot^TD z;>BEYuI>6a%q7B?aV&vawN|@sE5_c(O7+fyTdVkki-W%DD-?IZ9!2hQ?`-klzlDfh zt^bJ1Yay29f-OaJ%gPI$zDb$i`PN5pDLibChun{uy^)mpd6i zCD&TJH&1aMh5gj7?pS21W*dN{HhpsvYOTw@$%sGR#xf${=vnir4^PU5%h)s0$f>TE_tV{FO@rvQ8$FGdm+{P$ed)|d46S0 zArwdp_9+-E^A0(bRIzt#Rp$XtTqwqQ5j7vnDS3|_V6lW)6%bR~8*dL8-o`$jfx4aRnn>v?iD`N_`oXXusKcNNrmF{KQkY?+ge^=Wf zPVw2G`gIypW2k#FJAvUQPIn~<@R`RY>=`HNiq@=nad-muCSMTjsocSwp&eEU4Cgf) z^7pCCMPn7(4LaAQEU2`oS>6?k^DQ50X=%7aeYSdQ(#tR8)3I#(fc%^HlgvHlw9}`A zg@d=#(vvUZzo|6}-VFmgz;_gO*Y#}#rpSCz6Ku>1)>Ofg=0X@m=;=!M@}11%DaF7k z&6zXimk?RHsv@BzG6H6(A{w%0o%+e87p*0J*--#_jcO*VOM#osY-Nd;3X!wbh`q;F zJj)Tn^4tr|{k+wb^_{KmcDqZ?`6DO_z^q$4`{MCp&x_{^H7vA`9*nB>v$q-F3K2(! zd?1hU+~lmT+S#cc^+x4af{Sdcwd(4sK|=+@x6d#IH&3Y0vq6Omi*|Sp95aUi?_muq zUr4zPV`u(mn2p*g$2l!wL57svZ^FXPd1p7U$Y>zV+JYAGE`5 zQQFY*1D$_lara%7APb0qIs8LxiJC_-M1Jbqp+eQxBztD>^60#*+w)J`#k?;?xmJ=I zqX~#i$<5Q-(g3odynjppWaxS$oP#bUMP`Aww@_vHAlYu|*Ety#WW%Q15bnVv^`6NS zpC;$)U8s}p!|k=)E7S{{7vW>K|Fd(I*A`yGXoGBI`i+cMdBUK1?eQj^w}05}yQ>Uk z(%+j$gj^1kgploOi?XV>KW*5c8`pd$^hhIt-j6ED0NhK-)>dop9kn{Pzk=Rl6bJBL z4XJ_Dv{G+Vi$!ujNHfR(=--L{bfbrXbp?=4<*R2g8O<;3&c?4W9DS{0vk%Hh0LI7O z*>L3c0`QF`n`xTgiVv~&Ri6z`LXPdPGSj@)KO()(^ivCbu|ZW zTXHo5%#cIiNY1^&d$v;j#pblQJ*;R~N}_RJ`Q8hV1=&E+t}8(HTUqfR9uuX%e@E9t zBi``enV&(M)8i)GFoXC9KuIk7T5rV<6YIL1qM_@;h2IhV6l_(=pI-?_o+(g3ys>)t zMAvhdzv9bzF5K{K&FQa6Y@5WmSk+6FVV@qK@@V+Kn=#{9d0If?^w|m#L>pJIjtDpA zj56Ds|1(CCH#}MqY&TrFwMM7%CA{l#Gey6OEKD4W3Rke(!L#ER;C;c%S0m7ho3~#B zkA0Y&kptu;Rx4AX6ax&7EhQ_Taktp#H5%r=?7#I;`C3301>!)4t~2kf*UsB7v|z>K>z7pvpfWFd62mlE9)MgZuT|*>>bk4PnQB&-@~?DeFRxHHvWa+QNIK?|QDkXO54YSlkH#;)A8`3xhAnpnPz zbHq>?Pq4$+*O^C1#uo(Oz2j9Z+m>Gy%%z>cW(r|93fEG&uZ|U<@$zi?(JG6Val(i9 zMUj6m#Pex&a*niDKp9fSNnm?7v4btx=+b?4LX`s!-EB6%=#%oPxcPt>Ny>P=NOmUY zx9ZNs@nqR_cebvsEV;X~{PkY{Ql?x>$(|NHv@>U><`Q^BtwIqz{8cSk+DihQtP`o) z>l??n1)aY(#5lHfg%HF=G!_m95iXg!Gz+A|mVr#4LO(?limJ-{zgpj$_pKi2`Jzj^ z@Zltbs>|0l{0!%QExQT#i~hA}3~2T}NoQ(6v)xl%GvP|GL1x6=U47nv(N}xhQZt%HD~IcQcwhYyWY=DdhOxT-l#cRcGcs*RP^G{L zH0mgx%3lzje^8m((!e&_7(>;A8XPYT8@jB59jrY2k0{>Uy^+ z@ntg|w%OGY?Z21>#gr&ei0>hSvYwt=(5P5CyEJNCnN~bXZ3t$A(~U8kxjwik7e&V$ zE@?70Z-GKMEaM2418={pnV1)oM~35nvPR)brkiA}ZQ9cY{*MO#r1SOEzO0$rM_IH- zPTQlhfpU7@BVs7`8Td5}f@@eOm`NF+_9a`B5UXWooWBcU9=kg}BzhSu>GPJM*8l_v ziY96hh&=AYvUqMe^Bzhg)oV8>j{76~802rL&k(?MHJUE2)k$fgCY*oa#KFdl_=8C{ z^fO0*=wAa$h1>j+GPwoEo24!)Ww9?z+Veb|8wr&&7X9;LUn!ou-DZdpY?88J zA7^W#EDk`|J_174O|Vgkg@HTk%KbFFSuNw(aa2^AWko#`xX8#1Y1Np4^QFvf_zEUC z42}+%>4SihV)Fcx0%tIC2SWbV+G2nPns4&mi|^;|P-39U@T&(vgQ*n?cfgarHT4bc5mk-$C zgo-<-wpAu^A7$0DRiY03*_UvqeCf93PDr~PvA5qt> zLu7T3;e-b}uc^scmFzE7qJana=g~Bb&%SHk=?SQUkYLyXAzmeRS1qmamTc#+uLQ`keIVdO z{U9>=OTS#*dbGjzMb8-SrA1%vj5vUfEhO`Pt)UZVRp_n|*^27hhm6F+q(ldIBK~Rk z0#`5wNmFPHWkylJXco1{l3y2vGwsZIQh^d}* zc7b?qLG3jgNU|eJcaCGFMzWVAL}U_}$)l^pn%7*}vEIV5LIM;mX|ERQQ;1Gjcr}WH zSb%F=x=8SP$IwUu%wBQcDuyxJjA`57#zqeA?o8aH$>l{6sWKGb&5|VZCG+@?=!TxO zTNPnxef|6f)Cf(aVB%Fm5+x3sHTpYnp8ah2DZ#~Kvc8fxR$3-c>doJ*tQBR!NGQBd z4e5(6?{)>RWcSHcYC*rV-f5~AQNuE$+3%T^G2sZ+9w5uVlK1{2`hXge|9=3p3FPaU zC_b!EP3W(2vU*wi89(*rl{BNimJmB&w-$CoSo2l=Fv8zo&P`!RR?RYF^(96U^;S9^ zq2{ZSJ{Sm0i=8&iu+aQ$*->a6x`7oOwb@#PjGNh5(A{V@EOf_9MvIHq&}2S{BYY>a z>XI84-0N2Q$|)yqtYCH?4x+(Xz39LMo6oS4UE)q+0XAuRCUX?7vKS0F65_QkxTSTC zuUF1w_&)s08L^rAVLYEC4!nQ1v-F4|WJQb)b&Ani(~vqb~)7I5jV z>$^Amdbwj3vkga2A!N6|jy!nyN3+oHT9KFAc1~v>D>gh_Ip#%#gJv6Gls7K8AFBxB z+eoUA5+AT7ks*VrD(eY(rih#xA(0)|L%2Kr2?(?hll{Cxhl!jN2ubPQ;yYxh9-&J8 z9k!|30j_u428{ACS{A?OVV>ydOIuE>L$%#VUl@e83P9v0@XUx1XAct%P?wu=luE_S zAOE+qg+%SKTB7`aSzOgvYcJUeKM=z$td#*jT z{8smE6MVe~9<{XGQhw08xpTI?pF;(!p$da@_Vo-Lru5O%acL;3y9Nqy4*jGKg#|9W z<_J_7vB+e@=#9+_L+r6>%9zZI3L{*=L&Omvz!L1|@m!kwHav+QP;DyJYCM$u(Ljdh zi~Uq^F^@#b);YczM#o042kfa2*K!e!>-sTPP$r9~@pft*BlK=Lv$%eJ7wu^CX@KFD zZ^Ws#lBAdG)0XgnJK)ZdG2AnU_J=*4L|h%QE#8#h1-=l@(vTP;-qOK`{X>?CnW84G)EF(oBL(fb5={GIyUrs7v_@!v z?Kx+1!S60AsFqEIPu@IeU>{G%&bA5NNTbujfo~qoZvKv?(~nkO5qS*#wN5(UQrWhe z(?$yvEi7w0KU>-Wh5T5aoU{6&!br7gE9Wz2-U31jUNv*9MH!d@YA-WGfGAofho9DV zWiWTb1GVYR*bG=5BPvf3-zv!;DO%L%;N-?rK&bA8H!5`S∋zhE_vV?^NhGcfPsVd??VZ*Et$B`V_N8bI`eRSe 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

    }FPg@`$Vf1Sx3sZqtmSea;kOu54JooxM- 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

    92`>0J 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 pn&kc4X=QBTM;v=vg1TZ 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

    azfm1 z8t01%Pt)z2d@}Mdp*3FrO34&qM*0)-aLg7CYiXKr^=LY?o_+g#6OP@{UXCYSv zz|K4c8wZy{Crz$8T4+K zc8je=c}C>T?{4r@DC9`hlCQrMTUs76;qP~BiRl06Y(?r-<;SltwEPX>ua7sZ^YnKn z^kRj~6CC6;jcM2{X;T$eanP5O;9Gd671?k*xp?U-Av0q5Cxr3HcON4O)XKer+vsNr zRG4q9l48umce=Pi;6xy>S;EoQP7(=5*Fwcl6KgovIN9-dwg|x@ z<2~M_G;%Ud2EjZ;W?97Bw#2V-2O?y*oMYF;9v(AD$PyV;`Z1FhXO=0;?@M!=OW|_o z!D*LnnVa?-x83l7x7m209axfBv<$%PMp$% z^PY{k?-~e-8kybc0oMPch~d%1-+!+rbF)>>AGqf^I1 z08h~x7^o>l&VMLv77?#IKdb&nk*Vs4KMmVgmMgWm%HfN%{NBkYcURNuvTZXi6^cbh zg$Uy89#33quTZnGL|0&W?|9qfHyuKPz3A{F*U^{WF?-gPg{ z+_>xKT;CemGIh?r4d$rcwz-S0IuTXfca=SyTo+?#tm6!f$Eu(LM;O9NjQxU#qu9dD zkU>U4r+Z}k&CN3)_m*6)AdWkk0?#O(qxz$o&-%HS<$&_71OnAvRNS4Rkl>v__0vec zOu+8Wp6afGwy4<8XM;>-9i|%lx3_@hOV`!N#msb|FTzzT3lDR0JwHK|*b=c+{7HfTdEeg*WN$A0?Vo3RBNaM?3Xt)^u)<5NykePD)B zSO1$Hxxuj$AdWt4W%yRf4-K=n=EsveTq*5JY8_`h$$4~YPJr(`^+KpvJ`|GnByCh# zyP%7!EOT;2>09b|P;tzWiGC>2CfBAw`G3%benYGc)`QnUWz?a}pVwf0-PkfraDw*aNv z+FLfhSRRgT?rT#G3mOA1edLsb_=ZY`d1XCU-p2K$2RB*Qs1gRlGB2Kr@ka2fj@(~t zT+4*qMH&-+okKGxNophc8EY9aqjuBQ6%q9Y#3$1CsANR-=Ney{Ro-GoPI3w(HrlcW1)*V?UsKPLU@!ygmGk441*`L?Q2Bz`l0CZ;pJUHMmjmr8u6F&j zx$gdtyJ$mU4M=#+b-Q!p7x>7o!^NziASCQ{2~ACzE7EYh>EL@bPdAsUi=~3xe|<)c z<9Af^BO%Ubj#%_pk}Q~>xVb74Y;f3xQoVy-Ty&?^hBQtCsS}zqA25_U6$sH#bAC}g zvSxFqAM2S&DUx9;@_jJreiSqp@|E%F8j`A+UPJ}*V+$9O!&V>mtD9>!q8Q;DnFz{E##qWG+w0B z!#PtdpHK4_F}Kr%G%#(%&E&xr@lLTvkQH*rw*&guZaE}!g<3==*?79D8uQXj)5(1u z6*jlT-LB`y!=%bYbYC^?y3*|=iH-UEqhJ6*%)fR7*#_TEW1Bn=8;#44xc%_n3yQJu zkqUd*g9nC$lmfUVFvP~5=!zLJ3=9b7v;ai{(hQc0_F#Kem!}8bXY^ACVr^2DHhOmM zk0$o-7~1;^{lLW&c)qau-t^qb+(FO~Gbe_d=0bL4j&Wx(OQPLMfsR}uuyb+_=&eWO zF?tIWMsS$iS2o4{LYv_?yPEH0ZgiU8>aE4fSk>DpFIwEY-Ahv&I*d=_$+D3oa#T5G zrub_D5V*J^R=HRsS^2YZ01uQRmK*Zpl5if+bYM0GY8fwZy{qaP!_& z<3ZJ^?F0Rs@%_f_U;rM_lPMIvdntv@W1H85ij{5X+A9nBu73%uxd(}npzRo;&UNWP zJPYX$c|>$65#3J=rixOQbH9PI^ZrDiyZ3ZRiod^KGk{%2WMD7;A)y-h8_8ZU9>VV= z1^P8rb>b@XrK*!_Y@qO+>=;V_bKoYXebDHt)KZ7owS2|VncN}W(yfn4)~TF^-~FT0 z+eM7}IefCl6sD7=Xv}-YRTZoxs%Dsm0DL8EH$Jhh5J5mKo&N6nJs_W6GSDy^#_?XL zqyLJltP*J2Na|BtjR)n2*mHR*J{LdM@~xE}1!`-vd4T7Kq5@DKt!P8uye~F=p222) zc_~)WsBvs|`#~i-&9k9P&mGAp&Ntxw`S&V1e-D^v0fAj!bDAvenSc|sjCb~-rjNC^=_k(7YI316)Mc6KXt4qlg}Y@<^u4uY zJ92qfuRpbWFpZyL1cxEeewYtCG` zFy(u(3Q7^6-*(ABT2QM_)^DDBu-k3G;(0Dh&4gZ`t#8!s&&V#^c5nCv0=Borf^NV)3Qss4~Y&&d!Pc`jPBrOnFUp^?E(x+4EekDD-QX zvDU2yfBns?55ucMp2u9De=~Osmh16*1+ZS7N;T)^c9Ca#|$GAcxVzWg5F8U#z`;&VSn?1;SGb_Wd{g zNQ^|5YOoW&A(Jwk)6XREgNtfOybwiK6<@WuVue(cecX z_@}sgv3vdN^+1zF(lFv0Zt1(|Cs#1vuQNv7`b|v-o9wVws37tamPY2aI-8v&!ptaS zCwpq0L!j_MnW(?Nd)*jM6fxW)m)&P;^T|}<`Vi|&eTl%MId(h!u3R@_{K<`JL@*BdoBrlDMzufy72(sY{NuEI&$S>)BIbCd z$(82iv=Lb8&!&a(=68eSsUyLIqqEdVJXAbCq9md$ z6egV%6|I{p`n18iaf+uRaH(5QajApFhPNh@Hc0miCD{uCXx6T({>(`)FZ(-?=SK`( zaK(DwoGxJ+cJ+fUugcn-2ri9Dt&T6T~?u--U&0%gO;e}nOSgTuLb(a?REtBb)8s}Wz1 zi;N%dZn6G0zVZ1dg-FkkSLP3n3yrM$KwtsfD88w~lfVdL4c5p`*%aUyz&sI4b30fg z=VCUP#>haUH5@TRt0eM`6bThwEAZ^Ml_uf>?gZ6hSxoyNPs;~JW` zvV;p}Ol|!u^j6~U4WsoA3na@Qcb3w|KyptuZNw)X+VPxOdDkf=e!h(pS+2jktv6W& zDk*`Mov^v-K4q51GZB(q`x{%@eUA4-$Z&NB@1+#(bj7i2=mppsOZLoXnboynEZ@M) z7wl9h0ng>n9hnc1oMg#8_(_{fN&JmVQDTs6EP;)`EpA8m<%69++-8P}2}W@62h-nq zIK2^8XH{BUWV~3zMMQ+l$E5${=dTHk;xUNMt9UhM9u}}Zk#9xM-=w86^GGX2-L34l zR^#4?u;S4W7zMA;fx`^kt~mTIM<&b0I#z2^{tjoxB(+c4`MXQ~)q>a_gjql%o{I4k zU9bx*-I8Vn0MTqc_r^{4q0d#Zt*9)s#)|1r8YAyy48nRPIEPN~)9zWq#OBM+m85sy`U9Pe$n zSLX##hRftiHVVzOc$dz*!5#Lx!MycY7rtRN#lj?u5&gDyDOnPbmu zd0{BR*nuPC_t_8ppmpNx2TBt|{;KAlz<)W{hQ}6tTu)7S6z{3@O*vTpQn-kf7NxOg*Ch_W z+Wl24a{S1i)0-SXhCxLUm$6+3SHg|oz3}sWc*=y&schk7YB#?Bk4kJy5uob$L6M&{8#rfRQ>Y8m=9&} zT!C#3T}B$oeNbD2%PIa@gA!Qp?v#4^t#aV@uqIbXb2Vbl!2Q->so7R-m%F<=la7%X zcp7DTG8CLngKdwkeR8psU|d|ptzFSm9AKZf`?kV`3)+R7>J#*9kV}8u?yIGE=r=0?O4>C02S3!YTHi zYK^=mF$-n|dxhAyGy$GPyo16E?3klaif%aVK>i?~LmJ_zlmh?l#ga0!k9SHiygiQV zL#al0m}u;92WCKalFHUnyKTw z{hzMD zfkcKd$wm9VB2ma)_N$Q>M09m}$Gz$b=)n&+TXC+>mm=fGOZ0QI&brD$ZNIOr z;k-mv>;szh^*53F*#QPywM95Nf-PCr6Vwy`CSlz#KKIu4ZFlUYi*B#t`ay)< z#ED3-*S4#nfw||k?0U>EuGSxZ;$aQGzlU7Rx8)cG5L<;Gj2vbF12ddAY}D}7z38ze ztDzRjftk1P@S8r|Q|7KuCd(&Mv$k8%Y#a0>cn58phE9&PC7)b zZM|!?==;yI_x?_DuB{b7_?CA9;H!;9?Ua~!L**-9uc7AY?T1EoH)CWqG`)@ZaZ53x zQ*OL*+Tu*kXJb}RggCvtM;)hI>2Jl={FwwcC7ALlf{n9 z8^4H=ud_^ACa^&}33Ywj=Ehm^%Qqih-Zu?aewCE+*G6;;v9r&&9r)M?-0$M@>Eb-s z?kD-2&d04B%CF*?hcg5!?oh=2l`aL;@P{zFpe#0{5l=wBPOYY4Wd|@(BN1!8_1z;} zzISM^2bKQGb}lDQHkPrAU(q_7?$5m+t0=JJ&cU1Q7L~S6vp=@R_m?R|hD(?QR}M~d zt0l@r?e5VGN zbXoCgtX_}_Nw+CMdCJ<;P(E;lA3XV#I1#2ExC2!3o-$OBOc=pzAE3rcbO5P z6;{^smR4q#bJCtOdJIn<#;MDDroPi!y`l82BCl?<3lL4Ng(KsA^fxZA!SE0AZL2{r z(&&4pv&M7l&n8JOWdn^bdHJ}SZ+*WJgI2guswXOSB6#t|8T@G>f}xoMm~*M`PnV5< zM~Uy3QBiT`uB~nU*}%&j^u%L$Owhi%-}5JBhQxFSBWqK4JD)wjE|g|eY4`E$MaQN> z^+29suU$x$wzjd?+t{V1U)5PoN(-F(oIA`U0@9`6{-PM8P z*rfexjP>z3*?VAm!9y-1jP?vX}H1FapDq% zMl&mwkjx>n;~>`NG12z}lg`Ecx9R^V(i(Rjac+j8aR&yMuZX}BqUDRRliT*~nVU8# z0uuo7A6nZUp1E4v-P4Q7*j7uITbLYAA|xA~-kq4rY2+m2P|$MZeohAQhU4zH;Z7vz z-29X4Q=z|fFix90{%fAxkMTm^We%dMRv>$KM8%ZHME=AWi7DboKlpK)_{UtD3g&~1 z3!Ty&miPwdzXYMp@sfVy4T70mrEz^{9o1o#SiL3pVc9LVQ zy@6?Cw|{2gdtyMH7L-ogcYC#16=t((XlZHAZ0cM)-+a-f@{fWWmd8dWy=EHeA-xqZ z^}7F52EGe1uQuhPEA7N^sis$Is{SBPZMJ5Sd3bf8_afBX`NJS@Be5D_kmf*0Tb|%{c)#sm9l&{9+skV$9 zD5vI0M-pFN5J<3T5L6!?RFu4nub97M-Zx@w6?f86)Wy20hvFbyQCUpP9%jmT17D*b zs7N{Y9`-fcKWf=Ts~|1N=)B`Wv?6_1lQ|3$87LPkLzU8^T`?$^=)T}r=vMHkxqsL* zF7@|Z@!&MDy;q^SLbu***F4=rWV~G&&R`I3Y>`^sTKJEGGE?4@RZ%|5tH4;cs67jC zpeJ+aXpKXzn51JNF`mTeUJMs9`gk_eA6c6_YV}H~uaE}Su4>GG?*`2~(^}MpF_EeV z$)?KLMOL*J^1hH*h;nb)dwR2qoft4OCj>RLB9-?e);Ds^oiP+jM4%}C`#IV0dM9fjFk@}Cu8m8()3CU`=i|YLD%Zv_ z73qomQ^!l@0@7U;vQJWkY>*8jv0X~EO}QzHGX}Ssx8}~ib1AzI{#KFXnWQ~p5EOO9 z6-2tLTQn2$=N^&%_dkj|U?D7$@l}a>VOMpI+;Cf6w3|SNfZuz;PsvSQh4`p5Os9ZD zJkkHgDQFLn{i%t3Ohs1tO|8(_>x`FC4gRSr8Cp;|@LRY*@_VVW4+_8a5gCisYW5Bq zAoytqkLjpJ&H!<*mxzLYmKxPM6r`7Ei9%!{fj5GBF06uBcd$!<)5I_rYTg~Hlib$2 zkyP#70fnpHzGTI1?uOx5IuHzidZ1qZY@+hm!?$IN^=`SV-rf;jeo0gV_f5$;d^nwG zHnP~Wbe9-4{g1-n!nkWG?1mM5*7z-d=j~oqtJoO@wvBdb1GKoZ-s+%}c(p)NlDoic zPW_jE6hT~(A-S;ZdPwyEt69fOX*<>h{_Gr>mrKwVVo7SM3%AbMK82ddF5KzwFO!`N zdc1%zt{5{9?mO8tU6DbQc;DB12M62{=TN$gAW*+6AR z8`(T3`b9I;wd~7^HtcgYVTqIfd7&{9#*jl=be%B9Lg{ zeFOtY+>B{|g=~;nb1%lgGDB;!RzGEQU6l{Zs^=aU4NM>0Ojj$81{R zrr#sC-;8|2C-fejg?&Z)SbPQWzrw!;F1w)V-(kMgFH+i2Bxj5x9(Jo|9-MFmeCIKa zZB3D_?e=aeKwJjr9R5}DbR&4(pH(bUo90TzYbe_0+s;`UNP2B-@_*0gOQm>P z(fN^FI_%szScj)0sps^q4MNfzIBnrrmv1ZyCvYb`9A`AP>_p?aZgcORweQNLoPD2Tj!}Ys(RDnF;ZMP5@gAu* zt*Uv;7@6dT-)UB93H!&Ekh$-ArMp%*P2R};eJXP?Q#Geai zhD~EkywgS0TjF^mJ0?~gLv$k@k0QRH(Y#Q6Nb_rx>H1uH#f*j|yoTS)mC>-QtU=@u z-=MC?z+N-dJ|o^-X!^v-ePGs8$kE9Xw&D~h>JBg%@-S=i+*gQrh|iuhS0sKUc-@AhT0vD0t0rq*GbSw{2XwGuCs(5M5;+&V}X4Y#HNuOP7S(Q9$THhO@) z4t;Cr4I$H1@tvyN!wtgO$ae1;^9jHOx#W)Cm51@?!j^gkrkAK%qenKW5t4NW37yP1 z1E&C0<=KWQKVyoh>Pk(!*)Ny%so6%Gf>B!@TAFg&Dyv3YxcB=}v zUWyf(WmA#3@NIqO%SQJGafZ0=GHYpzh}jQKkn);c|( z_C~P<+RWOL?KYC5ZGy3xBmc4*5QUvnMZPc{{Xl>5f9FN{H>^BebtvxL!(&E!^tnZm)khD#1Q2B+ig4>76ew-fl z<~rruFNv1LRT9=2u(5&1Pu9II&e>wL)1zJ9UzTJGo`m(UGPD)1E~a>T5T_eO8h$(R z71xG*AE;_pS624z07NnwO;mqp_?t&ti+Oezl2>@xd&eSj zzmW&hy$at}H{K7{tgbEXXSbO)IC%4ryn+v7pGxw-iJlg<@Lz+p9a_Z7B-L$NS?%O) z@CFiW`Bd@-J7=wHlht&&no07$sWrD}p~Z-!3AYK~Ud^ZXt2OdErucQG=xo>C8Sxy~ zT6}B0tZ&pA2efjh%Gl$E3VyvSocMux4diyxNgF|O%6zHF^4Y$Jy>ixf5?VdHkjT)i z&K09m@_tp@d^OhQ@urz^qv}FCiyMS>Wo6`JBw+R<)K{fblC4EnF;RBudtbhKAK>T1dwmmH(eJHwZxU+~t%diJ%l)Spml}c? zfEqa8a-F2$zc{bZFNIn|U-)fGg;aT)8=tSH52tGRul8N|FQ)i^!dix(e|M>PnS4K^ zX_~H$HnSpJO`})MyrV`+s#ZJd8cnijUI1n=Xvh zA$Qa6?tM-cq@|YLNpI7)OPXzG98;__4YDgQ%tr5*Jduybirv%gZ0xRCKHyg%mOp>j zuh%?rTztB{!)htUXXDnT@Y~`9x=earhpTCA;cNX(t#t@w zWivpi(Vfw{H~^E77-VpAIIpIK7WBVMo_pntdF*zd5`HUb8h44Lv9z1}TTp=vvPEQu zSBXI+=U^ce0sL4MH^VQ9-WTyj?3Q!fEuO6-i4C3Nn|qW@WIo0Na6Y3Vz7mJU`lrOL z1iqjjV|2xN6*FuLtL!;t>!t7MeZFTN7c{R^M3(-0f1k+x74cS@A$Bpxx;Elf z{`fsf$6gO_O2E6f9#G6o(YGfDYje{+qyGS}TrceN@e@(kz9VYdMZ+s;vFKV(vu^`4 z$@W=pt;CWdGqHaxHg<+)AaRpkn{fi%+sMtv*_7aP!5PJRvZL(ZCC;if6#oEu-15I4 z+M7)p@lrKnC5;Y8IXw@yJw<#|`*`?Q#8-Zm;8UkC`>X65#!*{6ad$%kW z(3xZn?y3(TUX|#+4*i~dS@9cp+Z#>ros4HPG^%bclezuUbpHT>Fao{r*w(qZVv?~97i=tuatjR`5!+ef};yrprbc$<>v9<@t43I*0=RExG-%9!7_gcmJpE_;s*nZ|RAjLu2LOIG z-RoZmv>U$&TxyZpy`9oHL*z(8I3u_@{VUD&Um0pzCX4o4dzmA*k(G>K;AE4}6@?1) zH51{#@jbD z5`3pQ{n*F&)?Mwx+}txW9uzS4G~Fgc4bp+?Tc66VQjFe;%dw;V4&J?p*rb>a`O zd^YiRmG(Ocpw?2xIV6@H(!e6PX-AaV`AZ%c_g*SG+spJczq@pEns$!R+D75GD-Era zj2^lAdy0bk4=P=onOTo24}b8h78AA4%HMS)+A7txl1%cuZrq{2O5pa6?Xw9-smWjH z*^#7WQaRo2{{Yvf*jo!=cA@LkaBEjkj0<4g{oMX_mj&BFa`CP<_Q=jFbtchqmGldu zu}E7i#ecfkB=r1h88xL{qcO8C1_%t0Eq9KQq?dJ7LipjtHT@t#d@#o``|eI4X!QLy=QGSm#MzV_l8)z65fWqZtiwl z{y*iLVSTI7JSrPj@b;(XNizMO+DXtWoCZ(;JpD~YNlq)=b~$m9mnw>OPjf@|jPVR{ z_^Q_O+`}XJ54y!;c0WWKK)QaVExc>{ zrA7dHW06}Q3+@M$CcCyd`L8Xd3hy5$lC2bl za5yp$deqvMi6nQ@0;N1hreq*3f|q%lXA|IqjDq}QG@C}W5MH^ z_YaAhL^?N#bts`6p{@80Kk+Q^i4Nb zxYEC1-AZU=Wt09HLQ}ic-uUUw$Nlw+`P^m+QgXL<{{XiC0GagEaSo&x_fgq@!6H5| z&El_(`nSUC`-tx}zl}Z(ztGy=SqGPQsKaW~+a?biV9RGBbdtn00;_s&THYX+6Mgm1OEVmlX!|>2*(bF zz6tTxoi>jZvh9x1mOD4#dKPCSci!H$_xHjN*@MErw4eMJr{mX!{6P)nzMrA$GvC-r zVK2=t#>}C_&@QQ z9ai?n#>Ew_ZoWh;_`&}7=06(xgZ6##BI%l?#f**$YAd;R{m~+h-%($mAF{=ydX2Z* zqzBA~Ld$}13dq2J=p(1;UugJWQIgIpd#JX@JT8)>0nqLrrzXC;Il{rg#UGd8>Pb|) zJ-ft^vc)HpB#5kXd#U=0@*mn`;S_%#e`oI)cqNh*lf)Wx3rS34_cxG{HM8TP+bS+S znAfsu*DO(beAUeA=j_ks$MVSxfzXb}8UB^=6z0#MjNLgZk=;A}$MS#i<4n~w--(YN^ z-`gX@-vWPQ?-_VDTit3u5Nqb?Qql`8*7JF>GAkMP0K70H5Kr#$+*i+jGw}7lhpypU ze=}^cNW?MDHns*UQqRG*vv?+J)_adKD9H#IZ9FOGjQ92IE2359?LDVo_!bl)MPZ?b zv*k@S>wB-n+Wn6HDe3Ljror}$h|kJGs$^s^QiSJ##MPhM zH{-ph?G^h&Ykn)!B)*qVxQ5!=2E0v^%CN$yS(lx=m@&qB8s)wgcv9EK+SSFi<4mZq zNhoNWYXY&efza`l1L#e2-Z8XYA5_&XVP@H8@(9_vZ3`7gP9IwO&b;b8 zzb*d&L+Y>D)8L)$&%v(^>Xx?u0BM@;2_^DL`=z9Ap64Aam-zAUS6b8Inr%|r?%p*{ z1gbKl-_Tdv{{XZ{z?~1^C+zk6E$f~aH~M_uJ@6%^_N{OBg7)oluv^H}AU`rQnOkrT zw}FKRlcD=f_!~{uwAkUehs;&6Ny8KK2Eflgha7`nZI;ueJS1tgt6QIpW_3QXh?RJ3 z+tK=;p8o)_7sQ=I_E7z%FFaYN+b!kxn{69kY3+~roM}u--M|M;#Rz3RnHQyg@q8HZ zcY*#fcsdPg&&D1Xk4w~my3@Yft6JMg*6gEUb$J6TbquY74SorHXamC^9rUZK6AgfxEvd^zyGp<$%yzuF!muruCV&2F+t&*mORcpV37`P!Mq ze6F;x^z~Bw8vg(^ZGqtYCU=IFdacFL-q!b%>GEgpzM-f1I^I}SJXhfMG4QSZxoX)x z#(d0V9+iQr_(wt2g9!Bx4am)$`C6^BZuk5Bk3ao-{9^r{lS=rR@Y_(+HE#|0c1Y}A zIboVBAsonClgKzeoP)(`S^PBcN$58F?QgdYbqb#NH;-o&7-&2S_tKYi1=BC;xgl-99KKw{{R$Tc+15e8Iw?x&tL6}TZ0+@09MYgfsyHs z)ya*=M;le*Ae?0;p8b3Jo_w(DE52D5%&EI3{T7~w)V~iuXulkM5b+MFCY|F1v5jW9 zig0b>`GYx-?ikv~bCL;O3mW;tPud5>Ixe8i51-}vl5Lfxa2Nu61C9yLw-xu->@DGK zBgY@`P0x$oGt@L)7URW!7ZB?9dZgNXHx~@k>uqTyE@f5?34wM5z{W`g91;1as-Nut z02yo6Hs!7C*8c7ki5TsT7IzAxIXD0T^cCu6**#o75|$=aoRqY-s^08nz1{SZT{TCK zf#O+Ws#K*4N(v80d);$NI;$&d7p2~hbM1fGo5G(IzA5}Bu<>4pb>r`_-$^`jPoqma z+rqIn8*xzBM6RC8MD*3)bJNCgC;Kc{vr*-~t9R>vL)<tAfTkr`!c=4q@9WSzS)h7Jxn>4A!|5AB)pFGrb{FNzxV#A_*BOAzNDcb&cZb>hBc zlTD9EhWA^yXNvMW=Y>E&yV@Azk8BKcS{@wn1=hWFW9L5KI^Zz~Hi7ewmEyXU68D>L z)tE;xoTQeP^gn9<0N|JZ02(d-0BR4|`rk{r+p74>z_$}w-@7uc(?rf#J9N$q0movd zy;oI&-rgw{T1f6A1!ar_lGwomwnrU3>+>`I3B%)UOW=R}6$;-+@cq=5`d5lHD&ZHWfy^cJ`0}69hDXVi{ z>&KpA58z`+ffa`ebERJ7D9?aCqKx{3D-CVz9hf@aMw66*SFv!&=mK z`lL5j7Sr4)Lmpzek91Ng$^HJpDT^E zwe0Ns>)-G^YSxO{Z+cZYs9-AUrB zTb(u?TJk7G#jUsk-{g%~2XQ4&893u4^c+{k`kw6%TEC7NBxvntXwW&%R1AQ9abDf< zpTpMo-?OdfiYDJKsSc<11l&iKvH4-X?mFc4C!iIj3#oI(?X8cnrHJ=ZYW&)Mr!Rdi zzL~4}8}06PGc0WjVL>N7N2PY(4Lmie+w0S6I(?js+Y;zpMBi{I!*kQy72!G_xjpy9 zNMw`CVKj=Z7+fb@XCAfmMvdalM#>B8JA1jUW3T|k(H*Q#{;k;lRq{MXoYca$;}qN5 z%To*v!PK7d!2-QGT>;mtng z<7~5BK&D0`?{a^_y{;Y2DP!omiX5_A{{X;$@Dc8RY*xq9aH}U}wfY_(CZG0wtNX>| zk-0g~y>(v=JQsE1?L}d?Yj$n}8Bdn0{_*YguDNvETdSr?rlkb-x4jYb`V4 z9-Sn1cI@A6jyB#2-mQQ^=ia`9*`;Rox<`wO!^+&SdY;MqK72FPtbQNeX?nD6qqVNt zENT?M$RI8cK-ld86U^rc6rBY>NQ;s)ZARh zd8AA4(>;b_j3RUUTj z`u_lzL+20L6Twa5D}#9ik;`$9nfPxxbN5(#ewF7R1^i=w2a3P2Zl;FT)ubP0WVbudRFM#eWUj>7FE;$yQM&T!7pIliTpGoBk^4@!RT_w~?=xG_n#v#&L$vfhn$vZSd*QCLp=&xV_0Es3X;&X=vblhTlG1VVmLvF;zUc>oq>lCa ziTfpg!9+YG@t@%6)jU`qy{xf5Vo(B>0=7+TO;u5leHAm;%T#o(?MIig;K# zMO{5?DwryG#}0d@w9x%t@kjg=L*d?-_ZIqIqi3p5Z z+W4piZyR_=N3-t^nJ{^ev6YD+eKE~`YkXhVuYMoL;|r}O>PuUTYfGexOe~Eac8r3+ zoPbUZZG1}CE#_D_hwU-pe+O$9ULesvB{qw!?ow|pH3^}+d;l=blCRuh z)Qn(Pvv?2w3xM7WMYq?yMd5!RS;7_k>xd=O^$%~}LWU<{$0bLtd@=FL!VMSU_reRS zSYd|i#2yn#^(lf4_p%7$VD5Xc+$s8uIF8GNU&iXzqGn z+K|OkUec6*U%dL8{tBJ@K>QE=t~9%U8+c_kZvgyKNuirlwYjk-9~N5}_AIM$8QQZ( zHvG<`%tgWIG4YP6;JbZMEM{APB>`rLyt!cg0bWl8`cJolW4ln+XjKJ zK_!l>EE`!_N&BxJ2rJWu83bezUVr2N00jR4Yif6rX{#;2*<5*2!6q=Hm3}ZcV+S}D z`&IGd;Xi@(?}s|&t;d0UDdpZlCA^IlnTAFAG96tQGPocRLHz6SyI<1nw2ekhDPr^O zQeCU&$n4Abf-7uHeVdG+^yz)m@_oAZHIKBdNvuLkn@c9zwYuFS>Hh%uCTIK<7Egs= zw4Q+eGriN|lUmdN0I)7^(h&*sLys-y+r*w=3b{O~QPVv7Py82q<1VMJd`6sgJRIjfwe0>1 zlIP;z!JT^l09@2HOUvI4-a}_^F};wq@VD?v3lP9|I0w|4_p)hQ>M$QK83DF zad9o=Cu+!p%Z)6Vhd3*eeRmr6?}Q(;&Wqy&b>&OL*1V%1#qv zypHnPU?#XQb08c~oEIwh1;OxuTse4K@vy^&S_UzYwy-&*j03QC#`ftOn9^&y^ zQIgr+(itR_Z3TJQf4V~U<0Fxp_=i{hrmnTQ^(BWzh6rrtXsu>eZp=U=o`l!z2kk5H z<40cy>-SCeqp1^=uW!6}iVXbHJ=u zS5`kamc-$?4U8NgQC?G~o!R*PTGN}nozKy)*!SW0hCVT9*7kRrg2yB(sNwX)Pyqyh zWi7b38Qc_#_Dw_fJMhkurrl|anvhvr|zHc3ddUzZ~EPX0?%6E+7l#{)`B0q|s0{;NvU+U2#Pj9Vg_b`i{J5{wit@Q{P{E{nw z3CB=*Q;OYA(p+zFVo}D#L28O#c9^2dB{E zkD#wi_*MH#_}AbMlDb{@_Lhe;f^_Tr%>d5?A^Xw)0KjbdXRiib`!_hgSQRpm-aMegi`nY@N2|uw{b$zTr+)> zQi%w+yaS*=+>_N$>MN)5Hk!IeiS5;5}+QHuI^_AU66seaJ2 z-+Vgpx7qwj;n^&sarV^Ta+%-(CUf%j1muI>qMDW+UZ2C+{)f-;R|(*A>^z}fDO9$P zy}R}F>c0c>^G&#u!devZhI<`z?VB7j0+4jya zhkp|+?mSuW#3s+O7W1z(D2e5)*^cR8Q-kCalo;4XFnf<3{{X=pJ{b6_#vMlMUh($n zH-6)V9bcAI=k{IneHym0lJ1|Ax%@H2Rj|B2nk*$rPnHd<#@D;)?`Y%X*O~hF@W0|F zlkr}|Me%=u^{YP=co$u=2G;JzQ6yp4p~1r|9zz531{h!uHRxU(yS4F7oA#SkgvYp{ z-yUR*hYYL_MjbIehU)0^~;1 z;cfu`0G5Lta6uLN?IqR6f&4XdtZDZXEZ0o8FAJT}2HaJ!y@L+8J$V?fBRt7o8ndGb zUu!=v?|J#H`)YlzL!5nY3k+1FWh>o$mfgKB?cJO|kH2Z(AN&{bLDBWk2I=-TR}!*m z`n9~zJ&n@j>`>eo=Gro2a5MZQ)@c2uJW=8cbN>JnMYl%eJT}5SXSPTrVx#{6g0pIq zx9oGMDoD_@mvBlRGqvM*(dI@|*sG$E^sk$LWPgep$B%v(cwbW0CR>ZmN?VINhb#BQ zEXuErfyf-=gXk-4zY9YXhW6^5V-{Pn%O{{X9f1|pqGG@~^p(`|X^eE}zmHEl;x zj(e>}^5WrG?GoHGD`WA;;atDRUw|GJ{iwV;+Fy#a+kHWz1i?8$_M1XRH$^8=^c;GM z=`=el1w-!Zt^lf>`qU)u30LPnsnWp(Dpeg<7l}}d(n6Dzec+=&riqwAL18=8chlA zwT)X)iD9v|f);zrIg5f$)X5FEqkYm^zMA+^{{RG(_?i1p{3be=jI6XD0pDFk2#V(N zIV8Nf+ToRMVUG$GP7lqJ7y>a~iTeQfC&T{$vbLYC$>9$V=(e{BV{3M9XSNc~=1El< z44g4cbByF3_4-5L@AR3bSqWmweqwUn0qgkJ*4h|KUk&ADcJ}Y0{ab#WPo2&1xc5~? zrDUM*q++h`ZRIQ3e}yN0w$S{@_-+3H2J85X!>9W!=h)g(a-%L=@5`aj9vQ(pYBd)>UwYEs+g&?+tbhO6C)WiB literal 0 HcmV?d00001 From ff43209d8a13c573dba6d7d207c6d521f3dad81c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 26 Sep 2025 17:44:24 +0600 Subject: [PATCH 203/286] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B1=D0=B0=D0=BB=D0=BB=D0=BE=D0=B2,=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D1=82=D0=BA=D0=B0=20=D1=81=D0=B0=D0=B9=D0=B4=D0=B1=D0=B0?= =?UTF-8?q?=D1=80=D0=B0...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 61 ++++++++++++------- app/components/HomeClient.tsx | 2 +- app/globals.css | 20 ++++++ layout/AppMenu.tsx | 6 +- layout/AppTopbar.tsx | 3 +- 5 files changed, 64 insertions(+), 28 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 72963f82..5ddfc95b 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -10,7 +10,7 @@ import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { deleteLesson, fetchLessonShow } from '@/services/courses'; +import { deleteLesson, fetchCourseInfo, fetchLessonShow } from '@/services/courses'; import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; @@ -36,6 +36,7 @@ export default function LessonStep() { const [formVisible, setFormVisible] = useState(false); const [types, setTypes] = useState<{ id: number; title: string; name: string; logo: string }[]>([]); const [steps, setSteps] = useState([]); + const [courseInfo, setCourseInfo] = useState<{title: string} | null>(null); const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [selectedId, setSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); @@ -51,6 +52,17 @@ export default function LessonStep() { router.replace(`/course/${course_id}/${lessonId ? lessonId : null}`); }; + const handleCourseInfo = async () => { + setSkeleton(true); + const data = await fetchCourseInfo(Number(course_id)); + console.log(data); + + if (data && data?.success) { + setSkeleton(false); + setCourseInfo(data.course); + } + }; + const handleShow = async (LessonId: number | null) => { setSkeleton(true); const data = await fetchLessonShow(LessonId); @@ -140,7 +152,6 @@ export default function LessonStep() { setSkeleton(true); const data = await fetchElement(Number(lesson_id), stepId); if (data.success) { - setSkeleton(false); setElement({ content: data.content, step: data.step }); } else { @@ -212,17 +223,17 @@ export default function LessonStep() { // if (lessons.length > 0) { // setThemeNull(false); - + // let chosenId: number | null = null; // if (param.lesson_id === 'null' || deleteQuery) { - + // // alert(1); // chosenId = lessons[0].id; // setDeleteQuery(false); // } else { - + // // alert(2); // chosenId = param.lesson_id ? Number(param.lesson_id) : lessons[0].id; // } @@ -237,7 +248,7 @@ export default function LessonStep() { // }, [contextThemes, deleteQuery, param.lesson_id]); // useEffect(() => { - + // if (!lesson_id) return; // handleShow(lesson_id); @@ -282,7 +293,7 @@ export default function LessonStep() { // заменяем первый useEffect useEffect(() => { console.log('Обновился ', contextThemes); - + const lessons = contextThemes?.lessons?.data ?? []; // делаем "снимок" важных полей (id + title) @@ -342,6 +353,8 @@ export default function LessonStep() { }, [lesson_id]); useEffect(() => { + handleCourseInfo(); + const el = scrollRef.current; if (!el) return; @@ -363,7 +376,10 @@ export default function LessonStep() { const lessonInfo = (

    ); @@ -379,7 +395,7 @@ export default function LessonStep() { > {idx + 1}
    - +

    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ⅈ^iSMjA+IJBSxyq~BtG7rSPv&D5)t^u&DYVU8-D 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
    sPV*{-nR0ODrq%hV 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

    ); @@ -449,13 +465,13 @@ export default function LessonStep() {
    ) : (
    = 6 ? 'right-shadow' : '') : steps.length >= 12 ? 'right-shadow' : ''}`}> - {steps.map((item, idx) => { - return ( -
    - {step(item.type.logo, item.id, idx)} -
    - ); - })} + {steps.map((item, idx) => { + return ( +
    + {step(item.type.logo, item.id, idx)} +
    + ); + })}
    )} @@ -465,12 +481,9 @@ export default function LessonStep() { ) : ( + > )}
    @@ -485,8 +498,10 @@ export default function LessonStep() {
    {element?.step.type.name === 'document' && } {element?.step.type.name === 'video' && } - {element?.step.type.name === 'test' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} - {element?.step.type.name === 'practical' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} + {element?.step.type.name === 'test' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} + {element?.step.type.name === 'practical' && ( + contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} /> + )} {element?.step.type.name === 'link' && }
    diff --git a/app/components/HomeClient.tsx b/app/components/HomeClient.tsx index 72df64f4..f51b22a0 100644 --- a/app/components/HomeClient.tsx +++ b/app/components/HomeClient.tsx @@ -49,7 +49,7 @@ export default function HomeClient() {

    Добро пожаловать на портал дистанционного обучения!

    -
    +
    {' '} Мы объединяем проекты университета в сфере онлайн-образования:
      diff --git a/app/globals.css b/app/globals.css index 898ff8e9..3c6dbfb0 100644 --- a/app/globals.css +++ b/app/globals.css @@ -47,9 +47,29 @@ h1, h2, h3, h4, h5, h6 { margin-left: 0; } +.scrollbar-thin-y { + scroll-snap-type: y mandatory; + cursor: grabbing; +} + +.scrollbar-thin-y::-webkit-scrollbar { + height: 0px; + width: 6px; +} + +.scrollbar-thin-y::-webkit-scrollbar-track { + background: transparent; /* фон дорожки */ +} + +.scrollbar-thin-y::-webkit-scrollbar-thumb { + background: rgba(20, 152, 229, 0.4); /* сам ползунок */ + border-radius: 9999px; +} + .scrollbar-thin{ scroll-snap-type: x mandatory; } + .scrollbar-thin::-webkit-scrollbar { height: 0px; } diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index bcca6145..e24bc9dc 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -371,13 +371,13 @@ const AppMenu = () => {
    -
      +
        {model.map((item, i) => { return !item?.seperator ? :
      • ; })}
      {pathname.startsWith('/course/') && ( - <> +
      @@ -385,7 +385,7 @@ const AppMenu = () => { Всего баллов за курс {contextThemes?.max_sum_score}
      - +
    )} ); diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 2fc415b0..b932b2e6 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -141,7 +141,8 @@ const AppTopbar = forwardRef((props, ref) => { ) : (
    - Сайт ОшГУ + Старый Mooc + Сайт ОшГУ
    )} From afbe6fe3fee39111b9891fd0bb1a37bb736864ba Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Mon, 29 Sep 2025 19:04:37 +0600 Subject: [PATCH 204/286] =?UTF-8?q?=D0=A4=D0=B0=D0=BA=D1=83=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D0=B5=D1=82=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5?= =?UTF-8?q?=D0=BD.=20=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D1=83=20404=20=D0=B8=20=D0=B4=D1=80=D1=83=D0=B3?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 25 ++- .../course/[course_Id]/[lesson_id]/page.tsx | 72 +++++- app/(main)/course/page.tsx | 6 +- .../[myedu_id]/[course_id]/page.tsx | 21 +- .../faculty/[id_kafedra]/[myedu_id]/page.tsx | 20 +- app/(main)/faculty/[id_kafedra]/page.tsx | 211 +++--------------- app/(main)/faculty/page.tsx | 5 +- .../[connect_id]/[stream_id]/page.tsx | 94 +++++--- app/components/SessionManager.tsx | 2 + app/components/cards/ItemCard.tsx | 4 - app/components/cards/LessonCard.tsx | 9 +- app/components/lessons/LessonDocument.tsx | 43 +++- app/components/lessons/LessonInfoCard.tsx | 24 +- app/components/lessons/LessonLink.tsx | 30 ++- app/components/lessons/LessonPractica.tsx | 96 +++++--- app/components/lessons/LessonTest.tsx | 41 +++- app/components/lessons/LessonVideo.tsx | 115 +++++----- app/components/popUp/FormModal.tsx | 30 +-- app/components/tables/StreamList.tsx | 8 +- app/globals.css | 1 - hooks/useShortText.tsx | 2 +- layout/AppMenu.tsx | 11 +- layout/AppTopbar.tsx | 26 ++- layout/context/layoutcontext.tsx | 2 + services/courses.tsx | 2 +- services/steps.tsx | 21 +- utils/axiosInstance.tsx | 16 +- 27 files changed, 482 insertions(+), 455 deletions(-) rename app/(main)/students/{ => [cource_id]}/[connect_id]/[stream_id]/page.tsx (70%) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 0b184ae0..35b006ad 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -16,6 +16,7 @@ import { logout } from '@/utils/logout'; import { LoginType } from '@/types/login'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import Link from 'next/link'; +import { Button } from 'primereact/button'; const LoginPage = () => { const { layoutConfig, setUser, setMessage, setGlobalLoading, setDepartament, departament } = useContext(LayoutContext); @@ -23,6 +24,7 @@ const LoginPage = () => { const router = useRouter(); const media = useMediaQuery('(max-width: 1030px)'); // const containerClassName = classNames('surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden', { 'p-input-filled': layoutConfig.inputStyle === 'filled' }); + const [showPassword, setShowPassword] = useState(false); const { register, @@ -106,28 +108,39 @@ const LoginPage = () => {

    Вход в mooc

    -
    +
    {/* */} - + {errors.email && {errors.email.message}}
    - } + /> */} + ( +
    + +
    + )} /> {errors.password && {errors.password.message}}
    - + - - + +
    diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 5ddfc95b..2cc76c20 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -10,7 +10,7 @@ import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { deleteLesson, fetchCourseInfo, fetchLessonShow } from '@/services/courses'; +import { fetchCourseInfo, fetchLessonShow } from '@/services/courses'; import { addLesson, deleteStep, fetchElement, fetchSteps, fetchTypes } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import { getConfirmOptions } from '@/utils/getConfirmOptions'; @@ -36,7 +36,7 @@ export default function LessonStep() { const [formVisible, setFormVisible] = useState(false); const [types, setTypes] = useState<{ id: number; title: string; name: string; logo: string }[]>([]); const [steps, setSteps] = useState([]); - const [courseInfo, setCourseInfo] = useState<{title: string} | null>(null); + const [courseInfo, setCourseInfo] = useState<{ title: string } | null>(null); const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [selectedId, setSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); @@ -55,8 +55,6 @@ export default function LessonStep() { const handleCourseInfo = async () => { setSkeleton(true); const data = await fetchCourseInfo(Number(course_id)); - console.log(data); - if (data && data?.success) { setSkeleton(false); setCourseInfo(data.course); @@ -105,6 +103,7 @@ export default function LessonStep() { const handleFetchSteps = async (lesson_id: number | null) => { setSkeleton(true); const data = await fetchSteps(Number(lesson_id)); + if (data.success) { setSkeleton(false); if (data.steps.length < 1) { @@ -149,6 +148,7 @@ export default function LessonStep() { const handleFetchElement = async (stepId: number) => { if (lesson_id) { + setSkeleton(true); const data = await fetchElement(Number(lesson_id), stepId); if (data.success) { @@ -376,7 +376,9 @@ export default function LessonStep() { const lessonInfo = (
    -

    {courseInfo?.title}

    +

    + {courseInfo?.title} +

    {lessonInfoState?.title}

    @@ -496,13 +498,63 @@ export default function LessonStep() {
    {element?.step.type.title}
    - {element?.step.type.name === 'document' && } - {element?.step.type.name === 'video' && } - {element?.step.type.name === 'test' && contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} />} + {element?.step.type.name === 'document' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'video' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'test' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} + clearProp={hasSteps} + /> + )} {element?.step.type.name === 'practical' && ( - contextFetchThemes(Number(course_id), null)} clearProp={hasSteps} /> + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'link' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> )} - {element?.step.type.name === 'link' && }
    - ) : ( - - )} - {progressSpinner && } -
    - )} - > - */} - {/*
    - )} */} - {/*
    - ); */} - {/* })} */} -
    - {notCourse.length > 0 && ( -
    -

    Преподаватели

    - {/* - rowIndex + 1} header="#"> - ( - - {rowData.last_name} {rowData.name} {rowData.father_name} - - )} - > - ( -
    -
    - 4 всего - (2 утверждённых) -
    -
    - )} - >
    -
    */} -
    - )} - +
    + + rowIndex + 1} header="#"> + ( + + {rowData.last_name} {rowData.name} {rowData.father_name} + + )} + > + ( +
    +
    + 4 + (2 утверждённых) +
    +
    + )} + >
    +
    +
    )}
    ); diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index e0291d87..689f02bc 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -21,8 +21,6 @@ export default function Faculty() { const showError = useErrorMessage(); const { setMessage, setGlobalLoading } = useContext(LayoutContext); - const [selected, setSelected] = useState(null); - const [faculty, setFaculty] = useState([{ name_ru: '', id: null }]); const [kafedra, setKafedra] = useState([{ name_ru: '', id: null }]); const [selectShow, setSelectShow] = useState(false); const [facultyShow, setFacultyShow] = useState(false); @@ -59,7 +57,6 @@ export default function Faculty() { const handleFetchKafedra = async () => { const data = await fetchKafedra(); - console.log(data); if (data && Array.isArray(data)) { if (data.length > 0) { @@ -106,7 +103,7 @@ export default function Faculty() { {facultyShow ? ( ) : ( - + rowIndex + 1} header="#" style={{ width: '20px' }}> ([]); + const [stream, setStream] = useState(null); const { setMessage, setGlobalLoading } = useContext(LayoutContext); const showError = useErrorMessage(); - const { connect_id, stream_id } = useParams(); - console.log('params: ', connect_id, stream_id); + const { cource_id, connect_id, stream_id } = useParams(); const media = useMediaQuery('(max-width: 640px)'); const teachingBreadCrumb = [ @@ -97,10 +73,25 @@ export default function StudentList() { }, 1000); }; + const handleFetchStreams = async () => { + if (cource_id) { + const data = await fetchStreams(cource_id ? Number(cource_id) : null); + if (data) { + setStreams(data); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + showError(data.response.status); + } + } + } + }; + const handleFetchStudents = async () => { const data = await fetchStreamStudents(connect_id ? Number(connect_id) : null, stream_id ? Number(stream_id) : null); - console.log(data); - toggleSkeleton(); if (data) { setHasList(false); @@ -120,10 +111,20 @@ export default function StudentList() { // USEECFFECTS useEffect(() => { + handleFetchStreams(); toggleSkeleton(); handleFetchStudents(); }, []); + useEffect(() => { + if (streams && streams?.length > 0 && stream_id) { + const forStream = streams.find((item) => item.stream_id === Number(stream_id)); + if (forStream) { + setStream(forStream); + } + } + }, [streams]); + return (
    {skeleton ? ( @@ -132,9 +133,32 @@ export default function StudentList() { <> {/* info section */}
    -
    -

    {'Список студентов'}

    - {/*
    {breadcrumb}
    */} +

    + {stream?.subject_name.name_ru} +

    + +
    + {stream?.semester?.name_ru} + +
    + {stream?.subject_type_name?.name_ru} + {/* {stream?.teacher?.name} */} +
    +
    + Язык обучения: + {stream?.language?.name} +
    +
    + Год обучения: + 20{stream?.id_edu_year} +
    +
    + Период: + {stream?.period.name_ru} +
    +
    + {stream?.edu_form?.name_ru} +
    @@ -149,7 +173,7 @@ export default function StudentList() { ) : ( <> - + rowIndex + 1} header="#" style={{ width: '20px' }}> { useEffect(() => { const init = async () => { + console.log(user); + console.log('проверяем токен...'); const token = getToken('access_token'); if (token) { diff --git a/app/components/cards/ItemCard.tsx b/app/components/cards/ItemCard.tsx index 69c889a0..cfae01e4 100644 --- a/app/components/cards/ItemCard.tsx +++ b/app/components/cards/ItemCard.tsx @@ -20,10 +20,6 @@ export default function ItemCard({ setActiveStreamIds(matchedIds); }, [streams, connection]); - useEffect(() => { - console.log(subject); - }, [subject]); - return (
    diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 05814bdf..d23e7f21 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -3,7 +3,7 @@ import { Button } from 'primereact/button'; import { faPlay } from '@fortawesome/free-solid-svg-icons'; import MyFontAwesome from '../MyFontAwesome'; import useShortText from '@/hooks/useShortText'; -import { useEffect, useState } from 'react'; +import { ReactElement, useEffect, useState } from 'react'; import { ProgressSpinner } from 'primereact/progressspinner'; import { confirmDialog } from 'primereact/confirmdialog'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -40,6 +40,7 @@ export default function LessonCard({ const shortTitle = type.typeValue !== 'practica' ? forShortTitle : cardValue.title; const shortDoc = useShortText(cardValue?.document || '', 20); const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 90); + const shortUrl = useShortText(cardValue?.url ? cardValue?.url : '', 100); const [progressSpinner, setProgressSpinner] = useState(false); const media = useMediaQuery('(max-width: 640px)'); @@ -62,7 +63,7 @@ export default function LessonCard({ } else if (type.typeValue === 'link') { // window.location.href = cardValue?.url || '#'; window.open(cardValue?.url || '#', '_blank'); - } + } }; const videoPreviw = type.typeValue === 'video' && ( @@ -143,7 +144,9 @@ export default function LessonCard({
    )}
    - {cardValue?.desctiption && cardValue?.desctiption !== 'null' ? shortDescription : cardValue?.desctiption && cardValue?.desctiption !== 'null' && type.typeValue === 'practica' ?
    {shortDescription}
    : ''} + {type.typeValue === 'practica' ? cardValue?.desctiption ?
    + : cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription : '' + }
    {status === 'working' && ( diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 71a96fd7..99886093 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -13,7 +13,7 @@ import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { getToken } from '@/utils/auth'; -import { addDocument, deleteDocument, fetchElement, updateDocument } from '@/services/steps'; +import { addDocument, deleteDocument, fetchElement, stepSequenceUpdate, updateDocument } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; @@ -32,6 +32,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle description: string; file: File | null; document?: string; + stepPos?: number; } interface contentType { @@ -140,16 +141,17 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const sentToPDF = (url: string) => { setUrlPDF(url); // if (media) { - router.push(`/pdf/${url}`); + router.push(`/pdf/${url}`); // } else { - // setPDFVisible(true); + // setPDFVisible(true); // } }; const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); + if (data.success) { - setEditingLesson({ title: data.content.title, file: null, document: data.content.document, description: data.content.description }); + setEditingLesson({ title: data.content.title, file: null, document: data.content.document, description: data.content.description, stepPos: data?.step?.step }); } else { setMessage({ state: true, @@ -208,7 +210,10 @@ export default function LessonDocument({ element, content, fetchPropElement, cle const token = getToken('access_token'); const data = await updateDocument(token, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.type.id, editingLesson); - if (data?.success) { + const steps: { id: number; step: number | null }[] = [{ id: element?.id, step: editingLesson?.stepPos || 0 }]; + const secuence = await stepSequenceUpdate(document?.lesson_id ? Number(document?.lesson_id) : null, steps); + + if (data?.success && secuence.success) { setSkeleton(false); fetchPropElement(element.id); clearValues(); @@ -243,7 +248,9 @@ export default function LessonDocument({ element, content, fetchPropElement, cle ) : ( <> {skeleton ? ( -
    +
    + +
    ) : ( document && ( { const file = e.target.files?.[0]; + onChange={(e) => { + const file = e.target.files?.[0]; if (file) { setDocValue((prev) => ({ ...prev, @@ -344,14 +352,33 @@ export default function LessonDocument({ element, content, fetchPropElement, cle visible={visible} setVisible={setVisisble} start={false} + footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }} >
    +
    + Позиция шага: + { + setEditingLesson( + (prev) => + prev && { + ...prev, + stepPos: Number(e.target.value) + } + ); + }} + /> +
    { const file = e.target.files?.[0]; + onChange={(e) => { + const file = e.target.files?.[0]; if (file) { setEditingLesson( (prev) => diff --git a/app/components/lessons/LessonInfoCard.tsx b/app/components/lessons/LessonInfoCard.tsx index 95b97536..5c9f3616 100644 --- a/app/components/lessons/LessonInfoCard.tsx +++ b/app/components/lessons/LessonInfoCard.tsx @@ -20,23 +20,20 @@ export default function LessonInfoCard({ type: string; icon: string; title?: string; - description?: string; + description?: string ; documentUrl?: { document: string | null; document_path: string }; link?: string; video_link?: string; videoStart?: (id: string) => void; test?: { content: string; answers: { id: number | null; text: string; is_correct: boolean }[]; score: number | null }; }) { - const { id_kafedra } = useParams(); - // console.log(id_kafedra); - const media = useMediaQuery('(max-width: 640px)'); const [testCall, setTestCall] = useState(false); const [practicaCall, setPracticaCall] = useState(false); const docCard = ( -
    +
    @@ -64,7 +61,7 @@ export default function LessonInfoCard({ ); const linkCard = ( -
    +
    @@ -79,7 +76,7 @@ export default function LessonInfoCard({ ); const videoCard = ( -
    +
    @@ -94,7 +91,7 @@ export default function LessonInfoCard({ ); const testCard = ( -
    +
    @@ -136,7 +133,7 @@ export default function LessonInfoCard({ ); const practicaCard = ( -
    +
    @@ -146,11 +143,13 @@ export default function LessonInfoCard({
    ); + const hasPdf = /pdf/i.test(documentUrl?.document_path || ''); // true + const practicaInfo = (
    {documentUrl ? ( - documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( + documentUrl.document_path && hasPdf ? ( {title} @@ -164,12 +163,13 @@ export default function LessonInfoCard({ {title}
    )} -

    {description !== 'null' && description}

    + {/*

    {description}

    */} + {description && description !== 'null' &&
    }
    Документ: - {documentUrl && documentUrl.document_path && documentUrl.document_path?.length > 0 ? + {documentUrl && documentUrl.document_path && hasPdf ? : } diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index b6f3d25f..e9a8f135 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -11,7 +11,7 @@ import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { addDocument, addLink, addPractica, deleteDocument, deleteLink, deletePractica, fetchElement, updateDocument, updateLink, updatePractica } from '@/services/steps'; +import { addDocument, addLink, addPractica, deleteDocument, deleteLink, deletePractica, fetchElement, stepSequenceUpdate, updateDocument, updateLink, updatePractica } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; @@ -23,6 +23,7 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr title: string; description: string; url: string; + stepPos?: number; } interface contentType { @@ -95,10 +96,9 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); - console.log(data); if (data.success) { - setEditingLesson({ title: data.content.title, description: data.content.description, url: data.content.url }); + setEditingLesson({ title: data.content.title, description: data.content.description, url: data.content.url, stepPos: data?.step?.step }); } else { setMessage({ state: true, @@ -154,7 +154,10 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr const handleUpdateLink = async () => { setSkeleton(true); const data = await updateLink(editingLesson, link?.lesson_id ? Number(link?.lesson_id) : null, Number(selectId), element.type.id, element.id); - if (data?.success) { + + const steps: { id: number; step: number | null }[] = [{ id: element?.id, step: editingLesson?.stepPos || 0 }]; + const secuence = await stepSequenceUpdate(link?.lesson_id ? Number(link?.lesson_id) : null, steps); + if (data?.success && secuence.success) { setSkeleton(false); fetchPropElement(element.id); clearValues(); @@ -271,8 +274,25 @@ export default function LessonLink({ element, content, fetchPropElement, clearPr return (
    - handleUpdateLink()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}> + handleUpdateLink()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false} footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }}>
    +
    + Позиция шага: + { + setEditingLesson( + (prev) => + prev && { + ...prev, + stepPos: Number(e.target.value) + } + ); + }} + /> +
    import('../PDFBook'), { ssr: false }); -export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: ()=> void; clearProp: boolean }) { +export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: () => void; clearProp: boolean }) { interface docValueType { title: string; description: string; document: File | null; url: string; score: number | null; + stepPos?: number; } interface contentType { @@ -55,6 +57,20 @@ export default function LessonPractica({ element, content, fetchPropElement, fet const fileUploadRef = useRef(null); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); + const [editorDescription, setEditorDescription] = useState(null); + const [editorUpdateState, setEditorUpdateState] = useState(false); + + const renderHeader = () => { + return ( + + + + + + ); + }; + + const header = renderHeader(); const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '', score: 0 }); const [visible, setVisisble] = useState(false); @@ -146,10 +162,9 @@ export default function LessonPractica({ element, content, fetchPropElement, fet const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); - console.log(data); if (data.success) { - setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '', score: data.step.score }); + setEditingLesson({ title: data.content.title, document: null, description: data.content.description, url: '', score: data.step.score, stepPos: data?.step?.step }); } else { setMessage({ state: true, @@ -176,7 +191,7 @@ export default function LessonPractica({ element, content, fetchPropElement, fet state: true, value: { severity: 'error', summary: 'Ошибка при добавлении!', detail: '' } }); - if (data.response.status) { + if (data?.response?.status) { showError(data.response.status); } } @@ -207,10 +222,13 @@ export default function LessonPractica({ element, content, fetchPropElement, fet const handleUpdateDoc = async () => { setSkeleton(true); const data = await updatePractica(editingLesson, document?.lesson_id ? Number(document?.lesson_id) : null, Number(selectId), element.type.id, element.id); - if (data?.success) { + const steps: { id: number; step: number | null }[] = [{ id: element?.id, step: editingLesson?.stepPos || 0 }]; + const secuence = await stepSequenceUpdate(document?.lesson_id ? Number(document?.lesson_id) : null, steps); + + if (data?.success && secuence.success) { setSkeleton(false); fetchPropElement(element.id); - fetchPropThemes(); + fetchPropThemes(); clearValues(); setMessage({ state: true, @@ -243,7 +261,9 @@ export default function LessonPractica({ element, content, fetchPropElement, fet ) : ( <> {skeleton ? ( -
    +
    + +
    ) : ( document && (
    - */} + { + setDocValue((prev) => ({ ...prev, description: String(e.htmlValue) })); + setValue('title', String(e.htmlValue), { shouldValidate: true }); + }} + headerTemplate={header} + style={{ height: '220px' }} /> {errors.title?.message}
    @@ -379,8 +408,6 @@ export default function LessonPractica({ element, content, fetchPropElement, fet }, [content]); useEffect(() => { - console.log(element); - setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); }, [element]); @@ -395,9 +422,27 @@ export default function LessonPractica({ element, content, fetchPropElement, fet visible={visible} setVisible={setVisisble} start={false} + footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }} >
    +
    + Позиция шага: + { + setEditingLesson( + (prev) => + prev && { + ...prev, + stepPos: Number(e.target.value) + } + ); + }} + /> +
    @@ -417,7 +462,7 @@ export default function LessonPractica({ element, content, fetchPropElement, fet { setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); @@ -425,18 +470,19 @@ export default function LessonPractica({ element, content, fetchPropElement, fet />
    - { - setEditingLesson((prev) => ({ ...prev, description: e.target.value })); - setValue('title', e.target.value, { shouldValidate: true }); - }} - className="w-full" - /> - {errors.title?.message} - +
    + { + setEditorUpdateState(false); + setEditingLesson((prev) => ({ ...prev, description: String(e.htmlValue) })); + setValue('title', String(e.htmlValue), { shouldValidate: true }); + }} + headerTemplate={header} + /> + {errors.title?.message} +
    {additional.doc && (
    void; fetchPropThemes: ()=> void; clearProp: boolean }) { +export default function LessonTest({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: () => void; clearProp: boolean }) { const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); - const [editingLesson, setEditingLesson] = useState<{ title: string; score: number } | null>({ title: '', score: 0 }); + const [editingLesson, setEditingLesson] = useState<{ title: string; score: number, stepPos?: number } | null>({ title: '', score: 0 }); const [visible, setVisisble] = useState(false); const [contentShow, setContentShow] = useState(false); // doc @@ -67,7 +67,7 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr const editing = async () => { const data = await fetchElement(element.lesson_id, element.id); if (data.success) { - setEditingLesson({ title: data.content.content, score: data.content.score }); + setEditingLesson({ title: data.content.content, score: data.content.score, stepPos: data?.step?.step }); if (data.content.answers && Array.isArray(data.content.answers)) { setAnswer(data.content.answers); } @@ -86,7 +86,7 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score); if (data?.success) { fetchPropElement(element.id); - fetchPropThemes() + fetchPropThemes(); clearValues(); setMessage({ state: true, @@ -118,10 +118,12 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr // update test const handleUpdateTest = async () => { - setSkeleton(true) + setSkeleton(true); const data = await updateTest(answer, editingLesson?.title || '', element.lesson_id, Number(selectId), element.type.id, element.id, editingLesson?.score || 0); - - if (data?.success) { + const steps: { id: number; step: number | null }[] = [{ id: element?.id, step: editingLesson?.stepPos || 0 }]; + const secuence = await stepSequenceUpdate(content?.lesson_id ? Number(content?.lesson_id) : null, steps); + + if (data?.success && secuence.success) { setSkeleton(false); fetchPropElement(element.id); fetchPropThemes(); @@ -146,8 +148,6 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr // delete document const handleDeleteTest = async (id: number) => { - console.log(element.lesson_id, id, element.type.id, element.id); - const data = await deleteTest(element.lesson_id, id, element.type.id, element.id); if (data.success) { clearValues(); @@ -253,7 +253,6 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr { setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); @@ -310,9 +309,27 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr visible={visible} setVisible={setVisisble} start={false} + footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }} >
    +
    + Позиция шага: + { + setEditingLesson( + (prev) => + prev && { + ...prev, + stepPos: Number(e.target.value) + } + ); + }} + /> +
    { setEditingLesson((prev) => prev && { ...prev, score: Number(e.target.value) }); diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index c06599fb..598c2fc7 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -12,7 +12,7 @@ import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { getToken } from '@/utils/auth'; -import { addDocument, addVideo, deleteDocument, deleteVideo, fetchElement, updateDocument, updateVideo } from '@/services/steps'; +import { addDocument, addVideo, deleteDocument, deleteVideo, fetchElement, stepSequenceUpdate, updateDocument, updateVideo } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; @@ -51,6 +51,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP video_link: string; video_type_id: number; // без null cover: File | null; + stepPos?: number; } const fileUploadRef = useRef(null); @@ -152,11 +153,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP mode: 'onChange' }); - const toggleVideoType = (e: videoType) => { - setSelectedCity(e); - setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); - }; - const selectedForEditing = (id: number, type: string) => { console.log(id, type); setSelectType(type); @@ -179,7 +175,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const data = await fetchElement(element.lesson_id, element.id); if (data.success) { // setElement({ content: data.content, step: data.step }); - setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id, video_link: data.content.link, cover: null, description: data.content.description }); + setEditingLesson({ title: data.content.title, video_type_id: data.content.video_type_id, video_link: data.content.link, cover: null, description: data.content.description, stepPos: data?.step?.step }); } else { setMessage({ state: true, @@ -194,7 +190,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const handleAddVideo = async () => { toggleSpinner(); const data = await addVideo(videoValue, element.lesson_id, 1, element.type_id, element.id); - console.log(data); if (data.success) { fetchPropElement(element.id); @@ -217,7 +212,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP // delete video const handleDeleteVideo = async (id: number) => { const data = await deleteVideo(element.lesson_id, id); - console.log(data); if (data.success) { fetchPropElement(element.id); @@ -238,11 +232,14 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP // update document const handleUpdateVideo = async () => { - setSkeleton(true) + setSkeleton(true); const token = getToken('access_token'); const data = await updateVideo(token, editingLesson, video?.lesson_id ? Number(video?.lesson_id) : null, Number(selectId), 1, element.type.id, element.type.id); - if (data?.success) { + const steps: { id: number; step: number | null }[] = [{ id: element?.id, step: editingLesson?.stepPos || 0 }]; + const secuence = await stepSequenceUpdate(video?.lesson_id ? Number(video?.lesson_id) : null, steps); + + if (data?.success && secuence.success) { setSkeleton(false); fetchPropElement(element.id); clearValues(); @@ -360,7 +357,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP <> {skeleton ? (
    - +
    ) : !videoCall ? ( video && ( @@ -418,61 +415,51 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP return (
    - handleUpdateVideo()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false}> + handleUpdateVideo()} clearValues={clearValues} visible={visible} setVisible={setVisisble} start={false} footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }}>
    - { - <> - {/* {editingLesson?.video_type_id ? ( */} -
    - { - setEditingLesson((prev) => prev && { ...prev, video_link: e.target.value }); - setValue('usefulLink', e.target.value, { shouldValidate: true }); - }} - /> - {errors.usefulLink?.message} -
    - {/* ) : ( */} - <> - {/* {}} - accept="video/" - onSelect={(e) => - setEditingLesson( - (prev) => - prev && { - ...prev, - file: e.files[0] - } - ) +
    + Позиция шага: + { + setEditingLesson( + (prev) => + prev && { + ...prev, + stepPos: Number(e.target.value) } - /> - {String(editingLesson?.video_link)} */} - - {/* )} */} - { - setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); - setValue('title', e.target.value, { shouldValidate: true }); - }} - /> - {errors.title?.message} - setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" /> - - } + ); + }} + /> +
    +
    + { + setEditingLesson((prev) => prev && { ...prev, video_link: e.target.value }); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> + {errors.usefulLink?.message} +
    + { + setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); + setValue('title', e.target.value, { shouldValidate: true }); + }} + /> + {errors.title?.message} + setEditingLesson((prev) => prev && { ...prev, description: e.target.value })} className="w-full" />
    diff --git a/app/components/popUp/FormModal.tsx b/app/components/popUp/FormModal.tsx index bc25ce7e..f2f519da 100644 --- a/app/components/popUp/FormModal.tsx +++ b/app/components/popUp/FormModal.tsx @@ -12,7 +12,8 @@ export default function FormModal({ clearValues, visible, setVisible, - start + start, + footerValue }: { children: ReactNode; title: string; @@ -21,13 +22,13 @@ export default function FormModal({ visible: boolean; setVisible: (params: boolean) => void; start: boolean; + footerValue?: { footerState: boolean; reject: string; next: string }; }) { - const media = useMediaQuery('(max-width:640px)'); const footerContent = (
    ); diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 6b2e2d0a..4f0858a5 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -177,9 +177,7 @@ export default function StreamList({ }, [streams]); useEffect(() => { - insideDisplayStreams(displayStreams); - console.log(displayStreams); - + insideDisplayStreams(displayStreams); }, [displayStreams]); const itemTemplate = (item: mainStreamsType, index: number) => { @@ -232,8 +230,8 @@ export default function StreamList({ {item?.semester?.name_ru} {item?.edu_form?.name_ru} {item.connect_id && ( - - Студенттер + + Студенты )}
    diff --git a/app/globals.css b/app/globals.css index 3c6dbfb0..21c2526f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -49,7 +49,6 @@ h1, h2, h3, h4, h5, h6 { .scrollbar-thin-y { scroll-snap-type: y mandatory; - cursor: grabbing; } .scrollbar-thin-y::-webkit-scrollbar { diff --git a/hooks/useShortText.tsx b/hooks/useShortText.tsx index b85403b5..32b13fe0 100644 --- a/hooks/useShortText.tsx +++ b/hooks/useShortText.tsx @@ -26,7 +26,7 @@ export default function useShortText(text: string, textLength: number) {
    ) : ( -
    {resultText}
    +
    {resultText}
    )} ); diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index e24bc9dc..f35430df 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -261,8 +261,8 @@ const AppMenu = () => { useEffect(() => { console.log(contextThemes); - if (contextThemes && contextThemes.lessons) { - const newThemes = contextThemes.lessons.data.map((item: any, idx: number) => ({ + if (contextThemes && contextThemes?.lessons) { + const newThemes = contextThemes.lessons?.data?.map((item: any, idx: number) => ({ label: `${idx + 1}. ${item.title}`, id: item.id, to: `/course/${course_Id}/${item.id}`, @@ -304,6 +304,7 @@ const AppMenu = () => { visible={visible} setVisible={setVisisble} start={false} + footerValue={{ footerState: true, reject: 'Назад', next: 'Сохранить' }} >
    @@ -377,13 +378,13 @@ const AppMenu = () => { })} {pathname.startsWith('/course/') && ( -
    +
    -
    +
    Всего баллов за курс - {contextThemes?.max_sum_score} + {contextThemes?.max_sum_score}
    )} diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index b932b2e6..9f49df49 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -72,6 +72,13 @@ const AppTopbar = forwardRef((props, ref) => { window.location.href = '/auth/login'; } }, + + { + label: 'Старый Mooc', + icon: '', + items: [], + url: 'https://oldmooc.oshsu.kg/' + }, { label: 'Сайт ОшГУ', icon: '', @@ -105,11 +112,11 @@ const AppTopbar = forwardRef((props, ref) => { } ]; - useEffect(()=> { + useEffect(() => { setTimeout(() => { setSkeleton(false); }, 1000); - },[]); + }, []); return (
    @@ -141,13 +148,20 @@ const AppTopbar = forwardRef((props, ref) => { ) : (
    - Старый Mooc - Сайт ОшГУ + + Старый Mooc + + + Сайт ОшГУ +
    )} - {skeleton ?
    - : user ? ( + {skeleton ? ( +
    + +
    + ) : user ? (
    diff --git a/layout/context/layoutcontext.tsx b/layout/context/layoutcontext.tsx index 5a149738..cdbd2dcf 100644 --- a/layout/context/layoutcontext.tsx +++ b/layout/context/layoutcontext.tsx @@ -113,6 +113,8 @@ export const LayoutProvider = ({ children }: ChildContainerProps) => { const [departament, setDepartament] = useState<{ last_name: string; name: string; father_name: string; info: string }>({ last_name: '', name: '', father_name: '', info: '' }); useEffect(() => { + console.log('Темы ', contextThemes); + if (pathname === '/course' && !departament.name) { setLayoutState((prev) => ({ ...prev, diff --git a/services/courses.tsx b/services/courses.tsx index 718d8e24..5ded3431 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -247,7 +247,7 @@ export const fetchLesson = async (type: string, courseId: number | null, lessonI export const fetchLessonShow = async (lessonId: number | null) => { try { - const res = await axiosInstance.get(`v1/teacher/lessons/show?lesson_id=${lessonId}`); + const res = await axiosInstance.get(`/v1/teacher/lessons/show?lesson_id=${lessonId}`); console.log('Info lesson: ', res.data); return res.data; } catch (err) { diff --git a/services/steps.tsx b/services/steps.tsx index 316b214e..afaa1c09 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -395,8 +395,6 @@ export const deleteLink = async (lesson_id: number, link_id: number, type_id: nu }; export const updateLink = async (value: { url: string | null; title: string; description: string | null }, lesson_id: number | null, link_id: number, type_id: number, step_id: number) => { - console.log(value); - let formData = new FormData(); url = `/v1/teacher/usefullinks/update?lesson_id=${lesson_id}&title=${value.title}&description=${value.description}&url=${value.url}&link_id=${link_id}&type_id=${type_id}&step_id=${step_id}`; formData.append('type_id', String(type_id)); @@ -434,6 +432,7 @@ export const fetchDepartamentSteps = async (lesson_id: number, id_kafedra: numbe } }; + export const fetchDepartamenCourses = async (id_kafedra: number, myedu_id: number) => { try { const res = await axiosInstance.get(`/v1/teacher/controls/department/courses?id_kafedra=${id_kafedra}&myedu_id=${myedu_id}`); @@ -444,4 +443,22 @@ export const fetchDepartamenCourses = async (id_kafedra: number, myedu_id: numbe console.log('Ошибка загрузки:', err); return err; } +}; + +export const stepSequenceUpdate = async (lesson_id: number | null, steps: {id: number | null; step: number | null}[]) => { + const body = { + lesson_id: lesson_id, + steps: steps + }; + + console.log(body); + + try { + const res = await axiosInstance.post(`/v1/teacher/lessons/step/sequence`, body); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении курса', err); + return err; + } }; \ No newline at end of file diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 531d582b..04f4e91e 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -31,18 +31,18 @@ axiosInstance.interceptors.response.use( if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/'; - // } + if (typeof window !== 'undefined') { + window.location.href = '/'; + } } if (status === 404) { console.warn('404 - Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/pages/notfound'; - // localStorage.removeItem('userVisit'); - // } - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + if (typeof window !== 'undefined') { + window.location.href = '/pages/notfound'; + localStorage.removeItem('userVisit'); + } + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 7b5c7e726bb98390cf0391b86e266e76f2bdbbf8 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 30 Sep 2025 17:13:33 +0600 Subject: [PATCH 205/286] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D1=8E=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D1=82=D0=B5,=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=BB=D0=BB=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=B2.=20=D0=9F=D1=80=D0=B5=D0=B4=D0=BE=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=82=20?= =?UTF-8?q?=D1=81=D0=BB=D0=B0=D0=B1=D0=BE=D0=B3=D0=BE=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 151 ++++++++------ app/(main)/course/page.tsx | 191 +++++++++--------- .../faculty/[id_kafedra]/[myedu_id]/page.tsx | 107 +++++----- app/(main)/faculty/[id_kafedra]/page.tsx | 107 +++++++--- app/(main)/faculty/page.tsx | 24 +-- app/components/cards/LessonCard.tsx | 67 +++--- app/components/lessons/LessonPractica.tsx | 104 +++++----- app/components/tables/StreamList.tsx | 7 +- app/globals.css | 5 + hooks/useShortText.tsx | 6 +- layout/context/layoutcontext.tsx | 2 - 11 files changed, 443 insertions(+), 328 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 2cc76c20..12ffb905 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -41,6 +41,7 @@ export default function LessonStep() { const [selectedId, setSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); const [themeNull, setThemeNull] = useState(false); + const [themeContent, setThemeContent] = useState(false); // const [lesson_id, setLesson_id] = useState(null); const [lesson_id, setLesson_id] = useState(null); const [sequence_number, setSequence_number] = useState(null); @@ -148,9 +149,8 @@ export default function LessonStep() { const handleFetchElement = async (stepId: number) => { if (lesson_id) { - setSkeleton(true); - const data = await fetchElement(Number(lesson_id), stepId); + const data = await fetchElement(Number(lesson_id), stepId); if (data.success) { setSkeleton(false); setElement({ content: data.content, step: data.step }); @@ -309,9 +309,9 @@ export default function LessonStep() { if (isSameSnapshot) return; // дальше — твоя логика, но чуть упрощённая и аккуратная - if (!lessons || lessons.length < 1) { - setThemeNull(true); + if (!lessons || lessons?.length < 1) { setLesson_id(null); + setThemeNull(true); return; } else { setThemeNull(false); @@ -323,7 +323,7 @@ export default function LessonStep() { const exists = lessons.some((l: { id: number }) => l.id === urlId); chosenId = exists ? urlId : lessons[0].id; } else { - chosenId = lessons[0].id; + chosenId = lessons[0]?.id; } // если выбор изменился — setLesson_id вызовет второй useEffect и всё остальное произойдёт там @@ -382,11 +382,18 @@ export default function LessonStep() {

    {lessonInfoState?.title}

    + {media && contextThemes && contextThemes?.max_sum_score ? +
    + Балл за курс + {contextThemes?.max_sum_score} +
    + : '' + }
    ); - const step = (icon: string, step: number, idx: number) => { + const step = (item: mainStepsType, icon: string, step: number, idx: number) => { return (
    - {idx + 1} + {idx + 1} {item?.type?.name === 'practical' || item?.type?.name === 'test' ? ({item.score}) : ''} +
    @@ -470,7 +479,7 @@ export default function LessonStep() { {steps.map((item, idx) => { return (
    - {step(item.type.logo, item.id, idx)} + {step(item, item.type.logo, item.id, idx)}
    ); })} @@ -495,65 +504,73 @@ export default function LessonStep() {
    )} -
    - {element?.step.type.title} -
    - {element?.step.type.name === 'document' && ( - { - handleFetchElement(stepId); - handleFetchSteps(lesson_id); - }} - clearProp={hasSteps} - /> - )} - {element?.step.type.name === 'video' && ( - { - handleFetchElement(stepId); - handleFetchSteps(lesson_id); - }} - clearProp={hasSteps} - /> - )} - {element?.step.type.name === 'test' && ( - { - handleFetchElement(stepId); - handleFetchSteps(lesson_id); - }} - fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} - clearProp={hasSteps} - /> - )} - {element?.step.type.name === 'practical' && ( - { - handleFetchElement(stepId); - handleFetchSteps(lesson_id); - }} - fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} - clearProp={hasSteps} - /> - )} - {element?.step.type.name === 'link' && ( - { - handleFetchElement(stepId); - handleFetchSteps(lesson_id); - }} - clearProp={hasSteps} - /> + {element?.step.type.title &&
    + {element?.step.type.title} - +
    ({element?.step?.step === 0 ? '1' : element?.step?.step} позиция)
    +
    } + + {skeleton ? ( + + ) : ( + <> + {element?.step.type.name === 'document' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'video' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'test' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'practical' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + fetchPropThemes={() => contextFetchThemes(Number(course_id), null)} + clearProp={hasSteps} + /> + )} + {element?.step.type.name === 'link' && ( + { + handleFetchElement(stepId); + handleFetchSteps(lesson_id); + }} + clearProp={hasSteps} + /> + )} + )}
    diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index 73f003c8..bcefb7a5 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -86,7 +86,7 @@ export default function Course() { course_id: id, status: status ? 1 : 0 }; - + const data = await veryfyCourse(forSentStreams); if (data.success) { contextFetchCourse(1); @@ -96,7 +96,6 @@ export default function Course() { value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { - setSkeleton(false); if (data.response.data.cause) { setMessage({ @@ -136,9 +135,10 @@ export default function Course() { const handleFetchCourse = async (page = 1) => { const data = await fetchCourses(page, 0); toggleSkeleton(); - + setSkeleton(true); if (course) { setHasCourses(false); + setSkeleton(false); setValueCourses(course.data); setPagination({ currentPage: course.current_page, @@ -147,6 +147,7 @@ export default function Course() { }); } else { setHasCourses(true); + setSkeleton(false); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } @@ -290,74 +291,6 @@ export default function Course() { setActiveIndex(e.index); }; - useEffect(() => { - contextFetchCourse(1); - setPageState(1); - setGlobalLoading(true); - setTimeout(() => { - setGlobalLoading(false); - }, 900); - }, []); - - useEffect(() => { - handleFetchCourse(); - if (course?.data?.length > 5) { - setIsTall(true); - } else { - setIsTall(false); - } - }, [course]); - - useEffect(() => { - const title = editMode ? editingLesson.title.trim() : courseValue.title.trim(); - if (title?.length > 0) { - setForStart(false); - } else { - setForStart(true); - } - }, [courseValue.title, editingLesson.title]); - - useEffect(() => { - if (coursesValue?.length < 1) { - setHasCourses(true); - } else { - if (globalCourseId != null) { - const exists = coursesValue.some((c: { id: number }) => c.id === globalCourseId.id); - if (exists) { - setForStreamId({ id: globalCourseId.id, title: globalCourseId.title || '' }); - } else { - setForStreamId({ id: coursesValue[0].id, title: coursesValue[0].title }); - } - } else { - setForStreamId({ id: coursesValue[0].id, title: coursesValue[0].title }); - } - setHasCourses(false); - } - }, [coursesValue]); - - useEffect(() => { - const handleShow = async () => { - setProgressSpinner(true); - const data = await fetchCourseInfo(selectedCourse); - - if (data?.success) { - setProgressSpinner(false); - setEditingLesson({ - title: data.course.title || '', - video_url: data.course.video_url || '', - description: data.course.description || '', - image: data.course.image - }); - } else { - setProgressSpinner(false); - } - }; - - if (editMode) { - handleShow(); - } - }, [editMode]); - const itemTemplate = (shablonData: any) => { return (
    @@ -369,6 +302,7 @@ export default function Course() {
    { setMainCourseId(shablonData.id); setGlobalLoading(true); @@ -442,10 +376,86 @@ export default function Course() { const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); + useEffect(() => { + contextFetchCourse(1); + setPageState(1); + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 900); + }, []); + + useEffect(() => { + handleFetchCourse(); + if (course?.data?.length > 5) { + setIsTall(true); + } else { + setIsTall(false); + } + }, [course]); + + useEffect(() => { + const title = editMode ? editingLesson.title.trim() : courseValue.title.trim(); + if (title?.length > 0) { + setForStart(false); + } else { + setForStart(true); + } + }, [courseValue.title, editingLesson.title]); + + useEffect(() => { + if (coursesValue?.length < 1) { + // setHasCourses(true); + } else { + if (globalCourseId != null) { + const exists = coursesValue.some((c: { id: number }) => c.id === globalCourseId.id); + if (exists) { + setForStreamId({ id: globalCourseId.id, title: globalCourseId.title || '' }); + } else { + setForStreamId({ id: coursesValue[0].id, title: coursesValue[0].title }); + } + } else { + setForStreamId({ id: coursesValue[0].id, title: coursesValue[0].title }); + } + setHasCourses(false); + } + }, [coursesValue]); + + useEffect(() => { + const handleShow = async () => { + setProgressSpinner(true); + const data = await fetchCourseInfo(selectedCourse); + + if (data?.success) { + setProgressSpinner(false); + setEditingLesson({ + title: data.course.title || '', + video_url: data.course.video_url || '', + description: data.course.description || '', + image: data.course.image + }); + } else { + setProgressSpinner(false); + } + }; + + if (editMode) { + handleShow(); + } + }, [editMode]); + return (
    {/* modal window */} - +
    {/*
    */}
    @@ -599,7 +609,7 @@ export default function Course() { }} />
    - + ) : ( <> @@ -687,21 +697,31 @@ export default function Course() { {/* table section */} {hasCourses ? ( - + ) : ( <> {skeleton ? ( - +
    + +
    ) : (
    rowIndex + 1} header="#" style={{ width: '20px' }}> -
    } body={imageBodyTemplate}>
    + ( +
    + +
    + )} + body={imageBodyTemplate} + >
    Название
    } + header={() =>
    Название
    } body={(rowData) => ( {rowData.title} )} >
    -
    Балл
    } - body={(rowData) => ( - - {rowData.max_score} - - )} - >
    +
    Балл
    } body={(rowData) => {rowData.max_score}}>
    На рассмотрение
    } style={{ margin: '0 3px', textAlign: 'center' }} @@ -749,14 +760,14 @@ export default function Course() { )} >
    Публикация
    } + header={() =>
    Публикация
    } style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => rowData.is_published ? : } >
    Потоки
    } + header={() =>
    Потоки
    } style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => ( <> diff --git a/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx index 4998494d..95d78f97 100644 --- a/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx @@ -2,6 +2,7 @@ import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; import { NotFound } from '@/app/components/NotFound'; +import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { publishCourse } from '@/services/courses'; @@ -37,16 +38,24 @@ export default function CoursesDep() { const [courses, setCourses] = useState([]); const [contentShow, setContentShow] = useState(false); + const [contentNull, setContentNull] = useState(false); const [teacher, setTeacher] = useState<{id: number; myedu_id: number;} | null>(null); const [forDisabled, setForDisabled] = useState(false); + const [skeleton, setSkeleton] = useState(false); const { setMessage, setGlobalLoading } = useContext(LayoutContext); const showError = useErrorMessage(); const fetchDepartamentCourse = async () => { const data = await depCourse(Number(myedu_id), Number(id_kafedra)); - - if (data && data.courses) { + console.log(data); + + if (data && data?.courses) { + if(data.courses?.length < 1){ + setContentNull(true); + } else { + setContentNull(false); + } setTeacher(data); setCourses(data.courses); setContentShow(false); @@ -106,56 +115,62 @@ export default function CoursesDep() { fetchDepartamentCourse(); }, []); + if(contentNull) return + return (
    - {contentShow ? ( + {skeleton ?
    + : contentShow ? ( ) : ( - - rowIndex + 1} header="#" style={{ width: '20px' }}> - - ( - - {rowData.title} - - )} - > - ( -
    - {!rowData.is_published ? ( - - ) : ( - + ) : ( + - )} -
    - )} - >
    -
    + + + + )} +
    + )} + >
    +
    + )}
    ); diff --git a/app/(main)/faculty/[id_kafedra]/page.tsx b/app/(main)/faculty/[id_kafedra]/page.tsx index 5fc36ac1..c3226c2e 100644 --- a/app/(main)/faculty/[id_kafedra]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/page.tsx @@ -1,13 +1,16 @@ 'use client'; import { NotFound } from '@/app/components/NotFound'; +import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchDepartament } from '@/services/faculty'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Column } from 'primereact/column'; import { DataTable } from 'primereact/datatable'; +import { DataView } from 'primereact/dataview'; import { useContext, useEffect, useState } from 'react'; export default function Kafedra() { @@ -33,20 +36,29 @@ export default function Kafedra() { const [courses, setCourses] = useState([]); const [contentShow, setContentShow] = useState(false); + const [skeleton, setSkeleton] = useState(false); + const [contentNull, setContentNull] = useState(false); + + const media = useMediaQuery('(max-width: 640px)'); + const tableMedia = useMediaQuery('(max-width: 577px)'); const { setMessage, setGlobalLoading } = useContext(LayoutContext); const showError = useErrorMessage(); const handleFetchKafedra = async () => { - const data = await fetchDepartament(Number(id_kafedra)); + setSkeleton(true); + const data = await fetchDepartament(Number(id_kafedra)); if (data && Array.isArray(data)) { + setSkeleton(false); if (data.length > 0) { setCourses(data); setContentShow(false); + setContentNull(false); } else { - setContentShow(true); + setContentNull(true); } } else { + setSkeleton(false); setContentShow(true); setMessage({ state: true, @@ -58,6 +70,32 @@ export default function Kafedra() { } }; + const itemTemplate = (rowData: any) => { + return ( +
    +
    + {/* Номер (rowIndex) можно добавить через внешний счетчик или props, но для DataView это сложнее */} + + {/* Заголовок */} +
    +
    + + {rowData.last_name} {rowData.name} {rowData.father_name} + +
    +
    + +
    +
    Количество курсов:{rowData.courses}
    +
    Утверждённых:{rowData.courses_published}
    +
    + + {/*
    {imageBodyTemplate(rowData)}
    */} +
    +
    + ); + }; + useEffect(() => { setGlobalLoading(true); setTimeout(() => { @@ -66,36 +104,53 @@ export default function Kafedra() { handleFetchKafedra(); }, []); + if (contentNull) return ; + return (
    - {contentShow ? ( + {skeleton ? ( +
    + +
    + ) : contentShow ? ( ) : (
    - - rowIndex + 1} header="#"> - ( - - {rowData.last_name} {rowData.name} {rowData.father_name} - - )} - > - ( -
    -
    - 4 - (2 утверждённых) + {media ? ( + <>

    Преподаватели

    + + ) : ( + + rowIndex + 1} header="#"> + ( + + {rowData.last_name} {rowData.name} {rowData.father_name} + + )} + > + ( +
    +
    + {rowData.courses} + ({rowData.courses_published} утверждённых) +
    -
    - )} - > - + )} + > + + )}
    )}
    diff --git a/app/(main)/faculty/page.tsx b/app/(main)/faculty/page.tsx index 689f02bc..10cbb5d5 100644 --- a/app/(main)/faculty/page.tsx +++ b/app/(main)/faculty/page.tsx @@ -25,6 +25,7 @@ export default function Faculty() { const [selectShow, setSelectShow] = useState(false); const [facultyShow, setFacultyShow] = useState(false); const [skeleton, setSkeleton] = useState(false); + const [contentNull, setContentNull] = useState(false); // const handleFetchFaculty = async () => { // setSkeleton(true); @@ -56,16 +57,20 @@ export default function Faculty() { // }; const handleFetchKafedra = async () => { + setSkeleton(true); const data = await fetchKafedra(); if (data && Array.isArray(data)) { + setSkeleton(false); if (data.length > 0) { setKafedra(data); setFacultyShow(false); + setContentNull(false); } else { - setFacultyShow(true); + setContentNull(true); } } else { + setSkeleton(false); setFacultyShow(true); } }; @@ -79,21 +84,10 @@ export default function Faculty() { }, 900); }, []); + if(contentNull) return + return (
    - {/*
    - {skeleton ? ( - - ) : selectShow ? ( -

    Факультеты временно не доступны

    - ) : ( -
    -

    Выберите факультет

    - setSelected(e.value)} options={faculty} optionLabel="name_ru" className="w-[90%] overflow-x-auto" panelClassName="w-[50%] overflow-x-scroll" /> -
    - )} -
    */} - {/* data table */} {skeleton ? ( ) : ( @@ -103,7 +97,7 @@ export default function Faculty() { {facultyShow ? ( ) : ( - + rowIndex + 1} header="#" style={{ width: '20px' }}> {!cardValue.photo && }
    */}
    {cardValue.score ? ( -
    - Балл: - {`${cardValue.score}`} +
    +
    + Балл: + {`${cardValue.score}`} +
    + {status === 'working' && ( +
    + + {lessonDate} +
    + )}
    ) : ( '' )} - {shortTitle} +
    + {shortTitle} + {!cardValue.score && status === 'working' && ( +
    + + {lessonDate} +
    + )} +
    - {type.typeValue !== 'practica' &&
    {shortDoc}
    } + {type.typeValue !== 'practica' &&
    {shortDoc}
    } {type.typeValue === 'practica' && cardValue.url ? ( -
    +
    Ссылка: - {cardValue?.url} + {cardValue?.url}
    ) : ( type.typeValue === 'link' && ( <> - {shortUrl} + {shortUrl} ) )} @@ -143,18 +159,9 @@ export default function LessonCard({ })}
    )} -
    - {type.typeValue === 'practica' ? cardValue?.desctiption ?
    - : cardValue?.desctiption && cardValue?.desctiption !== 'null' && shortDescription : '' - } +
    + {type.typeValue === 'practica' ? cardValue?.desctiption &&
    : cardValue?.desctiption && cardValue?.desctiption !== 'null' &&
    {shortDescription}
    }
    - - {status === 'working' && ( -
    - - {lessonDate} -
    - )}
    {/* video preview */} {videoPreviw} @@ -175,7 +182,12 @@ export default function LessonCard({ {type.typeValue === 'doc' && (
    -
    @@ -194,7 +206,12 @@ export default function LessonCard({ )} {type.typeValue === 'link' && (
    -
    )} @@ -204,7 +221,7 @@ export default function LessonCard({
    -
    - { - setEditorUpdateState(false); - setEditingLesson((prev) => ({ ...prev, description: String(e.htmlValue) })); - setValue('title', String(e.htmlValue), { shouldValidate: true }); - }} - headerTemplate={header} - /> - {errors.title?.message} -
    - {additional.doc && ( -
    - { - const file = e.target.files?.[0]; - if (file) { - setEditingLesson((prev) => ({ - ...prev, - document: file - })); - } - }} - /> -
    - )} - {additional.doc && ( -
    - { - setEditingLesson((prev) => prev && { ...prev, url: e.target.value }); - setValue('usefulLink', e.target.value, { shouldValidate: true }); +
    +
    + { + setEditorUpdateState(false); + setEditingLesson((prev) => ({ ...prev, description: String(e.htmlValue) })); + setValue('title', String(e.htmlValue), { shouldValidate: true }); }} + headerTemplate={header} /> + {errors.title?.message}
    - )} + {additional.doc && ( +
    + { + const file = e.target.files?.[0]; + if (file) { + setEditingLesson((prev) => ({ + ...prev, + document: file + })); + } + }} + /> +
    + )} -
    -
    - setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> - Дополнительно {additional.doc ? '-' : '+'} - + {additional.doc && ( +
    + { + setEditingLesson((prev) => prev && { ...prev, url: e.target.value }); + setValue('usefulLink', e.target.value, { shouldValidate: true }); + }} + /> +
    + )} + +
    +
    + setAdditional((prev) => ({ ...prev, doc: !prev.doc }))}> + Дополнительно {additional.doc ? '-' : '+'} + +
    +
    diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 4f0858a5..6a24138f 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -15,6 +15,7 @@ import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { mainStreamsType } from '@/types/mainStreamsType'; import Link from 'next/link'; +import useShortText from '@/hooks/useShortText'; export default function StreamList({ callIndex, @@ -41,6 +42,7 @@ export default function StreamList({ const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); + const shortTitle = useShortText(courseValue?.title ? courseValue?.title : '', 20, 'right'); const toggleSkeleton = () => { setSkeleton(true); @@ -246,9 +248,6 @@ export default function StreamList({ const hasData = items.some((item) => item.connect_id !== null); if (hasData) { - const forCourse = items.filter((item)=> item.connect_id !== null); - console.log(forCourse); - let list = items.map((product, index: number) => { if (product.connect_id !== null) { return itemTemplate(product, index); @@ -360,7 +359,7 @@ export default function StreamList({ {!isMobile && (
    {/* */} - {courseValue?.title} + {shortTitle} {/* */}
    ); @@ -401,12 +421,20 @@ export default function LessonStep() { setSelectId(step); handleFetchElement(step); }} - > - {idx + 1} {item?.type?.name === 'practical' || item?.type?.name === 'test' ? ({item.score}) : ''} + + {idx + 1} + {item?.type?.name === 'practical' || item?.type?.name === 'test' ? ( + + ({item.score}) + + ) : ( + '' + )} +
    - +
    ); @@ -492,8 +520,7 @@ export default function LessonStep() { ) : ( )}
    @@ -504,10 +531,14 @@ export default function LessonStep() {
    )} - {element?.step.type.title &&
    - {element?.step.type.title} - -
    ({element?.step?.step === 0 ? '1' : element?.step?.step} позиция)
    -
    } + {element?.step.type.title && ( +
    + {element?.step.type.title} - +
    + ({element?.step?.step === 0 ? '1' : element?.step?.step} позиция) +
    +
    + )} {skeleton ? ( diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index bcefb7a5..667319b1 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -120,14 +120,14 @@ export default function Course() { (prev) => prev && { ...prev, - image: '' + image: null } ); // query } else { setCourseValue((prev) => ({ ...prev, - image: '' + image: null })); } }; @@ -567,7 +567,7 @@ export default function Course() { ) : ( jpeg, png, jpg )} -
    {(editingLesson.image || imageState) &&
    +
    {(editingLesson.image || imageState) &&
    diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index 7b47e995..27da8710 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -36,7 +36,6 @@ export default function PDFViewer({ url }: { url: string }) { try { // Проверяем, одна ли страница в документе let newUrl = `https://api.mooc.oshsu.kg/temprory-file/${url}`; - console.log(newUrl); const pdf = await pdfjsLib.getDocument(newUrl).promise; const tempPages = []; const firstPage = await pdf.getPage(1); diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 39745eae..0a349af4 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -39,7 +39,7 @@ export default function LessonCard({ const forShortTitle = useShortText(cardValue.title, 200); const shortTitle = type.typeValue !== 'practica' ? forShortTitle : cardValue.title; const shortDoc = useShortText(cardValue?.document || '', 100); - const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 90); + const shortDescription = useShortText(cardValue.desctiption ? cardValue.desctiption : '', 200); const shortUrl = useShortText(cardValue?.url ? cardValue?.url : '', 100); const [progressSpinner, setProgressSpinner] = useState(false); @@ -108,7 +108,7 @@ export default function LessonCard({ {`${cardValue.score}`}
    {status === 'working' && ( -
    +
    {lessonDate}
    @@ -120,7 +120,7 @@ export default function LessonCard({
    {shortTitle} {!cardValue.score && status === 'working' && ( -
    +
    {lessonDate}
    @@ -140,7 +140,7 @@ export default function LessonCard({ ) : ( type.typeValue === 'link' && ( <> - {shortUrl} + {shortUrl} ) )} @@ -160,7 +160,7 @@ export default function LessonCard({
    )}
    - {type.typeValue === 'practica' ? cardValue?.desctiption &&
    : cardValue?.desctiption && cardValue?.desctiption !== 'null' &&
    {shortDescription}
    } + {type.typeValue === 'practica' ? cardValue?.desctiption &&
    : cardValue?.desctiption && cardValue?.desctiption !== 'null' &&
    {cardValue.desctiption}
    }
    {/* video preview */} diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 99886093..0e06cfc5 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -280,10 +280,19 @@ export default function LessonDocument({ element, content, fetchPropElement, cle onChange={(e) => { const file = e.target.files?.[0]; if (file) { - setDocValue((prev) => ({ - ...prev, - file: file - })); + const maxSize = 10 * 1024 * 1024; + + if (file.size > maxSize) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Файл слишком большой!', detail: 'Разрешено максимум 10 MB.' } + }); + } else { + setDocValue((prev) => ({ + ...prev, + file: file + })); + } } }} /> diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index ac3f53fe..7bf7f21e 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -222,7 +222,7 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr /> {errors.title?.message}
    -
    +
    -
    +
    {answer.map((item, index) => { return (
    @@ -379,7 +379,7 @@ export default function LessonTest({ element, content, fetchPropElement, fetchPr setAnswer((prev) => prev.map((ans, i) => (i === index ? { ...ans, text: e.target.value } : ans))); }} /> -
    ); })} diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index 598c2fc7..188b1ef6 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -304,7 +304,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    - {imageState &&
    {imageState ? : } diff --git a/app/globals.css b/app/globals.css index e9e3d097..cf614468 100644 --- a/app/globals.css +++ b/app/globals.css @@ -508,18 +508,12 @@ input[type="password"]::-ms-clear { } .stepElement { - min-width: 47px !important; - min-height: 47px !important; - width: 57px !important; - height: 57px !important; + padding: 15px; } @media screen and (max-width: 640px) { .stepElement { - min-width: 47px !important; - min-height: 47px !important; - width: 47px !important; - height: 47px !important; + padding: 10px; } } diff --git a/hooks/useShortText.tsx b/hooks/useShortText.tsx index 7952d097..ac6b66df 100644 --- a/hooks/useShortText.tsx +++ b/hooks/useShortText.tsx @@ -21,7 +21,7 @@ export default function useShortText(text: string, textLength: number, pos?:stri <> {isLength ? ( -
    0 ? 'flex-row items-end' : 'flex-col items-center'} justify-center gap-1 px-1 max-w-md text-wrap break-all`} data-pr-tooltip={text} data-pr-position="right"> +
    0 ? 'flex-row items-end' : 'flex-col items-center'} justify-start gap-1 px-1 max-w-md text-wrap break-all`} data-pr-tooltip={text} data-pr-position="right"> {resultText}
    diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index f35430df..77d5d716 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -372,7 +372,7 @@ const AppMenu = () => {
    -

    }8GPZ;4Y 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 B7S8|x literal 0 HcmV?d00001 diff --git "a/public/layout/images/\320\263\320\273\320\260\320\262\320\275\321\213\320\271.jpg" "b/public/layout/images/\320\263\320\273\320\260\320\262\320\275\321\213\320\271.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..264fa0c34d649da3ff0e54d21e0b196cff631d52 GIT binary patch literal 139934 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 z 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%0DQ4U7%hSUxaVvNYS$UVG` zH;z(eEww>B910XDM>OMVmK=AkfrEj?3KY{sG7uZL72AQ~ru8Qy9C=WoNR*Ohc3r)X zK6IjE2xGrSDcVAXtxqPGN4xBjtC-!3JM#tERwo*V}slp4>QC8 z1RmTG#R?QAmUzJ`!y_bQ4#th)2!k@S4~BT5LYsC`an(1N2xBrLs5u0T3>?uKXGs^a z4S-aRC{U!BN1i2z!`YA>_LV0hx*$+U=N~#0DFith%o85)%rL}l9gPXdh8ZM9UETXo zp;IE1T5KfVQoBeCk4$k#zCjJU%$zU)H_x?npS# zop)f3TW&@^J?K!OM%P0ApeP~dlnhwaz8oS`A;AcLxRGGIB00DRuC{R)bD>&M! za!yZU&M7c3#0-y>3Ka#VyDso|a0i}oL74b#-kww_QdUxV912leC*B#PuGhdo%1O^0 z(4kDI1WRXWVk>7 z(idIEF`tz;77#bM7ic{3LWLsGm~phU8inqLjr1G2;sA^&atGWgXl^9bQKp@Va!V4V zj(g^X3Wz+FhgHdJBXuCjHa$1f3AC$dKB}?Lt5Bg*EeCa2ajHcY(MaW)a%pw4f%!3t z6e_aN70e{0n%*e>ssT}2^|Wnk;}!SQ03T3&Xi%!88Wm(j=L)n { } }; -export const fetchKafedra = async (id_faculty: number | null) => { +export const fetchKafedra = async () => { try { - const res = await axiosInstance.get(`/open/kafedra?id_faculty=${id_faculty}`, { - baseURL: process.env.NEXT_PUBLIC_FACULTY_API - }); + // const res = await axiosInstance.get(`/open/kafedra?id_faculty=${id_faculty}`, { + const res = await axiosInstance.get(`/v1/teacher/controls/departments`); const data = await res.data; return data; @@ -30,7 +29,7 @@ export const fetchKafedra = async (id_faculty: number | null) => { export const fetchDepartament = async (id_kafedra: number | null) => { try { - const res = await axiosInstance.get(`/v1/teacher/controls/department?id_kafedra=${id_kafedra}`); + const res = await axiosInstance.get(`/v1/teacher/controls?id_kafedra=${id_kafedra}`); const data = await res.data; return data; diff --git a/services/query-tests.http b/services/query-tests.http index d36f3b8b..065436de 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,4 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTg2ODI0MDQsImV4cCI6MTc1ODcxMTI2NCwibmJmIjoxNzU4NjgyNDA0LCJqdGkiOiJSMFZpRk5wdGw5dzFLMThLIiwic3ViIjoiOTUwNjAiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0._W2S4RYwX6_HaTfCuq4skEDUOzU60kZ-1l3t-AkscnI +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NTg3OTIzNDQsImV4cCI6MTc1ODgyMTIwNCwibmJmIjoxNzU4NzkyMzQ0LCJqdGkiOiJGZmdFOXZselM5bU5hOUFQIiwic3ViIjoiMTE4MjkyIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.yqAlXc9ZYiwNOMJ31LIpYQgQwgJ45uvUB1wr8bdTdzE # ### # http://api.mooc.oshsu.kg/public/api/v1/open/video/types @@ -30,6 +30,6 @@ # test -GET https://api.mooc.oshsu.kg/public/api/v1/student/course/lesson/step?step_id=439&stream_id=186462 +GET https://api.mooc.oshsu.kg/public/api/v1/teacher/controls/departments Authorization: Bearer {{token}} Content-Type: application/json diff --git a/services/steps.tsx b/services/steps.tsx index e15b4c9f..316b214e 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -427,6 +427,18 @@ export const fetchDepartamentSteps = async (lesson_id: number, id_kafedra: numbe const res = await axiosInstance.get(`/v1/teacher/controls/department/course/views?lesson_id=${lesson_id}&id_kafedra=${id_kafedra}`); const data = await res.data; + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchDepartamenCourses = async (id_kafedra: number, myedu_id: number) => { + try { + const res = await axiosInstance.get(`/v1/teacher/controls/department/courses?id_kafedra=${id_kafedra}&myedu_id=${myedu_id}`); + const data = await res.data; + return data; } catch (err) { console.log('Ошибка загрузки:', err); diff --git a/styles/layout/_menu.scss b/styles/layout/_menu.scss index 8266dbe7..e13a0650 100644 --- a/styles/layout/_menu.scss +++ b/styles/layout/_menu.scss @@ -1,6 +1,6 @@ .layout-sidebar { position: fixed; - width: 320px; + width: 350px; height: calc(100vh - 9rem); z-index: 999; overflow-y: auto; @@ -10,7 +10,7 @@ transition: transform $transitionDuration, left $transitionDuration; background-color: var(--surface-overlay); border-radius: $borderRadius; - padding: 0.5rem 1.2rem; + padding: 0.5rem 0.5rem; box-shadow: 0px 3px 5px rgba(0, 0, 0, .02), 0px 0px 2px rgba(0, 0, 0, .05), 0px 1px 4px rgba(0, 0, 0, .08); } @@ -58,7 +58,7 @@ outline: 0 none; color: var(--text-color); cursor: pointer; - padding: .75rem 1rem; + padding: .75rem 3px; border-radius: $borderRadius; transition: background-color $transitionDuration, box-shadow $transitionDuration; @@ -154,3 +154,9 @@ max-height: 0 !important; transition: max-height 0.45s cubic-bezier(0, 1, 0, 1); } + +@media screen and (max-width: 640px) { + .layout-sidebar { + width: 320px; + } +} \ No newline at end of file diff --git a/styles/layout/_responsive.scss b/styles/layout/_responsive.scss index 58b7f387..7faa28fd 100644 --- a/styles/layout/_responsive.scss +++ b/styles/layout/_responsive.scss @@ -32,7 +32,7 @@ &.layout-static { .layout-main-container { - margin-left: 300px; + margin-left: 330px; } &.layout-static-inactive { @@ -67,6 +67,7 @@ .layout-sidebar { transform: translateX(-100%); + // width: 320px; left: 0; top: 0; height: 100vh; diff --git a/types/layout.d.ts b/types/layout.d.ts index 51d6b8f7..dd84045a 100644 --- a/types/layout.d.ts +++ b/types/layout.d.ts @@ -135,6 +135,7 @@ export interface AppMenuItem extends MenuModel { command?: ({ originalEvent, item }: CommandProps) => void; // + score?: string onEdit?: () => void; onDelete?: () => void; } diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 04f4e91e..531d582b 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -31,18 +31,18 @@ axiosInstance.interceptors.response.use( if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/'; - } + // if (typeof window !== 'undefined') { + // window.location.href = '/'; + // } } if (status === 404) { console.warn('404 - Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/pages/notfound'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/pages/notfound'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 3654e7b9d78c0186e7ece07fc6e7d9790073d048 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 26 Sep 2025 12:26:48 +0600 Subject: [PATCH 201/286] =?UTF-8?q?=D0=91=D0=B0=D0=BB=D0=BB=D1=8B=20=D0=BA?= =?UTF-8?q?=D1=83=D1=80=D1=81=D0=BE=D0=B2=20=D0=B8=20=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 8 +- app/(main)/course/page.tsx | 8 +- .../[course_id]/page.tsx | 10 +- .../faculty/[id_kafedra]/[myedu_id]/page.tsx | 181 +++++++++++++++++- app/components/HomeClient.tsx | 1 + services/courses.tsx | 2 +- services/faculty.tsx | 12 ++ 7 files changed, 202 insertions(+), 20 deletions(-) rename app/(main)/faculty/[id_kafedra]/{testovy => [myedu_id]}/[course_id]/page.tsx (96%) diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index dcb32176..0b184ae0 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -93,16 +93,16 @@ const LoginPage = () => { }; return ( -

    -
    {practicaInfo}
    +
    {practicaInfo()}
    -
    {docSection}
    +
    {docSection()}
    -
    {linkSection}
    +
    {linkSection()}
    +
    + { + if (!videoCall) return; + setVideoCall(false); + }} + > +
    {videoSecton()}
    {type === 'document' && docCard}
    {type === 'link' && linkCard}
    diff --git a/app/components/lessons/StudentInfoCard.tsx b/app/components/lessons/StudentInfoCard.tsx index 5f06db8f..73a9f00d 100644 --- a/app/components/lessons/StudentInfoCard.tsx +++ b/app/components/lessons/StudentInfoCard.tsx @@ -111,7 +111,7 @@ export default function StudentInfoCard({ ); const docCard = ( -
    +
    ); const linkCard = ( -
    +
    @@ -175,12 +154,12 @@ export default function StudentInfoCard({ )} */}
    -
    {cheelseBtn('')}
    +
    {cheelseBtn('')}
    ); const videoCard = ( -
    +
    @@ -195,12 +174,12 @@ export default function StudentInfoCard({
    -
    {cheelseBtn('')}
    +
    {cheelseBtn('')}
    ); const testCard = ( -
    +
    @@ -211,7 +190,7 @@ export default function StudentInfoCard({
    -
    {cheelseBtn('test')}
    +
    {cheelseBtn('test')}
    ); @@ -245,7 +224,7 @@ export default function StudentInfoCard({ ); const practicaCard = ( -
    +
    @@ -254,7 +233,7 @@ export default function StudentInfoCard({ Практическое задание
    -
    {cheelseBtn('practical')}
    +
    {cheelseBtn('practical')}
    ); diff --git a/app/components/messages/Message.tsx b/app/components/messages/Message.tsx index 70a07acb..b7506075 100644 --- a/app/components/messages/Message.tsx +++ b/app/components/messages/Message.tsx @@ -12,7 +12,7 @@ export default function Message() { const toast = useRef(null); const showError = () => { - toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 2000 }); + toast.current?.show({ severity: message.value.severity as SeverityType, summary: message.value.summary, detail: message.value.detail, life: 3000 }); }; useEffect(() => { diff --git a/app/globals.css b/app/globals.css index 9641973b..3d81cdb5 100644 --- a/app/globals.css +++ b/app/globals.css @@ -89,7 +89,7 @@ input[type="password"]::-ms-clear { @media screen and (max-width: 440px) { .scrollbar-thin::-webkit-scrollbar { - height: 2px; /* толщина */ + height: 4px; /* толщина */ } } @@ -541,11 +541,13 @@ input[type="password"]::-ms-clear { @media screen and (max-width: 640px) { .p-dialog .p-dialog-content{ - padding: 6px; + padding: 10px; + } + .p-dialog .p-dialog-header { + padding: 10px; } } - .my-custom-dialog{ width: 650px; } diff --git a/package-lock.json b/package-lock.json index aa6e6679..16f1467d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,11 @@ "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", + "@uiw/react-heat-map": "^2.3.3", "aos": "^2.3.4", "axios": "^1.10.0", "chart.js": "4.2.1", + "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", "next": "13.4.8", "pdfjs-dist": "^5.4.54", @@ -80,6 +82,256 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "peer": true + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "peer": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", @@ -91,6 +343,71 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -246,33 +563,28 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -280,14 +592,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1097,6 +1407,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@uiw/react-heat-map": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@uiw/react-heat-map/-/react-heat-map-2.3.3.tgz", + "integrity": "sha512-PMQ2v7am2yWCXNJcNz6OpbJmb3m6zNxf8NaRvPdCiRtF1NU58JJoGfkmEgXSjopNuu5eg8sBYX/VPC1Of8C0QQ==", + "funding": { + "url": "https://jaywcjlove.github.io/#/sponsor" + }, + "peerDependencies": { + "@babel/runtime": ">=7.10.0", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -1423,6 +1746,21 @@ "dequal": "^2.0.3" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1464,7 +1802,6 @@ "version": "4.25.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1538,6 +1875,14 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001720", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz", @@ -1677,6 +2022,20 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/contribution-heatmap": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/contribution-heatmap/-/contribution-heatmap-1.4.1.tgz", + "integrity": "sha512-ndAHbj+govPWqgGRICmQRpsrIMfAXrz9a1xsXe1/3dR4XGBhqoYdPalmYz+hoYLmBy+Jkz9O1nqY7YOrjQ8JSA==", + "dependencies": { + "styled-components": "^5.3.3" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "peer": true + }, "node_modules/countup": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/countup/-/countup-1.8.2.tgz", @@ -1701,6 +2060,24 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -1716,7 +2093,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1841,8 +2217,7 @@ "node_modules/electron-to-chromium": { "version": "1.5.161", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.161.tgz", - "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==", - "dev": true + "integrity": "sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -2009,7 +2384,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -2673,6 +3047,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2923,6 +3306,14 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -3370,6 +3761,17 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -3698,6 +4100,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", @@ -3871,8 +4278,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.11", @@ -3973,8 +4379,7 @@ "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4251,7 +4656,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, "engines": { "node": ">=8.6" }, @@ -4290,8 +4694,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -4740,6 +5143,11 @@ "node": ">= 0.4" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4898,6 +5306,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -5171,7 +5627,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index 4057f700..dac63798 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", + "@uiw/react-heat-map": "^2.3.3", "aos": "^2.3.4", "axios": "^1.10.0", "chart.js": "4.2.1", + "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", "next": "13.4.8", "pdfjs-dist": "^5.4.54", diff --git a/services/streams.tsx b/services/streams.tsx index ecef3734..88095d0e 100644 --- a/services/streams.tsx +++ b/services/streams.tsx @@ -49,4 +49,29 @@ export const fetchStudentDetail = async (connect_id: number | null, stream_id: n } catch (error) { console.error('Ошибка загрузки:', error); } +}; + +// student calendar contribution +export const fetchStudentCalendar = async (connect_id: number | null, stream_id: number | null, student_id: number | null) => { + try { + const res = await axiosInstance.get(`/v1/teacher/stream/student/calendar/movements?connect_id=${connect_id}&id_stream=${stream_id}&id_student=${student_id}`); + const data = await res.data; + + return data; + } catch (error) { + console.error('Ошибка загрузки:', error); + } +}; + +// student calendar contribution +export const pacticaScoreAdd = async (connect_id: number | null, stream_id: number | null, student_id: number | null, step_id:number, score: number | null) => { + try { + const res = await axiosInstance.get(`/v1/teacher/stream/student/step/record/score?connect_id=${connect_id}&id_stream=${stream_id}&id_student=${student_id}&step_id=${step_id}&score=${score}`); + const data = await res.data; + + return data; + } catch (error) { + console.error('Ошибка загрузки:', error); + return error; + } }; \ No newline at end of file diff --git a/types/ContributionDay.tsx b/types/ContributionDay.tsx new file mode 100644 index 00000000..a9279aea --- /dev/null +++ b/types/ContributionDay.tsx @@ -0,0 +1,4 @@ +export interface ContributionDay { + date: string; + count: number; +} \ No newline at end of file From f979ebd30dc8a746906eee995b1606614aeb50db Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 17 Oct 2025 16:28:23 +0600 Subject: [PATCH 227/286] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 1 - app/(main)/faculty/[id_kafedra]/page.tsx | 4 +- app/(main)/videoInstruct/page.tsx | 4 +- app/components/lessons/LessonInfoCard.tsx | 14 +++- app/components/lessons/StudentInfoCard.tsx | 2 +- app/components/tables/StreamList.tsx | 4 -- app/globals.css | 22 +++--- layout/AppTopbar.tsx | 72 ++++++++++++++++++- layout/StudentLayout.tsx | 4 +- layout/context/layoutcontext.tsx | 1 - layout/layout.tsx | 4 -- services/notifications.tsx | 13 ++++ services/query-tests.http | 12 ++-- types/mainNotification.tsx | 42 +++++++++++ 14 files changed, 158 insertions(+), 41 deletions(-) create mode 100644 services/notifications.tsx create mode 100644 types/mainNotification.tsx diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 3abb01b9..1a24588e 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -105,7 +105,6 @@ export default function LessonStep() { const handleFetchSteps = async (lesson_id: number | null) => { setSkeleton(true); const data = await fetchSteps(Number(lesson_id)); - console.log(data); if (data.success) { setSkeleton(false); diff --git a/app/(main)/faculty/[id_kafedra]/page.tsx b/app/(main)/faculty/[id_kafedra]/page.tsx index 123937fa..05701b35 100644 --- a/app/(main)/faculty/[id_kafedra]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/page.tsx @@ -88,8 +88,8 @@ export default function Kafedra() {
    -
    Количество курсов:{rowData.courses}
    -
    Утверждённых:{rowData.courses_published}
    +
    Количество курсов:{rowData.courses}
    +
    Утверждённых:{rowData.courses_published}
    {/*
    {imageBodyTemplate(rowData)}
    */} diff --git a/app/(main)/videoInstruct/page.tsx b/app/(main)/videoInstruct/page.tsx index f41003df..99564362 100644 --- a/app/(main)/videoInstruct/page.tsx +++ b/app/(main)/videoInstruct/page.tsx @@ -70,9 +70,9 @@ export default function VideoInstruct() {

    Видеоуроки по использованию платформы Mooc

    -
    +
    +
    + + {/* activity */} +
    + +
    +
    +
    + ); +} diff --git a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx index 26cd0431..a71fb45b 100644 --- a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx +++ b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx @@ -197,7 +197,7 @@ export default function StudentCheck() {
    ) : (
    - +

    {/* Название курса: {courseInfo.title} */}

    setActiveIndex(e.index)}> {lessons?.map((item) => { diff --git a/app/(main)/videoInstruct/page.tsx b/app/(main)/videoInstruct/page.tsx index 310fb805..aad105f1 100644 --- a/app/(main)/videoInstruct/page.tsx +++ b/app/(main)/videoInstruct/page.tsx @@ -18,8 +18,6 @@ export default function VideoInstruct() { const router = useRouter(); const handleVideoCall = (value: string | null) => { - console.log(value); - if (!value) { setMessage({ state: true, diff --git a/app/components/Contribution.tsx b/app/components/Contribution.tsx index 29081516..f2b4405e 100644 --- a/app/components/Contribution.tsx +++ b/app/components/Contribution.tsx @@ -1,53 +1,3 @@ -// 'use client'; -// import React from 'react'; -// import dynamic from 'next/dynamic'; - -// const Heatmap = dynamic(() => import('contribution-heatmap').then((mod) => mod.Heatmap as React.ComponentType), { ssr: false }); - -// interface ContributionDay { -// date: string; -// count: number; -// } - -// const ActivityHeatmap = () => { -// const data: ContributionDay[] = [ -// { date: '2025-10-01', count: 3 }, // Ячейка будет цвета уровня 3 -// { date: '2025-10-15', count: 1 }, // Ячейка будет цвета уровня 1 -// { date: '2025-10-31', count: 0 } -// ]; -// const start = new Date('2025-10-01'); -// const end = new Date('2025-10-31'); - -// return ( -//
    -//

    Activity Heatmap

    -// console.log('Clicked:', value)} -// /> -//
    -// ); -// }; - -// export default ActivityHeatmap; - 'use client'; import React from 'react'; import HeatMap from '@uiw/react-heat-map'; // <-- Новый импорт! @@ -55,7 +5,7 @@ import { ContributionDay } from '@/types/ContributionDay'; // Интерфейс для данных остается прежним (но у HeatMap используется prop 'value') -const ActivityHeatmap = ({value}: {value: ContributionDay[] | null}) => { +const ActivityHeatmap = ({value, recipient}: {value: ContributionDay[] | null, recipient: string}) => { // Ваши тестовые данные. Дни, которых нет в этом массиве, останутся пустыми. // const realActivityData: = [ // { date: '2025/01/05', count: 4 }, // Высокая активность в начале года @@ -73,7 +23,7 @@ const ActivityHeatmap = ({value}: {value: ContributionDay[] | null}) => { return (
    -

    Активность студента

    +

    {recipient}

    {value && ({ answers: [{ id: null, text: '', is_correct: false }], id: null, content: '', score: 0, image: null, title: '', created_at: '' }); const [aiOptions, setAiOptions] = useState([]); - const [testValue, setTestValue] = useState<{ title: string; score: number }>({ title: '', score: 0 }); + const [testValue, setTestValue] = useState<{ title: string; score: number, aiCreate: boolean }>({ title: '', score: 0, aiCreate: false}); const [testShow, setTestShow] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); const [testChecked, setTestChecked] = useState<{ idx: null | number; check: boolean }>({ idx: null, check: false }); const [selectId, setSelectId] = useState(null); const [skeleton, setSkeleton] = useState(false); - const [preparationVisible, setPreparationVisible] = useState(false); const clearValues = () => { - setTestValue({ title: '', score: 0 }); + setTestValue({ title: '', score: 0, aiCreate: false }); setAnswer([ { text: '', is_correct: false, id: null }, { text: '', is_correct: false, id: null } @@ -110,7 +109,7 @@ export default function LessonTest({ }; const handleAddTest = async () => { - const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score); + const data = await addTest(answer, testValue.title, element?.lesson_id && Number(element?.lesson_id), element.type.id, element.id, testValue.score, testValue?.aiCreate); if (data?.success) { fetchPropElement(element.id); fetchPropThemes(); @@ -120,7 +119,7 @@ export default function LessonTest({ value: { severity: 'success', summary: 'Успешно добавлен!', detail: '' } }); } else { - setTestValue({ title: '', score: 0 }); + setTestValue({ title: '', score: 0, aiCreate:false }); setEditingLesson(null); setMessage({ state: true, @@ -219,7 +218,7 @@ export default function LessonTest({ const handleDrop = async () => { setProgressSpinner(true); console.log('Был перетащен элемент с id:', forAiTestId); - const data = await generageQuiz(element?.lesson_id && Number(element?.lesson_id), forAiTestId); + const data = await generateQuiz(element?.lesson_id && Number(element?.lesson_id), forAiTestId); if (data.status === 'success') { setProgressSpinner(false); setAiOptions(data?.quiz?.questions); @@ -240,7 +239,6 @@ export default function LessonTest({

    Выберите один тест для дальнейшей работы

    {aiOptions?.map((item) => { - console.log(item); return (
    @@ -272,7 +270,7 @@ export default function LessonTest({ size="small" className="text-sm" onClick={() => { - setTestValue((prev) => ({ ...prev, title: item?.content, score: item?.score })); + setTestValue((prev) => ({ ...prev, title: item?.content, score: item?.score, aiCreate: true })); setAnswer(item.answers); const correctIndex = item.answers?.findIndex((answer) => answer?.is_correct); @@ -462,7 +460,7 @@ export default function LessonTest({ }, [content]); useEffect(() => { - setTestValue({ title: '', score: 0 }); + setTestValue({ title: '', score: 0, aiCreate:false }); }, [element]); return ( diff --git a/app/globals.css b/app/globals.css index b6f855c4..71b82655 100644 --- a/app/globals.css +++ b/app/globals.css @@ -18,6 +18,8 @@ --whiteColor: #ffffff; --borderBottomColor: #e5e7eb; --amberColor: #f7634d; + --productQuantityBg: #d0e1fd; + --productQuantityText: #3b82f6; --fontSize: 16px; --transition: 0.5s; diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index ee8c0cf5..e34165e5 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -75,7 +75,7 @@ const AppMenu = () => { } ] : - !forDepartamentLength ? (user?.is_working && pathname.startsWith('/course')) || pathname.startsWith('/students/') || pathname.startsWith('/unVerifed') || pathname.startsWith('/pdf/') || pathname.startsWith('/videoInstruct/') || pathname.startsWith('/notification') + !forDepartamentLength ? (user?.is_working && pathname.startsWith('/course')) || pathname.startsWith('/students/') || pathname.startsWith('/unVerifed') || pathname.startsWith('/pdf/') || pathname.startsWith('/videoInstruct/') || pathname.startsWith('/notification') || pathname.startsWith('/dashboard') ? [ { // key: 'prev', diff --git a/services/steps.tsx b/services/steps.tsx index 1b8b1804..126423ba 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -220,9 +220,7 @@ export const deleteStep = async (lesson_id: number, step_id: number) => { }; // test -export const addTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, type_id: number, step_id: number, score: number) => { - console.log(score); - +export const addTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, type_id: number, step_id: number, score: number, aiCreate: boolean) => { const payload = { lesson_id, type_id, @@ -515,7 +513,7 @@ export const stepSequenceUpdate = async (lesson_id: number | null, steps: { id: } }; -export const generageQuiz = async (lesson_id: number, step_id: number | string) => { +export const generateQuiz = async (lesson_id: number, step_id: number | string) => { try { const res = await axiosInstance.get(`/v1/teacher/lessons/generate-quiz?lesson_id=${lesson_id}&step_id=${step_id}`); From 96ab5d1d16798b11493f7c7913be2dce6d1027db Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 5 Nov 2025 11:49:47 +0600 Subject: [PATCH 254/286] is_ai true --- app/(main)/dashboard/page.tsx | 5 ++--- app/components/cards/LessonCard.tsx | 27 +++++++++++++++------------ app/components/lessons/LessonTest.tsx | 14 +++++++++----- services/steps.tsx | 7 ++++--- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/app/(main)/dashboard/page.tsx b/app/(main)/dashboard/page.tsx index 8aa0d65f..b87687c8 100644 --- a/app/(main)/dashboard/page.tsx +++ b/app/(main)/dashboard/page.tsx @@ -6,10 +6,9 @@ import ActivityPage from '@/app/components/Contribution'; import Link from 'next/link'; import { useContext, useEffect, useState } from 'react'; -export default function DashBoard() { +export default function Dashboard() { const { user, departament, setMessage } = useContext(LayoutContext); - const [videoCall, setVideoCall] = useState(false); const [videoLink, setVideoLink] = useState(''); const [contribution, setContribution] = useState([{date: 'xxx', count: 3}]); @@ -41,7 +40,7 @@ export default function DashBoard() { } // return `https://www.youtube.com/embed/${videoId}`; setVideoLink(`https://www.youtube.com/embed/${videoId}`); - setVideoCall(true); + // setVideoCall(true); // setVisisble(true); }; diff --git a/app/components/cards/LessonCard.tsx b/app/components/cards/LessonCard.tsx index 84bba812..5596dba4 100644 --- a/app/components/cards/LessonCard.tsx +++ b/app/components/cards/LessonCard.tsx @@ -26,7 +26,7 @@ export default function LessonCard({ status: string; onSelected?: (id: number, type: string) => void; onDelete?: (id: number) => void; - cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string; document?: string; score?: number }; + cardValue: { title: string; id: number; desctiption?: string; type?: string; photo?: string; url?: string; document?: string; score?: number; aiCreate?: boolean }; cardBg: string; type: { typeValue: string; icon: string }; typeColor: string; @@ -100,12 +100,14 @@ export default function LessonCard({
    {/*
    {!cardValue.photo && }
    */} -
    - {cardValue.score ? ( +
    + {/* {cardValue.score ? ( */}
    -
    - Балл: - {`${cardValue.score}`} +
    +
    + Балл: + {`${cardValue.score}`} +
    {status === 'working' && lessonDate && (
    @@ -114,17 +116,17 @@ export default function LessonCard({
    )}
    - ) : ( + {/* ) : ( '' - )} + )} */}
    {cardValue?.title} - {!cardValue.score && status === 'working' && lessonDate && ( + {/* {!cardValue.score && status === 'working' && lessonDate && (
    {lessonDate}
    - )} + )} */}
    @@ -167,6 +169,7 @@ export default function LessonCard({ : cardValue?.desctiption && cardValue?.desctiption !== 'null' &&
    {cardValue.desctiption}
    }
    + {/* video preview */} {videoPreviw} @@ -230,7 +233,7 @@ export default function LessonCard({
    ) : ( diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 73d9c887..3bc396fe 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -37,7 +37,6 @@ export default function StreamList({ const [hasStreams, setHasStreams] = useState(false); const [skeleton, setSkeleton] = useState(false); const [visible, setVisible] = useState(false); - const [contentShow, setContentShow] = useState(false); const [pendingChanges, setPendingChanges] = useState([]); const { setMessage } = useContext(LayoutContext); @@ -187,6 +186,11 @@ export default function StreamList({ insideDisplayStreams(displayStreams); }, [displayStreams]); + useEffect(()=> { + console.log('hi'); + + },[]); + const itemTemplate = (item: mainStreamsType, index: number) => { const bgClass = index % 2 == 0 ? 'bg-[#f5f5f5]' : ''; return ( @@ -271,6 +275,7 @@ export default function StreamList({

    Видеоуроки по использованию платформы Mooc

    -
    -
    - -
    -

    Видеоинструкция по использованию образовательного портала Mooc

    +
    + {videoValues?.map((item) => { + return ( +
    +
    + +
    +

    {item?.title}

    +
    + ); + })}
    ); diff --git a/app/(student)/teaching/[subject_id]/page.tsx b/app/(student)/teaching/[subject_id]/page.tsx index ce275173..bd7f8c95 100644 --- a/app/(student)/teaching/[subject_id]/page.tsx +++ b/app/(student)/teaching/[subject_id]/page.tsx @@ -283,7 +283,7 @@ export default function StudentLesson() { sortedSteps.map( (item: {id: number;chills: boolean;type: { name: string; logo: string };content: { id: number; title: string; description: string; url: string; document: string; document_path: string }, id_parent?: number | null},idx ) => { - if (item.content == null) { + if (item.content == null || item?.type.name === 'forum') { return null; } diff --git a/app/components/lessons/LessonForum.tsx b/app/components/lessons/LessonForum.tsx index fc44e49a..b9b2ea17 100644 --- a/app/components/lessons/LessonForum.tsx +++ b/app/components/lessons/LessonForum.tsx @@ -2,15 +2,14 @@ import { lessonSchema } from '@/schemas/lessonSchema'; import { yupResolver } from '@hookform/resolvers/yup'; -import { useParams, useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { ProgressSpinner } from 'primereact/progressspinner'; -import { useContext, useEffect, useRef, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; -import { addDocument, addForum, addLink, addPractica, deleteDocument, deleteForum, deleteLink, deletePractica, fetchElement, stepSequenceUpdate, updateDocument, updateForum, updateLink, updatePractica } from '@/services/steps'; +import { addForum, deleteForum, fetchElement, stepSequenceUpdate, updateForum } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; @@ -236,9 +235,7 @@ export default function LessonForum({ element, content, fetchPropElement, clearP ); }; - useEffect(() => { - console.log(content); - + useEffect(() => { if (content) { setContentShow(true); setForum(content); diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index e9a8f135..c5f706f9 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -2,16 +2,14 @@ import { lessonSchema } from '@/schemas/lessonSchema'; import { yupResolver } from '@hookform/resolvers/yup'; -import { useParams, useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { ProgressSpinner } from 'primereact/progressspinner'; -import { useContext, useEffect, useRef, useState } from 'react'; +import { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; -import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { addDocument, addLink, addPractica, deleteDocument, deleteLink, deletePractica, fetchElement, stepSequenceUpdate, updateDocument, updateLink, updatePractica } from '@/services/steps'; +import { addLink, deleteLink, fetchElement, stepSequenceUpdate, updateLink } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; diff --git a/app/components/popUp/Tiered.tsx b/app/components/popUp/Tiered.tsx index 66683af0..be25a7af 100644 --- a/app/components/popUp/Tiered.tsx +++ b/app/components/popUp/Tiered.tsx @@ -55,7 +55,7 @@ export default function Tiered({ title, items, insideColor }: TieredProps) { ref={menu} breakpoint="1000px" style={{ width: media ? '290px' : '220px', left: '10px' }} - className={`pointer mt-4 max-h-[200px] overflow-y-scroll`} + className={`pointer mt-4 max-h-[250px] sm:max-h-[200px] overflow-y-scroll`} pt={{ root: { className: `bg-white border w-[500px] border-gray-300 rounded-md shadow-md` }, menu: { className: 'transition-all' }, diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 3bc396fe..6db6ccb8 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -183,14 +183,9 @@ export default function StreamList({ }, [streams]); useEffect(() => { - insideDisplayStreams(displayStreams); + insideDisplayStreams(displayStreams); }, [displayStreams]); - useEffect(()=> { - console.log('hi'); - - },[]); - const itemTemplate = (item: mainStreamsType, index: number) => { const bgClass = index % 2 == 0 ? 'bg-[#f5f5f5]' : ''; return ( diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 7307efc5..03f75cc9 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -37,6 +37,7 @@ const AppTopbar = forwardRef((props, ref) => { const [skeleton, setSkeleton] = useState(true); const [notification, setNotification] = useState([]); + // const [groupNotifications, setGroupNotifications] = useState([]); const options: OptionsType = { month: 'short', // 'long', 'short', 'numeric' @@ -52,9 +53,110 @@ const AppTopbar = forwardRef((props, ref) => { console.log(data); setNotification(data); + // setNotification((prev) => [...prev, { type: { type: 'lorem' } }, { type: { type: 'second' } }]); } }; + const Notificatoin = () => { + const typeObjs = {}; + + // if (notification?.length > 0) { + // for (let i = 0; i < notification.length; i++) { + // const currentType = notification[i]?.type?.type; + + // if (!typeObjs[currentType]) { + // // Если ключа ещё нет — создаём пустой массив + // typeObjs[currentType] = []; + // } + + // // Добавляем значение в массив этого ключа + // typeObjs[currentType].push(notification[i]); + // } + // } + + console.log(typeObjs); + + return ( +
    + {Object.values(typeObjs)?.length > 1 ? ( + Object.entries(typeObjs).map((el:any) => { + const item = el[1]; + console.log(item); + let path = ''; + if (user?.is_working && item?.type?.type === 'practical') { + path = `/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`; + } else if (user?.is_student && item?.type?.type === 'practical') { + path = `/teaching/lessonView/${item?.meta?.lesson_id}/${item?.meta?.id_curricula}/${item?.meta?.stream_id}/${item?.meta?.step_id}`; + } + + return ( +
    +
    + setContextNotificationId(item?.id)} className="cursor-pointer hover:underline" href={path}> + {item?.type?.title} + + +
    + + {/* student message */} + {user?.is_student && item?.type?.type === 'practical' && ( + + {item?.title} + + )} +

    + {item?.from_user?.last_name} {item?.from_user?.name} +

    +
    +

    + +

    +
    +
    + ); + }) + ) : notification?.length > 0 ? ( + notification?.map((item) => { + let path = ''; + if (user?.is_working && item?.type?.type === 'practical') { + path = `/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`; + } else if (user?.is_student && item?.type?.type === 'practical') { + path = `/teaching/lessonView/${item?.meta?.lesson_id}/${item?.meta?.id_curricula}/${item?.meta?.stream_id}/${item?.meta?.step_id}`; + } + + return ( +
    +
    + setContextNotificationId(item?.id)} className="cursor-pointer hover:underline" href={path}> + {item?.type?.title} + + +
    + + {/* student message */} + {user?.is_student && item?.type?.type === 'practical' && ( + + {item?.title} + + )} +

    + {item?.from_user?.last_name} {item?.from_user?.name} +

    +
    +

    + +

    +
    +
    + ); + }) + ) : ( +

    Сообщений нет

    + )} +
    + ); + }; + const working_notification = [ // { // label: '', @@ -66,41 +168,7 @@ const AppTopbar = forwardRef((props, ref) => { // }, { label: '', - template: ( -
    - {notification?.length > 0 ? ( - notification?.map((item) => { - let path = ''; - if (user?.is_working && item?.type?.type === 'practical') { - path = `/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`; - } - return ( -
    -
    - setContextNotificationId(item?.id)} - className="cursor-pointer hover:underline" - // href={`/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`} - href={path} - > - {item?.type?.title} - - -
    -

    - {item?.from_user?.last_name} {item?.from_user?.name} -

    -
    -

    -
    -
    - ); - }) - ) : ( -

    Сообщений нет

    - )} -
    - ) + template: } ]; @@ -161,37 +229,9 @@ const AppTopbar = forwardRef((props, ref) => { { label: '', template: ( - //
    -
    - {notification?.length > 0 ? ( - notification?.map((item) => { - let path = ''; - if (user?.is_working && item?.type?.type === 'practical') { - path = `/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`; - } - - return ( -
    -
    - setContextNotificationId(item?.id)} href={path}> - {item?.type?.title} - - -
    -

    - {item?.from_user?.last_name} {item?.from_user?.name} -

    -
    -

    -
    -
    - ); - }) - ) : ( -

    Сообщений нет

    - )} +
    +
    - //
    ) } ] @@ -250,9 +290,7 @@ const AppTopbar = forwardRef((props, ref) => { label: 'Вход', icon: 'pi pi-sign-in', items: [], - // url: '/auth/login' command: () => { - // router.push('/auth/login'); window.location.href = '/auth/login'; } }, @@ -263,49 +301,16 @@ const AppTopbar = forwardRef((props, ref) => {
    {/* Условное отображение красного кружка (бэйджа) */} - {notification?.length > 0 && ( - //
    - - //
    - )} + {notification?.length > 0 && }
    ), items: [ { label: '', template: ( - //
    -
    - {notification?.length > 0 ? ( - notification?.map((item) => { - let path = ''; - if (user?.is_student && item?.type?.type === 'practical') { - path = `/teaching/lessonView/${item?.meta?.lesson_id}/${item?.meta?.id_curricula}/${item?.meta?.stream_id}/${item?.meta?.step_id}`; - } - - return ( -
    -
    - setContextNotificationId(item?.id)} href={path}> - {item?.type?.title} - - -
    - {user?.is_student && item?.type?.type === 'practical' && {item?.title}} -

    - {item?.from_user?.last_name} {item?.from_user?.name} -

    -
    -

    -
    -
    - ); - }) - ) : ( -

    Сообщений нет

    - )} +
    +
    - //
    ) } ] @@ -350,46 +355,10 @@ const AppTopbar = forwardRef((props, ref) => { } ]; - // - const student_notification = [ { label: '', - template: ( -
    - {notification?.length > 0 ? ( - notification?.map((item) => { - let path = ''; - if (user?.is_student && item?.type?.type === 'practical') { - path = `/teaching/lessonView/${item?.meta?.lesson_id}/${item?.meta?.id_curricula}/${item?.meta?.stream_id}/${item?.meta?.step_id}`; - } - return ( -
    -
    - setContextNotificationId(item?.id)} className="cursor-pointer hover:underline" href={path}> - {item?.type?.title} - - -
    - {user?.is_student && item?.type?.type === 'practical' && ( - - {item?.title} - - )} -

    - {item?.from_user?.last_name} {item?.from_user?.name} -

    -
    -

    -
    -
    - ); - }) - ) : ( -

    Сообщений нет

    - )} -
    - ) + template: } ]; @@ -410,32 +379,6 @@ const AppTopbar = forwardRef((props, ref) => { } }, [user]); - //
    - // {notificationGroup?.state ? ( - //
    - // setNotificationGroup({state: false, type: ''})}> - //
    - // {notificationGroup?.type === 'practical' ? 'he he baby' : 'not bab'} - //
    - //
    - // ) : ( - //
    setNotificationGroup({state: true, type: 'practical'})}> - //
    - // setContextNotificationId(item?.id)} - // className="hover:underline" - // // href={`/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`} - // > - // {'Практическое задание'} - // - // - //
    - //

    10 сообщений

    - //
    {/*

    xx-xx-xx

    */}
    - //
    - // )} - //
    - return (
    @@ -446,7 +389,7 @@ const AppTopbar = forwardRef((props, ref) => { {pathName !== '/' ? ( // departament.name.length > 0 ? ( - !pathName.startsWith('/pdf') && !pathName.startsWith('/students/') && !pathName.startsWith('/videoInstruct') ? ( + !pathName.startsWith('/pdf') && !pathName.startsWith('/videoInstruct') ? ( @@ -482,9 +425,7 @@ const AppTopbar = forwardRef((props, ref) => { label: 'Вход', icon: 'pi pi-sign-in', items: [], - // url: '/auth/login' command: () => { - // router.push('/auth/login'); window.location.href = '/auth/login'; } } From 09a76aa0da3e30fd71f913164d8f144081364da8 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 7 Nov 2025 09:44:18 +0600 Subject: [PATCH 257/286] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=B1=D0=B8=D0=BB=D0=B4=D0=B0=20=D1=83=D1=81=D0=BF?= =?UTF-8?q?=D0=B5=D1=88=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/[course_Id]/[lesson_id]/page.tsx | 2 +- app/(main)/videoInstruct/page.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index c1948523..cb6722fd 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -472,7 +472,7 @@ export default function LessonStep() {

    {/* */} - '----' + {/* '----' */}

    diff --git a/app/(main)/videoInstruct/page.tsx b/app/(main)/videoInstruct/page.tsx index 6d9825d2..c142dd60 100644 --- a/app/(main)/videoInstruct/page.tsx +++ b/app/(main)/videoInstruct/page.tsx @@ -62,9 +62,9 @@ export default function VideoInstruct() {

    Видеоуроки по использованию платформы Mooc

    - {videoValues?.map((item) => { + {videoValues?.map((item, idx) => { return ( -
    +
    -
    + //
    + //
    + //
    + // Кол-о курсов + // + //
    + //
    30
    + // + // 4 созданы за последние 30 дней + // + //
    + //
    + //
    + // Кол-о курсов + // + //
    + //
    30
    + // + // 4 созданы за последние 30 дней + // + //
    + //
    + //
    + // Кол-о курсов + // + //
    + //
    30
    + // + // 4 созданы за последние 30 дней + // + //
    + //
    + //
    + // Уведомления + // + //
    + //
    30 сообщений
    + // + // + // перейти + // + // + //
    + //
    + + //
    + // {/* video instruct */} + //
    + // + //
    - {/* activity */} -
    - -
    -
    -
    - ); + // {/* activity */} + //
    + // + //
    + //
    + //
    + // ); } diff --git a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx index 6eaa33d0..8f5eeb39 100644 --- a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx +++ b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx @@ -209,7 +209,7 @@ export default function Forum() { setSendMessage(''); setIsLoadingOlder(false); setProgressSpinner(false); - setForumValue((prev) => (prev ? { ...prev, data: [...prev.data, data?.data] } : prev)); + setForumValue((prev) => (prev ? { ...prev, data: [data?.data, ...prev.data] } : prev)); // setForumValue(data?.data); setMessage({ state: true, @@ -400,7 +400,7 @@ export default function Forum() {
    {/* header section */} -
    +
    */} {progressSpinner && }
    @@ -602,6 +603,7 @@ export default function Course() {
    + {/* Мобильный курс */} {media ? ( <> - {/* mobile table section */} {/* mobile table section */} {hasCourses ? ( <> @@ -689,19 +690,13 @@ export default function Course() { className="p-tabview p-tabview-nav p-tabview-selected p-tabview-panels p-tabview-panel" >
    - setForStreamCount(value)} - fetchprop={() => contextFetchCourse(pageState)} - toggleIndex={() => setActiveIndex(0)} - /> + contextFetchCourse(pageState)} toggleIndex={() => setActiveIndex(0)} />
    ) : ( + // Десктопный курс
    {/* info section */} @@ -734,7 +729,7 @@ export default function Course() { ) : (
    - + rowIndex + 1} header="#" style={{ width: '20px' }}>
    -
    +
    {/* STREAMS SECTION */}
    - setForStreamCount(value)} - fetchprop={() => contextFetchCourse(pageState)} - toggleIndex={() => {}} - /> + contextFetchCourse(pageState)} toggleIndex={() => {}} />
    )} diff --git a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx index 8f5eeb39..f9606a22 100644 --- a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx +++ b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx @@ -318,16 +318,28 @@ export default function Forum() { return (
    {parendItem && ( - + )}
    -
    +
    {item?.user?.name}
    @@ -400,7 +412,7 @@ export default function Forum() {
    {/* header section */} -
    +
    )}
    @@ -478,41 +475,53 @@ export default function Course() { footerValue={{ footerState: editMode, reject: 'Назад', next: 'Сохранить' }} >
    -
    -
    - {/*
    - + {/*
    +
    - -
    */}
    - {/*
    */} - { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - title: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - title: e.target.value - })); - }} - /> - {/*
    */} +
    + { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + title: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + title: e.target.value + })); + }} + /> + {/*
    {progressSpinner && }
    @@ -814,7 +823,7 @@ export default function Course() { className="flex items-center justify-center h-[60px] border-b-0" body={(rowData) => (
    - +
    )} /> diff --git a/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx index 95d78f97..c7100817 100644 --- a/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx +++ b/app/(main)/faculty/[id_kafedra]/[myedu_id]/page.tsx @@ -124,7 +124,7 @@ export default function CoursesDep() { ) : ( <> -

    Преподаватели

    +

    Курсы

    rowIndex + 1} header="#" style={{ width: '20px' }}> diff --git a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx index f9606a22..934dc1cc 100644 --- a/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx +++ b/app/(main)/students/forum/[stepId]/[id_parent]/[forum_id]/page.tsx @@ -343,7 +343,7 @@ export default function Forum() { {item?.user?.name}
    - {user?.id === item?.user?.id && } + {user?.id === item?.user?.id && }
    diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 283f3556..b2f672cd 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -370,7 +370,7 @@ export default function LessonTest({ ) : (
    -
    +
    +
    + {!testValue.title?.length && *Добавтье вопрос } + {!testChecked.check && *Добавтье правильный ответ} + *Балл за тест ({testValue?.score || '0'}) +
    diff --git a/app/components/popUp/Redacting.tsx b/app/components/popUp/Redacting.tsx index 39988e4f..ce4f04b4 100644 --- a/app/components/popUp/Redacting.tsx +++ b/app/components/popUp/Redacting.tsx @@ -3,12 +3,17 @@ import type { Menu as MenuRef } from 'primereact/menu'; import { MenuItem } from 'primereact/menuitem'; import { useRef } from 'react'; -export default function Redacting({ redactor, textSize }: {redactor: MenuItem[], textSize: string}) { +export default function Redacting({ redactor, textSize }: { redactor: MenuItem[]; textSize: string }) { const menuLeft = useRef(null); - + return (
    - menuLeft.current?.toggle(event)} aria-controls="popup_menu_left" aria-haspopup /> + menuLeft.current?.toggle(event)} + aria-controls="popup_menu_left" + aria-haspopup + />
    diff --git a/types/confirmDialog/ConfirmDialogOptions.tsx b/types/confirmDialog/ConfirmDialogOptions.tsx new file mode 100644 index 00000000..2ca7edb7 --- /dev/null +++ b/types/confirmDialog/ConfirmDialogOptions.tsx @@ -0,0 +1,12 @@ +export type ConfirmDialogOptions = { + message: string; + header?: string; + icon?: string; + defaultFocus?: 'accept' | 'reject'; + accept?: () => void; + reject?: () => void; + acceptLabel?: string; + rejectLabel?: string; + acceptClassName?: string; + rejectClassName?: string; +}; \ No newline at end of file diff --git a/utils/getRedactor.tsx b/utils/getRedactor.tsx index dee55be4..2d7713a9 100644 --- a/utils/getRedactor.tsx +++ b/utils/getRedactor.tsx @@ -1,33 +1,23 @@ +import { ConfirmDialogOptions } from '@/types/confirmDialog/ConfirmDialogOptions'; import { confirmDialog } from 'primereact/confirmdialog'; -type ConfirmDialogOptions = { - message: string; - header?: string; - icon?: string; - defaultFocus?: 'accept' | 'reject'; - accept?: () => void; - reject?: () => void; - acceptLabel?: string; - rejectLabel?: string; - acceptClassName?: string; - rejectClassName?: string; -}; - interface RedactorType { getConfirmOptions: (id: number, onDelete: (id: number) => void) => ConfirmDialogOptions; onEdit: (id: number, type: string) => void; onDelete: (id: number) => void; } -export const getRedactor = (status: string, rowData: any, handlers: any) => [ +interface redactorValueType { + id: number; + type?: string; +} + +export const getRedactor = (redactorValues: redactorValueType, handlers: RedactorType) => [ { label: '', icon: 'pi pi-pencil', command: () => { - // const checkArg = handlers.onEdit(rowData.id, rowData?.type); - // if(handlers.onEdit) { - handlers.onEdit(rowData.id, rowData?.type); - // } + handlers.onEdit(redactorValues.id, redactorValues?.type || ''); } }, { @@ -35,10 +25,10 @@ export const getRedactor = (status: string, rowData: any, handlers: any) => [ icon: 'pi pi-trash', command: () => { // if(handlers.onDelete){ - const options = handlers.getConfirmOptions(Number(rowData.id), handlers.onDelete ); - // if(options){ - confirmDialog(options); - // } + const options = handlers.getConfirmOptions(Number(redactorValues.id), handlers.onDelete); + // if(options){ + confirmDialog(options); + // } // } } } From d2fd14dda02e5b587e1009814487fe54c57412da Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 11 Nov 2025 11:16:05 +0600 Subject: [PATCH 262/286] =?UTF-8?q?=D0=92=D1=8B=D0=B2=D0=B5=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D1=83=D0=B6=D1=83=20=D1=84=D0=B8=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- layout/AppTopbar.tsx | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 03f75cc9..3b6ea4ed 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -74,12 +74,10 @@ const AppTopbar = forwardRef((props, ref) => { // } // } - console.log(typeObjs); - return (
    {Object.values(typeObjs)?.length > 1 ? ( - Object.entries(typeObjs).map((el:any) => { + Object.entries(typeObjs).map((el: any) => { const item = el[1]; console.log(item); let path = ''; @@ -458,7 +456,7 @@ const AppTopbar = forwardRef((props, ref) => {
    {user?.is_working ? ( // -
    +
    {notification?.length > 0 ?
    {notification.length}
    : ''}
    ) : user?.is_student ? ( -
    +
    {notification?.length > 0 ?
    {notification.length}
    : ''} +
    ) : (
    From 9553f94fba50d79a43a952656d1f21d9c61d2e2f Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 11 Nov 2025 15:43:13 +0600 Subject: [PATCH 263/286] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=B1=D1=83=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/Contribution.tsx | 37 +++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/app/components/Contribution.tsx b/app/components/Contribution.tsx index f2b4405e..1b5b1681 100644 --- a/app/components/Contribution.tsx +++ b/app/components/Contribution.tsx @@ -5,26 +5,23 @@ import { ContributionDay } from '@/types/ContributionDay'; // Интерфейс для данных остается прежним (но у HeatMap используется prop 'value') -const ActivityHeatmap = ({value, recipient}: {value: ContributionDay[] | null, recipient: string}) => { - // Ваши тестовые данные. Дни, которых нет в этом массиве, останутся пустыми. - // const realActivityData: = [ - // { date: '2025/01/05', count: 4 }, // Высокая активность в начале года - // { date: '2025/03/10', count: 4 }, - // { date: '2025/07/20', count: 1 }, - // { date: '2025/11/01', count: 3 } - // // ... и т.д. Только дни с активностью! - // ]; +const ActivityHeatmap = ({ value, recipient }: { value: ContributionDay[] | null; recipient: string }) => { + const months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек']; + const weekdays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']; - const months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'] - const weekdays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'] + // const start = new Date('2025-01-01'); // 1 января + // const end = new Date('2025-12-31'); // 31 декабря - const start = new Date('2025-01-01'); // 1 января - const end = new Date('2025-12-31'); // 31 декабря + const end = new Date(); // сегодня + const start = new Date(); + start.setFullYear(end.getFullYear() - 1); return (
    -

    {recipient}

    - {value && +

    + {recipient} +

    + {value && ( { + // data = { date, count, column, row, index } + return ( + + {`${data?.date && String(data.date ?? '—')}: ${data?.count || 0} активностей`} + + ); + }} monthLabels={months} weekLabels={weekdays} className="w-full min-w-[900px] m-auto flex " // onClick в этой библиотеке называется rectRender или нужно использовать обертку // Здесь мы его пока опустим, чтобы сфокусироваться на отображении /> - } + )}
    ); }; From b8aa15b605e9aa585b31c0f17c7dc3657f95f7c7 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 11 Nov 2025 16:02:52 +0600 Subject: [PATCH 264/286] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=B4=D1=84=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 4 ++-- app/components/PDFBook.tsx | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index bfad6948..7dfc5e03 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -506,7 +506,7 @@ export default function Course() { }} /> {/*
    {progressSpinner && }
    diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index a2a9b411..64ad947f 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -38,7 +38,10 @@ export default function PDFViewer({ url }: { url: string }) { setSkeleton(true); try { // Проверяем, одна ли страница в документе - let newUrl = `https://api-dev.mooc.oshsu.kg/public/temprory-file/${url}`; + // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; + const inApiString = process.env.NEXT_PUBLIC_BASE_URL; + let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; + const pdf = await pdfjsLib.getDocument(newUrl).promise; setTotalPages(pdf.numPages); const tempPages = []; @@ -47,7 +50,6 @@ export default function PDFViewer({ url }: { url: string }) { // Получаем оригинальное соотношение сторон первой страницы const viewport = firstPage.getViewport({ scale: 1.5 }); const aspectRatio = viewport.width / viewport.height; - console.log(pdf.numPages); for (let i = 1; i <= pdf.numPages; i++) { const page = await pdf.getPage(i); From bcad8e54c9b9c271f2ab5c4eac318a00db73c51b Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 11 Nov 2025 17:25:46 +0600 Subject: [PATCH 265/286] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B5=20?= =?UTF-8?q?=D1=83=D1=80=D0=BE=D0=BA=D0=B8=20=D1=81=D1=82=D1=83=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20=D0=BE=D1=82=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20(=D0=B0=D0=BA?= =?UTF-8?q?=D0=BA=D0=B0=D1=80=D0=B4=D0=B8=D0=BE=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(student)/teaching/[subject_id]/page.tsx | 57 +++++++++++--------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/app/(student)/teaching/[subject_id]/page.tsx b/app/(student)/teaching/[subject_id]/page.tsx index ce275173..51c24963 100644 --- a/app/(student)/teaching/[subject_id]/page.tsx +++ b/app/(student)/teaching/[subject_id]/page.tsx @@ -1,6 +1,5 @@ 'use client'; -import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; import StudentInfoCard from '@/app/components/lessons/StudentInfoCard'; import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; @@ -8,9 +7,8 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchItemsLessons, fetchMainLesson, fetchSubjects } from '@/services/studentMain'; import { lessonType } from '@/types/lessonType'; -import Link from 'next/link'; import { useParams } from 'next/navigation'; -import { Accordion, AccordionTab, AccordionTabChangeEvent } from 'primereact/accordion'; +import { Accordion, AccordionTab } from 'primereact/accordion'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useState } from 'react'; @@ -22,10 +20,12 @@ export default function StudentLesson() { streams: number[]; } + interface CourseType { id: number; connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; title: string; description: string; user: { last_name: string; name: string; father_name: string }; lessons: lessonType[] }[] + const { subject_id } = useParams(); const params = new URLSearchParams(); - const { setMessage, forumValuse, setForumValues } = useContext(LayoutContext); + const { setMessage, setForumValues } = useContext(LayoutContext); const showError = useErrorMessage(); const [main_id, setMain_id] = useState(null); @@ -35,13 +35,8 @@ export default function StudentLesson() { const [lessons, setLessons] = useState>({ 1: { semester: { name_kg: '' } } }); - const [courses, setCourses] = useState< - { id: number; connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; title: string; description: string; user: { last_name: string; name: string; father_name: string }; lessons: lessonType[] }[] - >([]); + const [courses, setCourses] = useState([]); const [hasThemes, setHasThemes] = useState(false); - const [activeAccordion, setActiveAccordion] = useState(0); - const [activeIndex, setActiveIndex] = useState(0); - const [activeIndexes, setActiveIndexes] = useState>({}); const [accordionIndex, setAccordionIndex] = useState({ index: null }); @@ -77,7 +72,7 @@ export default function StudentLesson() { return course.lessons[index]?.id; }; - const handleTabChange = async (courseId: number, e: any) => { + const handleTabChange = async (courseInside: CourseType[],courseId: number, e: any) => { // 1. Обновление активного индекса (ОК) setActiveIndexes((prev) => ({ ...prev, @@ -85,7 +80,7 @@ export default function StudentLesson() { })); setAccordionIndex({ index: e.index }); - const course = courses.find((c) => c.id === courseId); + const course = courseInside.find((c) => c.id === courseId); // Если вкладка закрывается (e.index == null или -1), // нет необходимости в загрузке данных @@ -113,7 +108,6 @@ export default function StudentLesson() { ); const newSteps = await handleMainLesson(lessonId, stream.id_stream); - console.warn(newSteps); if (newSteps) { // 3. Обновляем состояние courses: добавляем steps к нужному уроку setCourses((prevCourses) => @@ -140,8 +134,6 @@ export default function StudentLesson() { const handleFetchLessons = async () => { setSkeleton(true); const data = await fetchItemsLessons(); - console.log(data); - if (data) { // валидность проверить setLessons(data); @@ -166,12 +158,16 @@ export default function StudentLesson() { subject?.streams.forEach((i) => params.append('streams[]', String(i))); subject?.course_ids.forEach((i) => params.append('course_ids[]', String(i))); const data = await fetchSubjects(params); - console.log(data); - setSkeleton(true); - if (data) { + if (data && Array.isArray(data)) { setCourses(data); + if (data && data?.length > 0) { + const courseId = data[0].id; + if (courseId) { + handleTabChange(data, courseId, { index: 0 }); + } + } setHasThemes(false); setSkeleton(false); } else { @@ -257,7 +253,7 @@ export default function StudentLesson() { )}
    - handleTabChange(course.id, e)} multiple={false} expandIcon="" collapseIcon=""> + handleTabChange(courses, course.id, e)} multiple={false} expandIcon="" collapseIcon=""> {course?.lessons.map((lesson) => { const contentPresence = lesson?.steps?.filter((content) => content.content); const sortedSteps = contentPresence?.sort((a, b) => { @@ -281,8 +277,16 @@ export default function StudentLesson() { ) : sortedSteps && sortedSteps?.length > 0 ? ( sortedSteps.map( - (item: {id: number;chills: boolean;type: { name: string; logo: string };content: { id: number; title: string; description: string; url: string; document: string; document_path: string }, id_parent?: number | null},idx - ) => { + ( + item: { + id: number; + chills: boolean; + type: { name: string; logo: string }; + content: { id: number; title: string; description: string; url: string; document: string; document_path: string }; + id_parent?: number | null; + }, + idx + ) => { if (item.content == null) { return null; } @@ -301,12 +305,15 @@ export default function StudentLesson() { lesson={lesson.id} subjectId={subject_id} chills={item?.chills} - fetchProp={() => handleTabChange(course.id, accordionIndex)} + fetchProp={() => handleTabChange(courses, course.id, accordionIndex)} contentId={item?.content?.id} id_parent={item?.id_parent || null} - forumValueAdd={()=> { - setForumValues({description: item?.content.title || '', userInfo: {userName: course?.user?.name, userLastName: course?.user?.last_name}}); - localStorage.setItem('forumValues', JSON.stringify({description: item?.content.title || '', userInfo: {userName: course?.user?.name, userLastName: course?.user?.last_name}})); + forumValueAdd={() => { + setForumValues({ description: item?.content.title || '', userInfo: { userName: course?.user?.name, userLastName: course?.user?.last_name } }); + localStorage.setItem( + 'forumValues', + JSON.stringify({ description: item?.content.title || '', userInfo: { userName: course?.user?.name, userLastName: course?.user?.last_name } }) + ); }} />
    From 7abca7fea65d2ac4c519da78900ebb01c9c2a2c5 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 12 Nov 2025 10:02:26 +0600 Subject: [PATCH 266/286] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B0=D1=8F=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[lesson_id]/[step_id]/page.tsx | 16 +-- .../[connect_id]/[stream_id]/page.tsx | 7 +- .../[subject_id]/[stream_id]/[id]/page.tsx | 23 ++-- app/components/lessons/LessonInfoCard.tsx | 7 +- app/components/lessons/StudentInfoCard.tsx | 102 ------------------ 5 files changed, 17 insertions(+), 138 deletions(-) diff --git a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx index a71fb45b..cf980086 100644 --- a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx +++ b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx @@ -11,14 +11,11 @@ import { fetchStudentCalendar, fetchStudentDetail, pacticaDisannul, pacticaScore import { ContributionDay } from '@/types/ContributionDay'; import { lessonType } from '@/types/lessonType'; import { mainStepsType } from '@/types/mainStepType'; -import { studentType } from '@/types/studentType'; import { useParams } from 'next/navigation'; import { Accordion, AccordionTab } from 'primereact/accordion'; import { useContext, useEffect, useState } from 'react'; export default function StudentCheck() { - // type - interface mainStep {} const { connect_id, stream_id, student_id, lesson_id, step_id } = useParams(); const params = useParams(); @@ -29,7 +26,6 @@ export default function StudentCheck() { const [mainSkeleton, mainSetSkeleton] = useState(false); const [lessons, setLessons] = useState(null); - const [student, setStudent] = useState(null); const [hasSteps, setHasSteps] = useState(false); const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [contribution, setContribution] = useState(null); @@ -40,13 +36,11 @@ export default function StudentCheck() { const handleFetchStreams = async () => { mainSetSkeleton(true); const data = await fetchStudentDetail(lesson_id ? Number(lesson_id) : null, connect_id ? Number(connect_id) : null, stream_id ? Number(stream_id) : null, student_id ? Number(student_id) : null, step_id ? Number(step_id) : null); - console.log(data); if (data?.success) { // handleStatusView(); setHasSteps(false); mainSetSkeleton(false); - setStudent(data?.student); setLessons(data?.lessons); } else { mainSetSkeleton(false); @@ -96,13 +90,7 @@ export default function StudentCheck() { if (data && Array.isArray(data)) { setContribution(data); - // setHasInfo(false); - // mainSetSkeleton(false); - // setStudent(data?.student); - // setLessons(data?.lessons); } else { - // mainSetSkeleton(false); - // setHasInfo(true); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } @@ -140,9 +128,7 @@ export default function StudentCheck() { } }; - const handlePracticaDisannul = async (id_curricula:number, course_id:number, id_stream:number, id:number, steps_id:number, message: string) => { - console.log(message); - + const handlePracticaDisannul = async (id_curricula:number, course_id:number, id_stream:number, id:number, steps_id:number, message: string) => { const data = await pacticaDisannul(id_curricula, course_id, id_stream, Number(student_id), steps_id, message); if (data?.success) { diff --git a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx index 48e37db7..6ab46a86 100644 --- a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx +++ b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx @@ -2,14 +2,13 @@ import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; -import useBreadCrumbs from '@/hooks/useBreadCrumbs'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchStreams, fetchStreamStudents } from '@/services/streams'; import { mainStreamsType } from '@/types/mainStreamsType'; import Link from 'next/link'; -import { useParams, usePathname } from 'next/navigation'; +import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; import { Column } from 'primereact/column'; import { DataTable } from 'primereact/datatable'; @@ -22,13 +21,11 @@ export default function StudentList() { const [streams, setStreams] = useState([]); const [stream, setStream] = useState(null); - const { setMessage, setGlobalLoading } = useContext(LayoutContext); + const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); const { cource_id, connect_id, stream_id } = useParams(); - const media = useMediaQuery('(max-width: 640px)'); - const pathname = usePathname(); // functions const toggleSkeleton = () => { diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index 8c458402..20c8f130 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -5,7 +5,7 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { statusView } from '@/services/notifications'; -import { fetchItemsLessons, fetchMainLesson, fetchStudentSteps, fetchSubjects, stepPractica, stepTest } from '@/services/studentMain'; +import { fetchItemsLessons, fetchStudentSteps, fetchSubjects, stepPractica, stepTest } from '@/services/studentMain'; import { docValueType } from '@/types/docValueType'; import { lessonType } from '@/types/lessonType'; import { mainStepsType } from '@/types/mainStepType'; @@ -406,7 +406,7 @@ export default function LessonTest() {
    {practica?.content?.description &&
    } -
    +
    {practica?.content?.document_path && practica?.content.document_path.toLowerCase().includes('pdf') && ( <> @@ -432,18 +432,20 @@ export default function LessonTest() {
    + {/*
    + Сообщения от преподавателя + +
      +
    • Loremipsumdolorsitametconsecteturadipisicingelit. Mollitia, illum.
    • +
    • Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia, illum.
    • +
    +
    */} + {steps?.chills ? ( Задание выполнено ) : (
    - Задание после изучения материала, загрузи свой файл с решением. - - {/* Сообщения от преподавателя -
      -
    • Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia, illum.
    • -
    • Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia, illum.
    • -
    */} - + Задание после изучения материала, загрузи свой файл с решением.
    }
    ); - const testInfo = ( -
    - {/* {test?.answers && ( -
    -
    - {test?.content} -
    -
    - {test?.answers.map((item) => { - return ( -
    - -
    - ); - })} -
    -
    - Балл за тест: - {`${test?.score}`} -
    -
    - )} */} -
    - ); - const practicaCard = (
    @@ -242,52 +208,6 @@ export default function StudentInfoCard({
    ); - const practicaInfo = ( -
    - {/*
    - {documentUrl ? ( - documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( - - {title} - - ) : ( -
    - {title} -
    - ) - ) : ( -
    - {title} -
    - )} -

    {description !== 'null' && description}

    -
    -
    -
    - Документ: - {documentUrl && documentUrl.document_path && documentUrl.document_path?.length > 0 ? ( - - ) : ( - - )} -
    - -
    - Ссылка: - {link ? ( - - {link} - - ) : ( - - ? - - )} -
    -
    */} -
    - ); - const forumCard = (
    @@ -306,28 +226,6 @@ export default function StudentInfoCard({ return (
    - { - if (!testCall) return; - setTestCall(false); - }} - > -
    {testInfo}
    -
    - { - if (!practicaCall) return; - setPracticaCall(false); - }} - > -
    {practicaInfo}
    -
    {type === 'document' && docCard}
    {type === 'link' && linkCard}
    {type === 'video' && videoCard}
    From a0b7dae80fc50670e696936fc50feaa0a661c3d0 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 12 Nov 2025 12:16:48 +0600 Subject: [PATCH 267/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B8=D0=BF=D0=B0=20=D0=BA=D1=83=D1=80=D1=81?= =?UTF-8?q?=D0=B0=20(=D0=BF=D0=BB=D0=B0=D1=82=D0=BD=D1=8B=D0=B5,=20=D0=BE?= =?UTF-8?q?=D1=82=D1=80=D0=BA=D1=8B=D1=82=D1=8B=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 2 +- app/(main)/course/page.tsx | 434 ++++++++++++------ app/components/tables/StreamList.tsx | 18 - services/courses.tsx | 33 ++ types/courseTypes/AudenceTypes.tsx | 11 + types/myMainCourseType.tsx | 4 + utils/axiosInstance.tsx | 10 +- 7 files changed, 337 insertions(+), 175 deletions(-) create mode 100644 types/courseTypes/AudenceTypes.tsx diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 781fc08f..32416430 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -530,7 +530,7 @@ export default function LessonStep() { return ( -
    +
    (null); const [formVisible, setFormVisible] = useState(false); + const [audenceTypeVisible, setAudenceTypeVisible] = useState(false); const [forStart, setForStart] = useState(false); const [skeleton, setSkeleton] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); @@ -67,6 +70,8 @@ export default function Course() { const [globalCourseId, setGlobalCourseId] = useState<{ id: number | null; title: string | null } | null>(null); const [pageState, setPageState] = useState(1); const [courseStatus, setCourseStatus] = useState({ name: 'Закрытый', code: 0 }); + const [openTypes, setOpenTypes] = useState([]); + const [isTall, setIsTall] = useState(false); const showError = useErrorMessage(); @@ -85,7 +90,6 @@ export default function Course() { const handleEdit = async (e: { checked: boolean }, item: { status: boolean; id: number }) => { setSkeleton(true); - const { id } = item; const status = e.checked; @@ -109,6 +113,20 @@ export default function Course() { state: true, value: { severity: 'error', summary: 'Ошибка!', detail: data.response.data.cause } }); + } else if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else if (data?.response?.status == '422') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } } else { setMessage({ state: true, @@ -309,6 +327,58 @@ export default function Course() { setActiveIndex(e.index); }; + const handleFetchCourseOpenStatus = async () => { + setAudenceTypeVisible(true); + const data = await fetchCourseOpenStatus(); + if (data && Array.isArray(data)) { + setOpenTypes(data); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка повторите позже', detail: '' } + }); // messege - Ошибка при изменении курса + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + console.log(data); + }; + + const handleAddOpenTypes = async (course_audience_type_id: number, course_id: number) => { + setSkeleton(true); + const data = await addOpenTypes(course_audience_type_id, course_id); + console.log(data); + + if (data && data.success) { + contextFetchCourse(1); + setMessage({ + state: true, + value: { severity: 'success', summary: data.message, detail: '' } + }); + } else { + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + setAudenceTypeVisible(false); + setSelectedCourse(null); + setSkeleton(false); + }; + const itemTemplate = (shablonData: any) => { return (
    @@ -464,152 +534,6 @@ export default function Course() { return (
    - {/* modal window */} - -
    -
    -
    - - {/*
    - -
    - -
    -
    */} -
    -
    -
    - { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - title: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - title: e.target.value - })); - }} - /> - {/*
    - {progressSpinner && } -
    -
    - {/*
    - -
    - { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - video_url: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - video_url: e.target.value - })); - }} - /> - {progressSpinner && } -
    -
    */} - -
    - -
    - { - editMode - ? setEditingLesson((prev) => ({ - ...prev, - description: e.target.value - })) - : setCourseValue((prev) => ({ - ...prev, - description: e.target.value - })); - }} - /> - {progressSpinner && } -
    -
    - -
    -
    - {typeof imageState === 'string' ? : } -
    -
    - - - {courseValue.image || editingLesson.image ? ( -
    - {typeof editingLesson.image === 'string' && ( - <> - {imageTitle} - - )} -
    - ) : ( - jpeg, png, jpg - )} -
    {(editingLesson.image || imageState) &&
    -
    -
    -
    -
    {/* Мобильный курс */} @@ -770,6 +694,24 @@ export default function Course() { )} > +
    Статус
    } + body={(rowData) => ( + <> + + + )} + >
    Балл
    } body={(rowData) => {rowData.max_score}}>
    На рассмотрение
    } @@ -793,8 +735,13 @@ export default function Course() {
    Публикация
    } style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => - rowData.is_published ? : + body={(rowData) => { + // if(rowData?.audience_type?.name === 'lock'){ + return rowData.is_published ? : + // } + // return + } + } >
    + {/* modal window */} + +
    +
    +
    + + {/*
    + +
    + +
    +
    */} +
    +
    +
    + { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + title: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + title: e.target.value + })); + }} + /> + {/*
    + {progressSpinner && } +
    +
    + {/*
    + +
    + { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + video_url: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + video_url: e.target.value + })); + }} + /> + {progressSpinner && } +
    +
    */} + +
    + +
    + { + editMode + ? setEditingLesson((prev) => ({ + ...prev, + description: e.target.value + })) + : setCourseValue((prev) => ({ + ...prev, + description: e.target.value + })); + }} + /> + {progressSpinner && } +
    +
    + +
    +
    + {typeof imageState === 'string' ? : } +
    +
    + + + {courseValue.image || editingLesson.image ? ( +
    + {typeof editingLesson.image === 'string' && ( + <> + {imageTitle} + + )} +
    + ) : ( + jpeg, png, jpg + )} +
    {(editingLesson.image || imageState) &&
    +
    +
    +
    +
    + + {/* open status window */} + { + if (!audenceTypeVisible) return; + setAudenceTypeVisible(false); + }} + > +
    + {skeleton ? ( + + ) : ( +
    + {openTypes?.map((item) => { + return ( +
    { + if (selectedCourse) { + handleAddOpenTypes(item?.id, selectedCourse); + } + }} + > +
    + + {item.title} +
    + {item?.description} +
    + ); + })} +
    + )} +
    +
    ); } diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 39cdbabb..27e9fa02 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -185,24 +185,6 @@ export default function StreamList({

    {item?.subject_name.name_ru}

    - {/* */}
    diff --git a/services/courses.tsx b/services/courses.tsx index 5ded3431..6f37c87d 100644 --- a/services/courses.tsx +++ b/services/courses.tsx @@ -379,4 +379,37 @@ export const veryfyCourse = async (value: {course_id: number, status: number}) = console.log('Ошибка', err); return err; } +}; + +// course open status + +export const fetchCourseOpenStatus = async () => { + try { + const res = await axiosInstance.get(`/open/course/types`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const addOpenTypes = async (course_audience_type_id: number, course_id: number) => { + const formData = new FormData(); + formData.append('course_audience_type_id', String(course_audience_type_id)); + formData.append('course_id', String(course_id)); + + try { + const res = await axiosInstance.post(`/v1/teacher/courses/audience/update`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return res.data; + } catch (err) { + console.log('Ошибка при добавлении типа курса', err); + return err; + } }; \ No newline at end of file diff --git a/types/courseTypes/AudenceTypes.tsx b/types/courseTypes/AudenceTypes.tsx new file mode 100644 index 00000000..c317c252 --- /dev/null +++ b/types/courseTypes/AudenceTypes.tsx @@ -0,0 +1,11 @@ +export interface AudenceType { + created_at: string; + description: string; + icon: string; + id: number; + max_score: number; + min_score: number; + name: string; + title: string; + updated_at: string; +} diff --git a/types/myMainCourseType.tsx b/types/myMainCourseType.tsx index 8f8280a0..7035b38f 100644 --- a/types/myMainCourseType.tsx +++ b/types/myMainCourseType.tsx @@ -1,3 +1,5 @@ +import { AudenceType } from "./courseTypes/AudenceTypes"; + export interface test { title: string; id: number; @@ -16,5 +18,7 @@ export interface myMainCourseType { user_id: number; current_page?: number; + audience_type: AudenceType + // data?: test[]; } diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index 469d45a1..e8801c2d 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -38,11 +38,11 @@ axiosInstance.interceptors.response.use( if (status === 404) { console.warn('404 - Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/pages/notfound'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/pages/notfound'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 0f84d9e3c0ba6e3f900e3838cb2bf6aa948f2e3e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 12 Nov 2025 15:49:50 +0600 Subject: [PATCH 268/286] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 81 ++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 48 deletions(-) diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index e16df369..cf0a7938 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -384,7 +384,6 @@ export default function Course() {
    {/* Номер (rowIndex) можно добавить через внешний счетчик или props, но для DataView это сложнее */} - {/* Заголовок */}
    @@ -408,13 +407,24 @@ export default function Course() {
    )}
    -
    {imageBodyTemplate(shablonData)}
    - -
    +
    - Публикация: - {shablonData.is_published ? : } + Статус: + +
    +
    + Балл: + {`${shablonData?.max_score}`}
    На рассмотрение: @@ -430,8 +440,11 @@ export default function Course() {
    +
    + Публикация: + {shablonData.is_published ? : } +
    - <> - {/* Кнопки действий */} {!tableMedia && (
    @@ -698,18 +710,16 @@ export default function Course() { style={{ width: '70px' }} header={() =>
    Статус
    } body={(rowData) => ( - <> - - + )} >
    Балл
    } body={(rowData) => {rowData.max_score}}>
    @@ -737,12 +747,10 @@ export default function Course() { style={{ margin: '0 3px', textAlign: 'center' }} body={(rowData) => { // if(rowData?.audience_type?.name === 'lock'){ - return rowData.is_published ? : + return rowData.is_published ? : ; // } // return - } - - } + }} >
    Потоки
    } @@ -812,13 +820,6 @@ export default function Course() {
    - {/*
    - -
    - -
    -
    */}
    @@ -839,22 +840,6 @@ export default function Course() { })); }} /> - {/*
    {progressSpinner && }
    @@ -947,7 +932,7 @@ export default function Course() { {/* open status window */} { From 389b5537223b527ef4a1635a8fd0600c7769ab31 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Thu, 13 Nov 2025 17:48:45 +0600 Subject: [PATCH 269/286] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=B4=D0=BE=D1=82?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D1=83=20=D0=B4=D0=B8=D0=B7=D0=B5=D0=B9=D0=B1=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE=D0=B2,=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D1=82=D1=8B=D1=85=20=D1=83=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(full-page)/auth/login/page.tsx | 6 +- app/(main)/course/page.tsx | 2 +- app/(main)/openCourse/page.tsx | 231 ++++++++++++++++++++ app/components/cards/OpenCourseCard.tsx | 85 +++++++ app/components/cards/OpenCourseShowCard.tsx | 52 +++++ app/components/lessons/LessonDocument.tsx | 10 +- app/components/lessons/LessonForum.tsx | 10 +- app/components/lessons/LessonLink.tsx | 10 +- app/components/lessons/LessonPractica.tsx | 10 +- app/components/lessons/LessonTest.tsx | 2 + app/components/lessons/LessonVideo.tsx | 11 +- app/globals.css | 1 + app/layout.tsx | 1 + layout/AppMenu.tsx | 100 +++++---- services/openCourse.tsx | 25 +++ services/query-tests.http | 6 +- styles/layout/layout.scss | 3 +- styles/layout/openCourse.css | 13 ++ types/myMainCourseType.tsx | 3 +- 19 files changed, 490 insertions(+), 91 deletions(-) create mode 100644 app/(main)/openCourse/page.tsx create mode 100644 app/components/cards/OpenCourseCard.tsx create mode 100644 app/components/cards/OpenCourseShowCard.tsx create mode 100644 services/openCourse.tsx create mode 100644 styles/layout/openCourse.css diff --git a/app/(full-page)/auth/login/page.tsx b/app/(full-page)/auth/login/page.tsx index 5284d2dc..4a205be5 100644 --- a/app/(full-page)/auth/login/page.tsx +++ b/app/(full-page)/auth/login/page.tsx @@ -40,7 +40,6 @@ const LoginPage = () => { const onSubmit = async (value: LoginType) => { const user = await login(value); - console.log(user); if (user && user.success) { document.cookie = `access_token=${user.token.access_token}; path=/; Secure; SameSite=Strict; expires=${user.token.expires_at}`; @@ -84,7 +83,8 @@ const LoginPage = () => { console.log('Ошибка при получении пользователя'); } } - } else { + } + else { setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка при авторизации', detail: 'Повторите позже' } @@ -128,7 +128,7 @@ const LoginPage = () => {

    Вход в mooc

    - +
    {/*
    - {docShow ? ( - - ) : skeleton ? ( + {skeleton ? (
    From 41f8aefae0dcb8eafbd92e40116b0d6efd499586 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Fri, 14 Nov 2025 11:40:16 +0600 Subject: [PATCH 271/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B4=D1=84=20=D0=B1=D0=B8?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8.=20=D0=A3?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1=20=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B4?= =?UTF-8?q?=D1=84=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 3 +- app/(main)/pdf/[pdfUrl]/page.tsx | 14 +- .../[subject_id]/[stream_id]/[id]/page.tsx | 53 +- app/components/PDFBook.tsx | 603 +- app/components/pdfComponents/PDFworker.tsx | 43 + package-lock.json | 439 +- package.json | 4 +- public/pdf.worker.js | 22 + public/pdf.worker.min.js | 22 + public/pdf.worker.mjs | 58148 ---------------- 10 files changed, 695 insertions(+), 58656 deletions(-) create mode 100644 app/components/pdfComponents/PDFworker.tsx create mode 100644 public/pdf.worker.js create mode 100644 public/pdf.worker.min.js delete mode 100644 public/pdf.worker.mjs diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index f609fab3..bedb20d8 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -29,10 +29,9 @@ import useShortText from '@/hooks/useShortText'; import { ProgressSpinner } from 'primereact/progressspinner'; import { DataView } from 'primereact/dataview'; import { FileWithPreview } from '@/types/fileuploadPreview'; -import { Dropdown } from 'primereact/dropdown'; -import { Tooltip } from 'primereact/tooltip'; import { Dialog } from 'primereact/dialog'; import { AudenceType } from '@/types/courseTypes/AudenceTypes'; +import PDFViewer from '@/app/components/PDFBook'; export default function Course() { const { setMessage, setGlobalLoading, course, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index b1987a60..5187f7aa 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -8,23 +8,27 @@ const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { ssr: false }); +const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { + ssr: false +}); + import { useParams, useRouter } from 'next/navigation'; export default function PdfUrlViewer() { - const { pdfUrl } = useParams(); const router = useRouter(); - + return ( -
    -
    +
    +
    - + {/* */} +
    ); diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index 20c8f130..b179ba5c 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -14,6 +14,7 @@ import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useState } from 'react'; +import dynamic from 'next/dynamic'; export default function LessonTest() { // types @@ -23,6 +24,10 @@ export default function LessonTest() { streams: number[]; } + const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { + ssr: false + }); + const { lesson_id, subject_id, stream_id, id } = useParams(); const params = new URLSearchParams(); @@ -339,30 +344,36 @@ export default function LessonTest() { } }, [test]); - const hasPdf = /pdf/i.test(document?.content?.document || ''); // true - const docSection = ( -
    -
    - {steps?.type?.title} - -
    -
    - {document?.content?.title} - {document?.content?.description &&
    {document?.content?.description &&
    {document?.content?.description}
    }
    } +
    +
    +
    + {steps?.type?.title} + +
    +
    + {document?.content?.title} + {document?.content?.description &&
    {document?.content?.description &&
    {document?.content?.description}
    }
    } +
    +
    + {/* +
    -
    - -
    ); diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index 64ad947f..cce96306 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -1,331 +1,334 @@ 'use client'; -import React, { useContext, useEffect, useRef, useState } from 'react'; -import HTMLFlipBook from 'react-pageflip'; // Импортируем flipbook -import GroupSkeleton from './skeleton/GroupSkeleton'; +// import React, { useContext, useEffect, useRef, useState } from 'react'; +// import HTMLFlipBook from 'react-pageflip'; // Импортируем flipbook +// import GroupSkeleton from './skeleton/GroupSkeleton'; -// import * as pdfjsLib from "pdfjs-dist"; -// pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`; +// // import * as pdfjsLib from "pdfjs-dist"; +// // pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`; -import * as pdfjsLib from 'pdfjs-dist'; -import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { LayoutContext } from '@/layout/context/layoutcontext'; -import { NotFound } from './NotFound'; +// import * as pdfjsLib from 'pdfjs-dist'; +// import { useMediaQuery } from '@/hooks/useMediaQuery'; +// import { LayoutContext } from '@/layout/context/layoutcontext'; +// import { NotFound } from './NotFound'; -// Указываем путь к файлу mjs -pdfjsLib.GlobalWorkerOptions.workerSrc = `/pdf.worker.mjs`; +// // Указываем путь к файлу mjs +// pdfjsLib.GlobalWorkerOptions.workerSrc = `/pdf.worker.mjs`; export default function PDFViewer({ url }: { url: string }) { - const { setMessage } = useContext(LayoutContext); + // const { setMessage } = useContext(LayoutContext); - const [pages, setPages] = useState([]); - const [skeleton, setSkeleton] = useState(false); - const [hasPdf, setHasPdf] = useState(false); + // const [pages, setPages] = useState([]); + // const [skeleton, setSkeleton] = useState(false); + // const [hasPdf, setHasPdf] = useState(false); - const containerRef = useRef(null); - const bookRef = useRef(null); - const [bookSize, setBookSize] = useState({ width: 0, height: 0, aspectRatio: 0 }); + // const containerRef = useRef(null); + // const bookRef = useRef(null); + // const [bookSize, setBookSize] = useState({ width: 0, height: 0, aspectRatio: 0 }); - const FIXED_BOOK_HEIGHT = 800; // Фиксированная высота книги - const media = useMediaQuery('(max-width: 640px)'); - const [totalPages, setTotalPages] = useState(0); - const [currentPage, setCurrentPage] = useState(1); + // const FIXED_BOOK_HEIGHT = 800; // Фиксированная высота книги + // const media = useMediaQuery('(max-width: 640px)'); + // const [totalPages, setTotalPages] = useState(0); + // const [currentPage, setCurrentPage] = useState(1); - useEffect(() => { - const renderPDF = async () => { - if (!url) return; + // useEffect(() => { + // const renderPDF = async () => { + // if (!url) return; - setSkeleton(true); - try { - // Проверяем, одна ли страница в документе - // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; - const inApiString = process.env.NEXT_PUBLIC_BASE_URL; - let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; + // setSkeleton(true); + // try { + // // Проверяем, одна ли страница в документе + // // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; + // const inApiString = process.env.NEXT_PUBLIC_BASE_URL; + // let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; - const pdf = await pdfjsLib.getDocument(newUrl).promise; - setTotalPages(pdf.numPages); - const tempPages = []; - const firstPage = await pdf.getPage(1); + // const pdf = await pdfjsLib.getDocument(newUrl).promise; + // setTotalPages(pdf.numPages); + // const tempPages = []; + // const firstPage = await pdf.getPage(1); - // Получаем оригинальное соотношение сторон первой страницы - const viewport = firstPage.getViewport({ scale: 1.5 }); - const aspectRatio = viewport.width / viewport.height; + // // Получаем оригинальное соотношение сторон первой страницы + // const viewport = firstPage.getViewport({ scale: 1.5 }); + // const aspectRatio = viewport.width / viewport.height; - for (let i = 1; i <= pdf.numPages; i++) { - const page = await pdf.getPage(i); - const desiredScale = FIXED_BOOK_HEIGHT / page.getViewport({ scale: 1.0 }).height; - const viewport = page.getViewport({ scale: desiredScale }); + // for (let i = 1; i <= pdf.numPages; i++) { + // const page = await pdf.getPage(i); + // const desiredScale = FIXED_BOOK_HEIGHT / page.getViewport({ scale: 1.0 }).height; + // const viewport = page.getViewport({ scale: desiredScale }); - // Создаем элемент - const canvas = document.createElement('canvas'); - const context = canvas.getContext('2d'); + // // Создаем элемент + // const canvas = document.createElement('canvas'); + // const context = canvas.getContext('2d'); - if (!context) { - // в последний раз добавил эту строку если что - setHasPdf(true); - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } - }); - throw new Error('Canvas context is not supported.'); - } + // if (!context) { + // // в последний раз добавил эту строку если что + // setHasPdf(true); + // setMessage({ + // state: true, + // value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } + // }); + // throw new Error('Canvas context is not supported.'); + // } - canvas.height = viewport.height; - canvas.width = viewport.width; + // canvas.height = viewport.height; + // canvas.width = viewport.width; - await page.render({ - canvas, // в последний раз добавил эту строку если что - canvasContext: context, - viewport - }).promise; + // await page.render({ + // canvas, // в последний раз добавил эту строку если что + // canvasContext: context, + // viewport + // }).promise; - // Превращаем canvas в изображение (Data URL) и добавляем в массив - const imageDataUrl = canvas.toDataURL(); - tempPages.push( -
    - {`Page -
    - ); - } + // // Превращаем canvas в изображение (Data URL) и добавляем в массив + // const imageDataUrl = canvas.toDataURL(); + // tempPages.push( + //
    + // {`Page + //
    + // ); + // } - // Обновляем состояние с данными только после успешной загрузки - setPages(tempPages); - if (containerRef.current) { - // в последний раз добавил эту проверку если что - setBookSize({ - width: containerRef.current.offsetWidth, - height: FIXED_BOOK_HEIGHT, - aspectRatio: aspectRatio - }); - setHasPdf(false); - } - setSkeleton(false); - } catch (error) { - console.error('Ошибка при загрузке или рендеринге PDF:', error); - setHasPdf(true); - setSkeleton(false); - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } - }); - } finally { - setSkeleton(false); - } - }; + // // Обновляем состояние с данными только после успешной загрузки + // setPages(tempPages); + // if (containerRef.current) { + // // в последний раз добавил эту проверку если что + // setBookSize({ + // width: containerRef.current.offsetWidth, + // height: FIXED_BOOK_HEIGHT, + // aspectRatio: aspectRatio + // }); + // setHasPdf(false); + // } + // setSkeleton(false); + // } catch (error) { + // console.error('Ошибка при загрузке или рендеринге PDF:', error); + // setHasPdf(true); + // setSkeleton(false); + // setMessage({ + // state: true, + // value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } + // }); + // } finally { + // setSkeleton(false); + // } + // }; - renderPDF(); - }, [url]); + // renderPDF(); + // }, [url]); - useEffect(() => { - const updateBookSize = () => { - if (containerRef.current) { - const containerWidth = containerRef.current.offsetWidth; - const width = Math.min(containerWidth, 1000); - const height = width / (bookSize.aspectRatio || 1.5); // пример пропорции, или FIXED_BOOK_HEIGHT - setBookSize({ width, height, aspectRatio: width / height }); - } - }; - updateBookSize(); - window.addEventListener('resize', updateBookSize); - return () => window.removeEventListener('resize', updateBookSize); - }, [bookSize.aspectRatio]); + // useEffect(() => { + // const updateBookSize = () => { + // if (containerRef.current) { + // const containerWidth = containerRef.current.offsetWidth; + // const width = Math.min(containerWidth, 1000); + // const height = width / (bookSize.aspectRatio || 1.5); // пример пропорции, или FIXED_BOOK_HEIGHT + // setBookSize({ width, height, aspectRatio: width / height }); + // } + // }; + // updateBookSize(); + // window.addEventListener('resize', updateBookSize); + // return () => window.removeEventListener('resize', updateBookSize); + // }, [bookSize.aspectRatio]); - useEffect(() => { - const container = containerRef.current; - if (!container) return; + // useEffect(() => { + // const container = containerRef.current; + // if (!container) return; - const onScroll = () => { - const pageElements = container.querySelectorAll('.page'); - let visiblePage = 1; + // const onScroll = () => { + // const pageElements = container.querySelectorAll('.page'); + // let visiblePage = 1; - pageElements.forEach((page, index) => { - const rect = page.getBoundingClientRect(); - if (rect.top >= 0 && rect.top < window.innerHeight / 2) { - visiblePage = index + 1; // страницы начинаются с 1 - } - }); - }; + // pageElements.forEach((page, index) => { + // const rect = page.getBoundingClientRect(); + // if (rect.top >= 0 && rect.top < window.innerHeight / 2) { + // visiblePage = index + 1; // страницы начинаются с 1 + // } + // }); + // }; - container.addEventListener('scroll', onScroll); - return () => container.removeEventListener('scroll', onScroll); - }, [pages]); + // container.addEventListener('scroll', onScroll); + // return () => container.removeEventListener('scroll', onScroll); + // }, [pages]); return ( -
    -
    - {hasPdf ? ( - - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : media ? ( - <> -
    - - Страница {currentPage} / {totalPages} - -
    - {}} - onFlip={() => { - if (bookRef.current) { - const current = bookRef.current.pageFlip().getCurrentPageIndex(); - setCurrentPage(current + 1); - } - }} - onChangeOrientation={() => {}} - onChangeState={() => {}} - onInit={() => {}} - onUpdate={() => {}} - startPage={0} - drawShadow={true} - flippingTime={900} - showPageCorners={true} - disableFlipByClick={false} - > - {pages.map((page, index) => ( -
    -
    - {' '} - {/* Добавляем класс для содержимого страницы */} - {page} -
    -
    - ))} -
    - - ) : ( - <> -
    - - Страница {currentPage} / {totalPages} - -
    - {}} - onFlip={() => { - if (bookRef.current) { - const current = bookRef.current.pageFlip().getCurrentPageIndex(); - setCurrentPage(current + 1); - } - }} - onChangeOrientation={() => {}} - onChangeState={() => {}} - onInit={() => {}} - onUpdate={() => {}} - startPage={0} - drawShadow={true} - flippingTime={900} - showPageCorners={true} - disableFlipByClick={false} - > - {pages.map((page, index) => ( -
    -
    - {' '} - {/* Добавляем класс для содержимого страницы */} - {page} -
    -
    - ))} -
    - - )} - - )} -
    +
    +
    + //
    + //
    + // {hasPdf ? ( + // + // ) : ( + // <> + // {skeleton ? ( + //
    + // + //
    + // ) : media ? ( + // <> + //
    + // + // Страница {currentPage} / {totalPages} + // + //
    + // {}} + // onFlip={() => { + // if (bookRef.current) { + // const current = bookRef.current.pageFlip().getCurrentPageIndex(); + // setCurrentPage(current + 1); + // } + // }} + // onChangeOrientation={() => {}} + // onChangeState={() => {}} + // onInit={() => {}} + // onUpdate={() => {}} + // startPage={0} + // drawShadow={true} + // flippingTime={900} + // showPageCorners={true} + // disableFlipByClick={false} + // > + // {pages.map((page, index) => ( + //
    + //
    + // {' '} + // {/* Добавляем класс для содержимого страницы */} + // {page} + //
    + //
    + // ))} + //
    + // + // ) : ( + // <> + //
    + // + // Страница {currentPage} / {totalPages} + // + //
    + // {}} + // onFlip={() => { + // if (bookRef.current) { + // const current = bookRef.current.pageFlip().getCurrentPageIndex(); + // setCurrentPage(current + 1); + // } + // }} + // onChangeOrientation={() => {}} + // onChangeState={() => {}} + // onInit={() => {}} + // onUpdate={() => {}} + // startPage={0} + // drawShadow={true} + // flippingTime={900} + // showPageCorners={true} + // disableFlipByClick={false} + // > + // {pages.map((page, index) => ( + //
    + //
    + // {' '} + // {/* Добавляем класс для содержимого страницы */} + // {page} + //
    + //
    + // ))} + //
    + // + // )} + // + // )} + //
    + //
    ); -} +} \ No newline at end of file diff --git a/app/components/pdfComponents/PDFworker.tsx b/app/components/pdfComponents/PDFworker.tsx new file mode 100644 index 00000000..e3e23860 --- /dev/null +++ b/app/components/pdfComponents/PDFworker.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { Viewer, Worker } from '@react-pdf-viewer/core'; +import { defaultLayoutPlugin } from '@react-pdf-viewer/default-layout'; +import '@react-pdf-viewer/core/lib/styles/index.css'; +import '@react-pdf-viewer/default-layout/lib/styles/index.css'; +import { useContext, useEffect, useState } from 'react'; +import { LayoutContext } from '@/layout/context/layoutcontext'; + +export default function PDFreader({ url }: { url: string }) { + const defaultLayoutPluginInstance = defaultLayoutPlugin(); + + const { setMessage } = useContext(LayoutContext); + const [forUrl, setForUrl] = useState(''); + + useEffect(() => { + // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; + const inApiString = process.env.NEXT_PUBLIC_BASE_URL; + let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; + console.log(newUrl); + + if (newUrl) { + setForUrl(newUrl); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } + }); + } + }, [url]); + + const loadSection = (error: any | null) =>
    Не удалось загрузить PDF: {error?.message || ''}
    + + if(!forUrl) return loadSection(null); + + return ( +
    + + loadSection(error)} /> + +
    + ); +} diff --git a/package-lock.json b/package-lock.json index 16f1467d..ca4e0335 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", "@hookform/resolvers": "^5.1.1", + "@react-pdf-viewer/core": "^3.12.0", + "@react-pdf-viewer/default-layout": "^3.12.0", "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", @@ -22,7 +24,7 @@ "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", "next": "13.4.8", - "pdfjs-dist": "^5.4.54", + "pdfjs-dist": "^2.16.105", "primeflex": "^4.0.0", "primeicons": "^7.0.0", "primereact": "^10.9.6", @@ -608,177 +610,6 @@ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, - "node_modules/@napi-rs/canvas": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.77.tgz", - "integrity": "sha512-N9w2DkEKE1AXGp3q55GBOP6BEoFrqChDiFqJtKViTpQCWNOSVuMz7LkoGehbnpxtidppbsC36P0kCZNqJKs29w==", - "optional": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.77", - "@napi-rs/canvas-darwin-arm64": "0.1.77", - "@napi-rs/canvas-darwin-x64": "0.1.77", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.77", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.77", - "@napi-rs/canvas-linux-arm64-musl": "0.1.77", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.77", - "@napi-rs/canvas-linux-x64-gnu": "0.1.77", - "@napi-rs/canvas-linux-x64-musl": "0.1.77", - "@napi-rs/canvas-win32-x64-msvc": "0.1.77" - } - }, - "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz", - "integrity": "sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz", - "integrity": "sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz", - "integrity": "sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz", - "integrity": "sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz", - "integrity": "sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz", - "integrity": "sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz", - "integrity": "sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz", - "integrity": "sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz", - "integrity": "sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz", - "integrity": "sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/env": { "version": "13.4.8", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8.tgz", @@ -963,6 +794,236 @@ "node": ">= 8" } }, + "node_modules/@react-pdf-viewer/attachment": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/attachment/-/attachment-3.12.0.tgz", + "integrity": "sha512-mhwrYJSIpCvHdERpLUotqhMgSjhtF+BTY1Yb9Fnzpcq3gLZP+Twp5Rynq21tCrVdDizPaVY7SKu400GkgdMfZw==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/bookmark": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/bookmark/-/bookmark-3.12.0.tgz", + "integrity": "sha512-i7nEit8vIFMAES8RFGwprZ9cXOOZb9ZStPW6E6yuObJEXcvBj/ctsbBJGZxqUZOGklM0JoB7sjHyxAriHfe92A==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/core": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/core/-/core-3.12.0.tgz", + "integrity": "sha512-8MsdlQJ4jaw3GT+zpCHS33nwnvzpY0ED6DEahZg9WngG++A5RMhk8LSlxdHelwaFFHFiXBjmOaj2Kpxh50VQRg==", + "peerDependencies": { + "pdfjs-dist": "^2.16.105 || ^3.0.279", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/default-layout": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/default-layout/-/default-layout-3.12.0.tgz", + "integrity": "sha512-K2fS4+TJynHxxCBFuIDiFuAw3nqOh4bkBgtVZ/2pGvnFn9lLg46YGLMnTXCQqtyZzzXYh696jmlFViun3is4pA==", + "dependencies": { + "@react-pdf-viewer/attachment": "3.12.0", + "@react-pdf-viewer/bookmark": "3.12.0", + "@react-pdf-viewer/core": "3.12.0", + "@react-pdf-viewer/thumbnail": "3.12.0", + "@react-pdf-viewer/toolbar": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/full-screen": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/full-screen/-/full-screen-3.12.0.tgz", + "integrity": "sha512-hQouJ26QUaRBCXNMU1aI1zpJn4l4PJRvlHhuE2dZYtLl37ycjl7vBCQYZW1FwnuxMWztZsY47R43DKaZORg0pg==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/get-file": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/get-file/-/get-file-3.12.0.tgz", + "integrity": "sha512-Uhq45n2RWlZ7Ec/BtBJ0WQESRciaYIltveDXHNdWvXgFdOS8XsvB+mnTh/wzm7Cfl9hpPyzfeezifdU9AkQgQg==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/open": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/open/-/open-3.12.0.tgz", + "integrity": "sha512-vhiDEYsiQLxvZkIKT9VPYHZ1BOnv46x9eCEmRWxO1DJ8fa/GRDTA9ivXmq/ap0dGEJs6t+epleCkCEfllLR/Yw==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/page-navigation": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/page-navigation/-/page-navigation-3.12.0.tgz", + "integrity": "sha512-tVEJ48Dd5kajV1nKkrPWijglJRNBiKBTyYDKVexhiRdTHUP1f6QQXiSyDgCUb0IGSZeJzOJb1h7ApKHe8OTtuw==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/print": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/print/-/print-3.12.0.tgz", + "integrity": "sha512-xJn76CgbU/M2iNaN7wLHTg+sdOekkRMfCakFLwPrE+SR7qD6NUF4vQQKJBSVCCK5bUijzb6cWfKGfo8VA72o4Q==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/properties": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/properties/-/properties-3.12.0.tgz", + "integrity": "sha512-dYTCHtVwFNkpDo7QxL2qk/8zAKndLwdD1FFxBftl6jIlQbtvNdxkFfkv1HcQING9Ic+7DBryOiD7W0ze4IERYg==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/rotate": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/rotate/-/rotate-3.12.0.tgz", + "integrity": "sha512-yaxaMYPChvNOjR8+AxRmj0kvojyJKPq4XHEcIB2lJJgBY1Zra3mliDUP3Nlb4yV8BS9+yBqWn9U9mtnopQD+tw==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/scroll-mode": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/scroll-mode/-/scroll-mode-3.12.0.tgz", + "integrity": "sha512-okII7Xqhl6cMvl1izdEvlXNJ+vJVq/qdg53hJIDYVgBCWskLk/cpjUg/ZonBxseG9lIDP3w2VO1McT8Gn11OAg==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/search": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/search/-/search-3.12.0.tgz", + "integrity": "sha512-jAkLpis49fsDDY/HrbUZIOIhzF5vynONQNA4INQKI38r/MjveblrkNv7qbr9j5lQ/WFic5+gD1e+Mtpf1/7DiA==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/selection-mode": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/selection-mode/-/selection-mode-3.12.0.tgz", + "integrity": "sha512-yysWEu2aCtBvzSgbhgI9kT5cq2hf0FU6Z+3B7MMXz14Kxyc3y18wUqxtgbvpFEfWF0bNUUq16JtWRljtxvZ83w==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/theme": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/theme/-/theme-3.12.0.tgz", + "integrity": "sha512-cdBi+wR1VOZ6URCcO9plmAZQu4ZGFcd7HJdBe7VIFiGyrvl9I/Of74ONLycnDImSuONt8D3uNjPBLieeaShVeg==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/thumbnail": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/thumbnail/-/thumbnail-3.12.0.tgz", + "integrity": "sha512-Vc8j3bO6wumWZV4o6pAbktPWKDSC9tQAzOCJ3cof541u4i44C11ccYC4W9aNcsMMUSO3bNwAGWtP8OFthV5akQ==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/toolbar": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/toolbar/-/toolbar-3.12.0.tgz", + "integrity": "sha512-qACTU3qXHgtNK8J+T13EWio+0liilj86SJ87BdapqXynhl720OKPlSKOQqskUGqg3oTUJAhrse9XG6SFdHJx+g==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0", + "@react-pdf-viewer/full-screen": "3.12.0", + "@react-pdf-viewer/get-file": "3.12.0", + "@react-pdf-viewer/open": "3.12.0", + "@react-pdf-viewer/page-navigation": "3.12.0", + "@react-pdf-viewer/print": "3.12.0", + "@react-pdf-viewer/properties": "3.12.0", + "@react-pdf-viewer/rotate": "3.12.0", + "@react-pdf-viewer/scroll-mode": "3.12.0", + "@react-pdf-viewer/search": "3.12.0", + "@react-pdf-viewer/selection-mode": "3.12.0", + "@react-pdf-viewer/theme": "3.12.0", + "@react-pdf-viewer/zoom": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@react-pdf-viewer/zoom": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-pdf-viewer/zoom/-/zoom-3.12.0.tgz", + "integrity": "sha512-V0GUTyPM77+LzhoKX+T3XI10/HfGdqRTbgeP7ID60FCzcwu6kXWqJn5tzabjDKLTlFv8mJmn0aa/ppkIU97nfA==", + "dependencies": { + "@react-pdf-viewer/core": "3.12.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz", @@ -2201,6 +2262,12 @@ "csstype": "^3.0.2" } }, + "node_modules/dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==", + "deprecated": "dommatrix is no longer maintained. Please use @thednp/dommatrix." + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4637,14 +4704,20 @@ } }, "node_modules/pdfjs-dist": { - "version": "5.4.54", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.54.tgz", - "integrity": "sha512-TBAiTfQw89gU/Z4LW98Vahzd2/LoCFprVGvGbTgFt+QCB1F+woyOPmNNVgLa6djX9Z9GGTnj7qE1UzpOVJiINw==", - "engines": { - "node": ">=20.16.0 || >=22.3.0" + "version": "2.16.105", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "dependencies": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" }, - "optionalDependencies": { - "@napi-rs/canvas": "^0.1.74" + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } } }, "node_modules/picocolors": { @@ -5673,6 +5746,14 @@ "node": ">=10.13.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index dac63798..a735758c 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", "@hookform/resolvers": "^5.1.1", + "@react-pdf-viewer/core": "^3.12.0", + "@react-pdf-viewer/default-layout": "^3.12.0", "@types/node": "20.3.1", "@types/react": "18.2.12", "@types/react-dom": "18.2.5", @@ -25,7 +27,7 @@ "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", "next": "13.4.8", - "pdfjs-dist": "^5.4.54", + "pdfjs-dist": "^2.16.105", "primeflex": "^4.0.0", "primeicons": "^7.0.0", "primereact": "^10.9.6", diff --git a/public/pdf.worker.js b/public/pdf.worker.js new file mode 100644 index 00000000..34588aa1 --- /dev/null +++ b/public/pdf.worker.js @@ -0,0 +1,22 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ +!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pdfjs-dist/build/pdf.worker",[],t):"object"==typeof exports?exports["pdfjs-dist/build/pdf.worker"]=t():e["pdfjs-dist/build/pdf.worker"]=e.pdfjsWorker=t()}(globalThis,(()=>(()=>{"use strict";var e=[,(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.WorkerTask=t.WorkerMessageHandler=void 0;var r=a(2),n=a(5),i=a(6),s=a(8),o=a(71),c=a(65),l=a(4),h=a(102),u=a(103);class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=(0,r.createPromiseCapability)()}get finished(){return this._capability.promise}finish(){this._capability.resolve()}terminate(){this.terminated=!0}ensureNotTerminated(){if(this.terminated)throw new Error("Worker task was terminated")}}t.WorkerTask=WorkerTask;class WorkerMessageHandler{static setup(e,t){let a=!1;e.on("test",(function wphSetupTest(t){if(!a){a=!0;e.send("test",t instanceof Uint8Array)}}));e.on("configure",(function wphConfigure(e){(0,r.setVerbosityLevel)(e.verbosity)}));e.on("GetDocRequest",(function wphSetupDoc(e){return WorkerMessageHandler.createDocumentHandler(e,t)}))}static createDocumentHandler(e,t){let a,d=!1,f=null;const g=[],p=(0,r.getVerbosityLevel)(),m=e.apiVersion,b="2.16.105";if(m!==b)throw new Error(`The API version "${m}" does not match the Worker version "2.16.105".`);const y=[];for(const e in[])y.push(e);if(y.length)throw new Error("The `Array.prototype` contains unexpected enumerable properties: "+y.join(", ")+"; thus breaking e.g. `for...in` iteration of `Array`s.");if("undefined"==typeof ReadableStream){const e="The browser/environment lacks native support for critical functionality used by the PDF.js library (e.g. `ReadableStream`); ";if(l.isNodeJS)throw new Error(e+"please use a `legacy`-build instead.");throw new Error(e+"please update to a supported browser.")}const w=e.docId,S=e.docBaseUrl,x=e.docId+"_worker";let k=new h.MessageHandler(x,w,t);function ensureNotTerminated(){if(d)throw new Error("Worker was terminated")}function startWorkerTask(e){g.push(e)}function finishWorkerTask(e){e.finish();const t=g.indexOf(e);g.splice(t,1)}async function loadDocument(e){await a.ensureDoc("checkHeader");await a.ensureDoc("parseStartXRef");await a.ensureDoc("parse",[e]);await a.ensureDoc("checkFirstPage",[e]);await a.ensureDoc("checkLastPage",[e]);const t=await a.ensureDoc("isPureXfa");if(t){const e=new WorkerTask("loadXfaFonts");startWorkerTask(e);await Promise.all([a.loadXfaFonts(k,e).catch((e=>{})).then((()=>finishWorkerTask(e))),a.loadXfaImages()])}const[r,n]=await Promise.all([a.ensureDoc("numPages"),a.ensureDoc("fingerprints")]);return{numPages:r,fingerprints:n,htmlForXfa:t?await a.ensureDoc("htmlForXfa"):null}}function getPdfManager(e,t,a){const n=(0,r.createPromiseCapability)();let i;const o=e.source;if(o.data){try{i=new s.LocalPdfManager(w,o.data,o.password,k,t,a,S);n.resolve(i)}catch(e){n.reject(e)}return n.promise}let c,l=[];try{c=new u.PDFWorkerStream(k)}catch(e){n.reject(e);return n.promise}const h=c.getFullReader();h.headersReady.then((function(){if(!h.isRangeSupported)return;const e=o.disableAutoFetch||h.isStreamingSupported;i=new s.NetworkPdfManager(w,c,{msgHandler:k,password:o.password,length:h.contentLength,disableAutoFetch:e,rangeChunkSize:o.rangeChunkSize},t,a,S);for(const e of l)i.sendProgressiveData(e);l=[];n.resolve(i);f=null})).catch((function(e){n.reject(e);f=null}));let d=0;new Promise((function(e,c){const readChunk=function({value:e,done:u}){try{ensureNotTerminated();if(u){i||function(){const e=(0,r.arraysToBytes)(l);o.length&&e.length!==o.length&&(0,r.warn)("reported HTTP length is different from actual");try{i=new s.LocalPdfManager(w,e,o.password,k,t,a,S);n.resolve(i)}catch(e){n.reject(e)}l=[]}();f=null;return}d+=(0,r.arrayByteLength)(e);h.isStreamingSupported||k.send("DocProgress",{loaded:d,total:Math.max(d,h.contentLength||0)});i?i.sendProgressiveData(e):l.push(e);h.read().then(readChunk,c)}catch(e){c(e)}};h.read().then(readChunk,c)})).catch((function(e){n.reject(e);f=null}));f=function(e){c.cancelAllRequests(e)};return n.promise}k.on("GetPage",(function wphSetupGetPage(e){return a.getPage(e.pageIndex).then((function(e){return Promise.all([a.ensure(e,"rotate"),a.ensure(e,"ref"),a.ensure(e,"userUnit"),a.ensure(e,"view")]).then((function([e,t,a,r]){return{rotate:e,ref:t,userUnit:a,view:r}}))}))}));k.on("GetPageIndex",(function wphSetupGetPageIndex(e){const t=n.Ref.get(e.num,e.gen);return a.ensureCatalog("getPageIndex",[t])}));k.on("GetDestinations",(function wphSetupGetDestinations(e){return a.ensureCatalog("destinations")}));k.on("GetDestination",(function wphSetupGetDestination(e){return a.ensureCatalog("getDestination",[e.id])}));k.on("GetPageLabels",(function wphSetupGetPageLabels(e){return a.ensureCatalog("pageLabels")}));k.on("GetPageLayout",(function wphSetupGetPageLayout(e){return a.ensureCatalog("pageLayout")}));k.on("GetPageMode",(function wphSetupGetPageMode(e){return a.ensureCatalog("pageMode")}));k.on("GetViewerPreferences",(function(e){return a.ensureCatalog("viewerPreferences")}));k.on("GetOpenAction",(function(e){return a.ensureCatalog("openAction")}));k.on("GetAttachments",(function wphSetupGetAttachments(e){return a.ensureCatalog("attachments")}));k.on("GetJavaScript",(function wphSetupGetJavaScript(e){return a.ensureCatalog("javaScript")}));k.on("GetDocJSActions",(function wphSetupGetDocJSActions(e){return a.ensureCatalog("jsActions")}));k.on("GetPageJSActions",(function({pageIndex:e}){return a.getPage(e).then((function(e){return a.ensure(e,"jsActions")}))}));k.on("GetOutline",(function wphSetupGetOutline(e){return a.ensureCatalog("documentOutline")}));k.on("GetOptionalContentConfig",(function(e){return a.ensureCatalog("optionalContentConfig")}));k.on("GetPermissions",(function(e){return a.ensureCatalog("permissions")}));k.on("GetMetadata",(function wphSetupGetMetadata(e){return Promise.all([a.ensureDoc("documentInfo"),a.ensureCatalog("metadata")])}));k.on("GetMarkInfo",(function wphSetupGetMarkInfo(e){return a.ensureCatalog("markInfo")}));k.on("GetData",(function wphSetupGetData(e){a.requestLoadedStream();return a.onLoadedStream().then((function(e){return e.bytes}))}));k.on("GetAnnotations",(function({pageIndex:e,intent:t}){return a.getPage(e).then((function(a){const r=new WorkerTask(`GetAnnotations: page ${e}`);startWorkerTask(r);return a.getAnnotationsData(k,r,t).then((e=>{finishWorkerTask(r);return e}),(e=>{finishWorkerTask(r)}))}))}));k.on("GetFieldObjects",(function(e){return a.ensureDoc("fieldObjects")}));k.on("HasJSActions",(function(e){return a.ensureDoc("hasJSActions")}));k.on("GetCalculationOrderIds",(function(e){return a.ensureDoc("calculationOrderIds")}));k.on("SaveDocument",(function({isPureXfa:e,numPages:t,annotationStorage:s,filename:o}){a.requestLoadedStream();const l=e?null:(0,i.getNewAnnotationsMap)(s),h=[a.onLoadedStream(),a.ensureCatalog("acroForm"),a.ensureCatalog("acroFormRef"),a.ensureDoc("xref"),a.ensureDoc("startXRef")];if(l)for(const[e,t]of l)h.push(a.getPage(e).then((a=>{const r=new WorkerTask(`Save (editor): page ${e}`);return a.saveNewAnnotations(k,r,t).finally((function(){finishWorkerTask(r)}))})));if(e)h.push(a.serializeXfaData(s));else for(let e=0;e{"string"==typeof a&&(e[t]=(0,r.stringToPDFString)(a))}));m={rootRef:s.trailer.getRaw("Root")||null,encryptRef:s.trailer.getRaw("Encrypt")||null,newRef:s.getNewRef(),infoRef:s.trailer.getRaw("Info")||null,info:e,fileIds:s.trailer.get("ID")||null,startXRef:l,filename:o}}s.resetNewRef();return(0,c.incrementalUpdate)({originalData:t.bytes,xrefInfo:m,newRefs:u,xref:s,hasXfa:!!f,xfaDatasetsRef:g,hasXfaDatasetsEntry:p,acroFormRef:i,acroForm:a,xfaData:d})}))}));k.on("GetOperatorList",(function wphSetupRenderPage(e,t){const n=e.pageIndex;a.getPage(n).then((function(a){const i=new WorkerTask(`GetOperatorList: page ${n}`);startWorkerTask(i);const s=p>=r.VerbosityLevel.INFOS?Date.now():0;a.getOperatorList({handler:k,sink:t,task:i,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage}).then((function(e){finishWorkerTask(i);s&&(0,r.info)(`page=${n+1} - getOperatorList: time=${Date.now()-s}ms, len=${e.length}`);t.close()}),(function(e){finishWorkerTask(i);if(!i.terminated){k.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorOperatorList});t.error(e)}}))}))}));k.on("GetTextContent",(function wphExtractText(e,t){const n=e.pageIndex;a.getPage(n).then((function(a){const i=new WorkerTask("GetTextContent: page "+n);startWorkerTask(i);const s=p>=r.VerbosityLevel.INFOS?Date.now():0;a.extractTextContent({handler:k,task:i,sink:t,includeMarkedContent:e.includeMarkedContent,combineTextItems:e.combineTextItems}).then((function(){finishWorkerTask(i);s&&(0,r.info)(`page=${n+1} - getTextContent: time=`+(Date.now()-s)+"ms");t.close()}),(function(e){finishWorkerTask(i);i.terminated||t.error(e)}))}))}));k.on("GetStructTree",(function wphGetStructTree(e){return a.getPage(e.pageIndex).then((function(e){return a.ensure(e,"getStructTree")}))}));k.on("FontFallback",(function(e){return a.fontFallback(e.id,k)}));k.on("Cleanup",(function wphCleanup(e){return a.cleanup(!0)}));k.on("Terminate",(function wphTerminate(e){d=!0;const t=[];if(a){a.terminate(new r.AbortException("Worker was terminated."));const e=a.cleanup();t.push(e);a=null}else(0,o.clearGlobalCaches)();f&&f(new r.AbortException("Worker was terminated."));for(const e of g){t.push(e.finished);e.terminate()}return Promise.all(t).then((function(){k.destroy();k=null}))}));k.on("Ready",(function wphReady(t){!function setupDoc(e){function onSuccess(e){ensureNotTerminated();k.send("GetDoc",{pdfInfo:e})}function onFailure(e){ensureNotTerminated();if(e instanceof r.PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);k.sendWithPromise("PasswordRequest",e).then((function({password:e}){finishWorkerTask(t);a.updatePassword(e);pdfManagerReady()})).catch((function(){finishWorkerTask(t);k.send("DocException",e)}))}else e instanceof r.InvalidPDFException||e instanceof r.MissingPDFException||e instanceof r.UnexpectedResponseException||e instanceof r.UnknownErrorException?k.send("DocException",e):k.send("DocException",new r.UnknownErrorException(e.message,e.toString()))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,(function(e){ensureNotTerminated();if(e instanceof i.XRefParseException){a.requestLoadedStream();a.onLoadedStream().then((function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)}))}else onFailure(e)}))}ensureNotTerminated();getPdfManager(e,{maxImageSize:e.maxImageSize,disableFontFace:e.disableFontFace,ignoreErrors:e.ignoreErrors,isEvalSupported:e.isEvalSupported,fontExtraProperties:e.fontExtraProperties,useSystemFonts:e.useSystemFonts,cMapUrl:e.cMapUrl,standardFontDataUrl:e.standardFontDataUrl},e.enableXfa).then((function(e){if(d){e.terminate(new r.AbortException("Worker was terminated."));throw new Error("Worker was terminated")}a=e;a.onLoadedStream().then((function(e){k.send("DataLoaded",{length:e.bytes.byteLength})}))})).then(pdfManagerReady,onFailure)}(e);e=null}));return x}static initializeFromPort(e){const t=new h.MessageHandler("worker","main",e);WorkerMessageHandler.setup(t,e);t.send("ready",null)}}t.WorkerMessageHandler=WorkerMessageHandler;"undefined"==typeof window&&!l.isNodeJS&&"undefined"!=typeof self&&function isMessagePort(e){return"function"==typeof e.postMessage&&"onmessage"in e}(self)&&WorkerMessageHandler.initializeFromPort(self)},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.VerbosityLevel=t.Util=t.UnknownErrorException=t.UnexpectedResponseException=t.UNSUPPORTED_FEATURES=t.TextRenderingMode=t.StreamType=t.RenderingIntentFlag=t.PermissionFlag=t.PasswordResponses=t.PasswordException=t.PageActionEventType=t.OPS=t.MissingPDFException=t.LINE_FACTOR=t.LINE_DESCENT_FACTOR=t.InvalidPDFException=t.ImageKind=t.IDENTITY_MATRIX=t.FormatError=t.FontType=t.FeatureTest=t.FONT_IDENTITY_MATRIX=t.DocumentActionEventType=t.CMapCompressionType=t.BaseException=t.AnnotationType=t.AnnotationStateModelType=t.AnnotationReviewState=t.AnnotationReplyType=t.AnnotationMode=t.AnnotationMarkedState=t.AnnotationFlag=t.AnnotationFieldFlag=t.AnnotationEditorType=t.AnnotationEditorPrefix=t.AnnotationEditorParamsType=t.AnnotationBorderStyleType=t.AnnotationActionEventType=t.AbortException=void 0;t.arrayByteLength=arrayByteLength;t.arraysToBytes=function arraysToBytes(e){const t=e.length;if(1===t&&e[0]instanceof Uint8Array)return e[0];let a=0;for(let r=0;rt});e.promise=new Promise((function(a,r){e.resolve=function(e){t=!0;a(e)};e.reject=function(e){t=!0;r(e)}}));return e};t.createValidAbsoluteUrl=function createValidAbsoluteUrl(e,t=null,a=null){if(!e)return null;try{if(a&&"string"==typeof e){if(a.addDefaultProtocol&&e.startsWith("www.")){const t=e.match(/\./g);t&&t.length>=2&&(e=`http://${e}`)}if(a.tryConvertEncoding)try{e=stringToUTF8String(e)}catch(e){}}const r=t?new URL(e,t):new URL(e);if(function _isValidProtocol(e){if(!e)return!1;switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(r))return r}catch(e){}return null};t.escapeString=function escapeString(e){return e.replace(/([()\\\n\r])/g,(e=>"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`))};t.getModificationDate=function getModificationDate(e=new Date){return[e.getUTCFullYear().toString(),(e.getUTCMonth()+1).toString().padStart(2,"0"),e.getUTCDate().toString().padStart(2,"0"),e.getUTCHours().toString().padStart(2,"0"),e.getUTCMinutes().toString().padStart(2,"0"),e.getUTCSeconds().toString().padStart(2,"0")].join("")};t.getVerbosityLevel=function getVerbosityLevel(){return n};t.info=function info(e){n>=r.INFOS&&console.log(`Info: ${e}`)};t.isArrayBuffer=function isArrayBuffer(e){return"object"==typeof e&&null!==e&&void 0!==e.byteLength};t.isArrayEqual=function isArrayEqual(e,t){if(e.length!==t.length)return!1;for(let a=0,r=e.length;a>24&255,e>>16&255,e>>8&255,255&e)};t.stringToBytes=stringToBytes;t.stringToPDFString=function stringToPDFString(e){if(e[0]>="ï"){let t;"þ"===e[0]&&"ÿ"===e[1]?t="utf-16be":"ÿ"===e[0]&&"þ"===e[1]?t="utf-16le":"ï"===e[0]&&"»"===e[1]&&"¿"===e[2]&&(t="utf-8");if(t)try{const a=new TextDecoder(t,{fatal:!0}),r=stringToBytes(e);return a.decode(r)}catch(e){warn(`stringToPDFString: "${e}".`)}}const t=[];for(let a=0,r=e.length;a>8&255),String.fromCharCode(255&r))}return t.join("")};t.stringToUTF8String=stringToUTF8String;t.unreachable=unreachable;t.utf8StringToString=function utf8StringToString(e){return unescape(encodeURIComponent(e))};t.warn=warn;a(3);t.IDENTITY_MATRIX=[1,0,0,1,0,0];t.FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];t.LINE_FACTOR=1.35;t.LINE_DESCENT_FACTOR=.35;t.RenderingIntentFlag={ANY:1,DISPLAY:2,PRINT:4,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,OPLIST:256};t.AnnotationMode={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3};t.AnnotationEditorPrefix="pdfjs_internal_editor_";t.AnnotationEditorType={DISABLE:-1,NONE:0,FREETEXT:3,INK:15};t.AnnotationEditorParamsType={FREETEXT_SIZE:1,FREETEXT_COLOR:2,FREETEXT_OPACITY:3,INK_COLOR:11,INK_THICKNESS:12,INK_OPACITY:13};t.PermissionFlag={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048};t.TextRenderingMode={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};t.ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};t.AnnotationType={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26};t.AnnotationStateModelType={MARKED:"Marked",REVIEW:"Review"};t.AnnotationMarkedState={MARKED:"Marked",UNMARKED:"Unmarked"};t.AnnotationReviewState={ACCEPTED:"Accepted",REJECTED:"Rejected",CANCELLED:"Cancelled",COMPLETED:"Completed",NONE:"None"};t.AnnotationReplyType={GROUP:"Group",REPLY:"R"};t.AnnotationFlag={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};t.AnnotationFieldFlag={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};t.AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};t.AnnotationActionEventType={E:"Mouse Enter",X:"Mouse Exit",D:"Mouse Down",U:"Mouse Up",Fo:"Focus",Bl:"Blur",PO:"PageOpen",PC:"PageClose",PV:"PageVisible",PI:"PageInvisible",K:"Keystroke",F:"Format",V:"Validate",C:"Calculate"};t.DocumentActionEventType={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"};t.PageActionEventType={O:"PageOpen",C:"PageClose"};t.StreamType={UNKNOWN:"UNKNOWN",FLATE:"FLATE",LZW:"LZW",DCT:"DCT",JPX:"JPX",JBIG:"JBIG",A85:"A85",AHX:"AHX",CCF:"CCF",RLX:"RLX"};t.FontType={UNKNOWN:"UNKNOWN",TYPE1:"TYPE1",TYPE1STANDARD:"TYPE1STANDARD",TYPE1C:"TYPE1C",CIDFONTTYPE0:"CIDFONTTYPE0",CIDFONTTYPE0C:"CIDFONTTYPE0C",TRUETYPE:"TRUETYPE",CIDFONTTYPE2:"CIDFONTTYPE2",TYPE3:"TYPE3",OPENTYPE:"OPENTYPE",TYPE0:"TYPE0",MMTYPE1:"MMTYPE1"};const r={ERRORS:0,WARNINGS:1,INFOS:5};t.VerbosityLevel=r;t.CMapCompressionType={NONE:0,BINARY:1,STREAM:2};t.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};t.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",signatures:"signatures",smask:"smask",shadingPattern:"shadingPattern",font:"font",errorTilingPattern:"errorTilingPattern",errorExtGState:"errorExtGState",errorXObject:"errorXObject",errorFontLoadType3:"errorFontLoadType3",errorFontState:"errorFontState",errorFontMissing:"errorFontMissing",errorFontTranslate:"errorFontTranslate",errorColorSpace:"errorColorSpace",errorOperatorList:"errorOperatorList",errorFontToUnicode:"errorFontToUnicode",errorFontLoadNative:"errorFontLoadNative",errorFontBuildPath:"errorFontBuildPath",errorFontGetPath:"errorFontGetPath",errorMarkedContent:"errorMarkedContent",errorContentSubStream:"errorContentSubStream"};t.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let n=r.WARNINGS;function warn(e){n>=r.WARNINGS&&console.log(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function shadow(e,t,a){Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!1});return a}const i=function BaseExceptionClosure(){function BaseException(e,t){this.constructor===BaseException&&unreachable("Cannot initialize BaseException.");this.message=e;this.name=t}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();t.BaseException=i;t.PasswordException=class PasswordException extends i{constructor(e,t){super(e,"PasswordException");this.code=t}};t.UnknownErrorException=class UnknownErrorException extends i{constructor(e,t){super(e,"UnknownErrorException");this.details=t}};t.InvalidPDFException=class InvalidPDFException extends i{constructor(e){super(e,"InvalidPDFException")}};t.MissingPDFException=class MissingPDFException extends i{constructor(e){super(e,"MissingPDFException")}};t.UnexpectedResponseException=class UnexpectedResponseException extends i{constructor(e,t){super(e,"UnexpectedResponseException");this.status=t}};t.FormatError=class FormatError extends i{constructor(e){super(e,"FormatError")}};t.AbortException=class AbortException extends i{constructor(e){super(e,"AbortException")}};function stringToBytes(e){"string"!=typeof e&&unreachable("Invalid argument for stringToBytes");const t=e.length,a=new Uint8Array(t);for(let r=0;re.toString(16).padStart(2,"0")));class Util{static makeHexColor(e,t,a){return`#${s[e]}${s[t]}${s[a]}`}static scaleMinMax(e,t){let a;if(e[0]){if(e[0]<0){a=t[0];t[0]=t[1];t[1]=a}t[0]*=e[0];t[1]*=e[0];if(e[3]<0){a=t[2];t[2]=t[3];t[3]=a}t[2]*=e[3];t[3]*=e[3]}else{a=t[0];t[0]=t[2];t[2]=a;a=t[1];t[1]=t[3];t[3]=a;if(e[1]<0){a=t[2];t[2]=t[3];t[3]=a}t[2]*=e[1];t[3]*=e[1];if(e[2]<0){a=t[0];t[0]=t[1];t[1]=a}t[0]*=e[2];t[1]*=e[2]}t[0]+=e[4];t[1]+=e[4];t[2]+=e[5];t[3]+=e[5]}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static applyTransform(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]}static applyInverseTransform(e,t){const a=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/a,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/a]}static getAxialAlignedBoundingBox(e,t){const a=Util.applyTransform(e,t),r=Util.applyTransform(e.slice(2,4),t),n=Util.applyTransform([e[0],e[3]],t),i=Util.applyTransform([e[2],e[1]],t);return[Math.min(a[0],r[0],n[0],i[0]),Math.min(a[1],r[1],n[1],i[1]),Math.max(a[0],r[0],n[0],i[0]),Math.max(a[1],r[1],n[1],i[1])]}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static apply3dTransform(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2],e[3]*t[0]+e[4]*t[1]+e[5]*t[2],e[6]*t[0]+e[7]*t[1]+e[8]*t[2]]}static singularValueDecompose2dScale(e){const t=[e[0],e[2],e[1],e[3]],a=e[0]*t[0]+e[1]*t[2],r=e[0]*t[1]+e[1]*t[3],n=e[2]*t[0]+e[3]*t[2],i=e[2]*t[1]+e[3]*t[3],s=(a+i)/2,o=Math.sqrt((a+i)**2-4*(a*i-n*r))/2,c=s+o||1,l=s-o||1;return[Math.sqrt(c),Math.sqrt(l)]}static normalizeRect(e){const t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t}static intersect(e,t){const a=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),r=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(a>r)return null;const n=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),i=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return n>i?null:[a,n,r,i]}static bezierBoundingBox(e,t,a,r,n,i,s,o){const c=[],l=[[],[]];let h,u,d,f,g,p,m,b;for(let l=0;l<2;++l){if(0===l){u=6*e-12*a+6*n;h=-3*e+9*a-9*n+3*s;d=3*a-3*e}else{u=6*t-12*r+6*i;h=-3*t+9*r-9*i+3*o;d=3*r-3*t}if(Math.abs(h)<1e-12){if(Math.abs(u)<1e-12)continue;f=-d/u;0{a(4)},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.isNodeJS=void 0;const a=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type);t.isNodeJS=a},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.RefSetCache=t.RefSet=t.Ref=t.Name=t.EOF=t.Dict=t.Cmd=t.CIRCULAR_REF=void 0;t.clearPrimitiveCaches=function clearPrimitiveCaches(){o._clearCache();s._clearCache();l._clearCache()};t.isCmd=function isCmd(e,t){return e instanceof o&&(void 0===t||e.cmd===t)};t.isDict=function isDict(e,t){return e instanceof Dict&&(void 0===t||isName(e.get("Type"),t))};t.isName=isName;t.isRefsEqual=function isRefsEqual(e,t){return e.num===t.num&&e.gen===t.gen};var r=a(2);const n=Symbol("CIRCULAR_REF");t.CIRCULAR_REF=n;const i=Symbol("EOF");t.EOF=i;const s=function NameClosure(){let e=Object.create(null);class Name{constructor(e){this.name=e}static get(t){return e[t]||(e[t]=new Name(t))}static _clearCache(){e=Object.create(null)}}return Name}();t.Name=s;const o=function CmdClosure(){let e=Object.create(null);class Cmd{constructor(e){this.cmd=e}static get(t){return e[t]||(e[t]=new Cmd(t))}static _clearCache(){e=Object.create(null)}}return Cmd}();t.Cmd=o;const c=function nonSerializableClosure(){return c};class Dict{constructor(e=null){this._map=Object.create(null);this.xref=e;this.objId=null;this.suppressEncryption=!1;this.__nonSerializable__=c}assignXref(e){this.xref=e}get size(){return Object.keys(this._map).length}get(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}return r instanceof l&&this.xref?this.xref.fetch(r,this.suppressEncryption):r}async getAsync(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}return r instanceof l&&this.xref?this.xref.fetchAsync(r,this.suppressEncryption):r}getArray(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}r instanceof l&&this.xref&&(r=this.xref.fetch(r,this.suppressEncryption));if(Array.isArray(r)){r=r.slice();for(let e=0,t=r.length;e{(0,r.unreachable)("Should not call `set` on the empty dictionary.")};return(0,r.shadow)(this,"empty",e)}static merge({xref:e,dictArray:t,mergeSubDicts:a=!1}){const r=new Dict(e),n=new Map;for(const e of t)if(e instanceof Dict)for(const[t,r]of Object.entries(e._map)){let e=n.get(t);if(void 0===e){e=[];n.set(t,e)}else if(!(a&&r instanceof Dict))continue;e.push(r)}for(const[t,a]of n){if(1===a.length||!(a[0]instanceof Dict)){r._map[t]=a[0];continue}const n=new Dict(e);for(const e of a)for(const[t,a]of Object.entries(e._map))void 0===n._map[t]&&(n._map[t]=a);n.size>0&&(r._map[t]=n)}n.clear();return r.size>0?r:Dict.empty}}t.Dict=Dict;const l=function RefClosure(){let e=Object.create(null);class Ref{constructor(e,t){this.num=e;this.gen=t}toString(){return 0===this.gen?`${this.num}R`:`${this.num}R${this.gen}`}static get(t,a){const r=0===a?`${t}R`:`${t}R${a}`;return e[r]||(e[r]=new Ref(t,a))}static _clearCache(){e=Object.create(null)}}return Ref}();t.Ref=l;class RefSet{constructor(e=null){this._set=new Set(e&&e._set)}has(e){return this._set.has(e.toString())}put(e){this._set.add(e.toString())}remove(e){this._set.delete(e.toString())}[Symbol.iterator](){return this._set.values()}clear(){this._set.clear()}}t.RefSet=RefSet;class RefSetCache{constructor(){this._map=new Map}get size(){return this._map.size}get(e){return this._map.get(e.toString())}has(e){return this._map.has(e.toString())}put(e,t){this._map.set(e.toString(),t)}putAlias(e,t){this._map.set(e.toString(),this.get(t))}[Symbol.iterator](){return this._map.values()}clear(){this._map.clear()}}t.RefSetCache=RefSetCache;function isName(e,t){return e instanceof s&&(void 0===t||e.name===t)}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XRefParseException=t.XRefEntryException=t.ParserEOFException=t.MissingDataException=t.DocStats=void 0;t.collectActions=function collectActions(e,t,a){const i=Object.create(null),s=getInheritableProperty({dict:t,key:"AA",stopWhenFound:!1});if(s)for(let t=s.length-1;t>=0;t--){const r=s[t];if(r instanceof n.Dict)for(const t of r.getKeys()){const s=a[t];if(!s)continue;const o=r.getRaw(t),c=new n.RefSet,l=[];_collectJS(o,e,l,c);l.length>0&&(i[s]=l)}}if(t.has("A")){const a=t.get("A"),r=new n.RefSet,s=[];_collectJS(a,e,s,r);s.length>0&&(i.Action=s)}return(0,r.objectSize)(i)>0?i:null};t.encodeToXmlString=function encodeToXmlString(e){const t=[];let a=0;for(let r=0,n=e.length;r55295&&(n<57344||n>65533)&&r++;a=r+1}}if(0===t.length)return e;a126||35===n||40===n||41===n||60===n||62===n||91===n||93===n||123===n||125===n||47===n||37===n){a0?t:null};t.isWhiteSpace=function isWhiteSpace(e){return 32===e||9===e||13===e||10===e};t.log2=function log2(e){if(e<=0)return 0;return Math.ceil(Math.log2(e))};t.numberToString=function numberToString(e){if(Number.isInteger(e))return e.toString();const t=Math.round(100*e);if(t%100==0)return(t/100).toString();if(t%10==0)return e.toFixed(1);return e.toFixed(2)};t.parseXFAPath=function parseXFAPath(e){const t=/(.+)\[(\d+)\]$/;return e.split(".").map((e=>{const a=e.match(t);return a?{name:a[1],pos:parseInt(a[2],10)}:{name:e,pos:0}}))};t.readInt8=function readInt8(e,t){return e[t]<<24>>24};t.readUint16=function readUint16(e,t){return e[t]<<8|e[t+1]};t.readUint32=function readUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0};t.recoverJsURL=function recoverJsURL(e){const t=new RegExp("^\\s*("+["app.launchURL","window.open","xfa.host.gotoURL"].join("|").split(".").join("\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec(e);if(t&&t[2]){const e=t[2];let a=!1;"true"===t[3]&&"app.launchURL"===t[1]&&(a=!0);return{url:e,newWindow:a}}return null};t.toRomanNumerals=function toRomanNumerals(e,t=!1){(0,r.assert)(Number.isInteger(e)&&e>0,"The number should be a positive integer.");const a=[];let n;for(;e>=1e3;){e-=1e3;a.push("M")}n=e/100|0;e%=100;a.push(s[n]);n=e/10|0;e%=10;a.push(s[10+n]);a.push(s[20+e]);const i=a.join("");return t?i.toLowerCase():i};t.validateCSSFont=function validateCSSFont(e){const t=new Set(["100","200","300","400","500","600","700","800","900","1000","normal","bold","bolder","lighter"]),{fontFamily:a,fontWeight:n,italicAngle:i}=e;if(/^".*"$/.test(a)){if(/[^\\]"/.test(a.slice(1,a.length-1))){(0,r.warn)(`XFA - FontFamily contains some unescaped ": ${a}.`);return!1}}else if(/^'.*'$/.test(a)){if(/[^\\]'/.test(a.slice(1,a.length-1))){(0,r.warn)(`XFA - FontFamily contains some unescaped ': ${a}.`);return!1}}else for(const e of a.split(/[ \t]+/))if(/^(\d|(-(\d|-)))/.test(e)||!/^[\w-\\]+$/.test(e)){(0,r.warn)(`XFA - FontFamily contains some invalid : ${a}.`);return!1}const s=n?n.toString():"";e.fontWeight=t.has(s)?s:"400";const o=parseFloat(i);e.italicAngle=isNaN(o)||o<-90||o>90?"14":i.toString();return!0};var r=a(2),n=a(5),i=a(7);class MissingDataException extends r.BaseException{constructor(e,t){super(`Missing data [${e}, ${t})`,"MissingDataException");this.begin=e;this.end=t}}t.MissingDataException=MissingDataException;class ParserEOFException extends r.BaseException{constructor(e){super(e,"ParserEOFException")}}t.ParserEOFException=ParserEOFException;class XRefEntryException extends r.BaseException{constructor(e){super(e,"XRefEntryException")}}t.XRefEntryException=XRefEntryException;class XRefParseException extends r.BaseException{constructor(e){super(e,"XRefParseException")}}t.XRefParseException=XRefParseException;t.DocStats=class DocStats{constructor(e){this._handler=e;this._streamTypes=new Set;this._fontTypes=new Set}_send(){const e=Object.create(null),t=Object.create(null);for(const t of this._streamTypes)e[t]=!0;for(const e of this._fontTypes)t[e]=!0;this._handler.send("DocStats",{streamTypes:e,fontTypes:t})}addStreamType(e){if(!this._streamTypes.has(e)){this._streamTypes.add(e);this._send()}}addFontType(e){if(!this._fontTypes.has(e)){this._fontTypes.add(e);this._send()}}};function getInheritableProperty({dict:e,key:t,getArray:a=!1,stopWhenFound:r=!0}){let i;const s=new n.RefSet;for(;e instanceof n.Dict&&(!e.objId||!s.has(e.objId));){e.objId&&s.put(e.objId);const n=a?e.getArray(t):e.get(t);if(void 0!==n){if(r)return n;i||(i=[]);i.push(n)}e=e.get("Parent")}return i}const s=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];function _collectJS(e,t,a,s){if(!e)return;let o=null;if(e instanceof n.Ref){if(s.has(e))return;o=e;s.put(o);e=t.fetch(e)}if(Array.isArray(e))for(const r of e)_collectJS(r,t,a,s);else if(e instanceof n.Dict){if((0,n.isName)(e.get("S"),"JavaScript")){const t=e.get("JS");let n;t instanceof i.BaseStream?n=t.getString():"string"==typeof t&&(n=t);n=n&&(0,r.stringToPDFString)(n).replace(/\u0000/g,"");n&&a.push(n)}_collectJS(e.getRaw("Next"),t,a,s)}o&&s.remove(o)}const o={60:"<",62:">",38:"&",34:""",39:"'"}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.BaseStream=void 0;var r=a(2);class BaseStream{constructor(){this.constructor===BaseStream&&(0,r.unreachable)("Cannot initialize BaseStream.")}get length(){(0,r.unreachable)("Abstract getter `length` accessed")}get isEmpty(){(0,r.unreachable)("Abstract getter `isEmpty` accessed")}get isDataLoaded(){return(0,r.shadow)(this,"isDataLoaded",!0)}getByte(){(0,r.unreachable)("Abstract method `getByte` called")}getBytes(e){(0,r.unreachable)("Abstract method `getBytes` called")}peekByte(){const e=this.getByte();-1!==e&&this.pos--;return e}peekBytes(e){const t=this.getBytes(e);this.pos-=t.length;return t}getUint16(){const e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t}getInt32(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()}getByteRange(e,t){(0,r.unreachable)("Abstract method `getByteRange` called")}getString(e){return(0,r.bytesToString)(this.getBytes(e))}skip(e){this.pos+=e||1}reset(){(0,r.unreachable)("Abstract method `reset` called")}moveStart(){(0,r.unreachable)("Abstract method `moveStart` called")}makeSubStream(e,t,a=null){(0,r.unreachable)("Abstract method `makeSubStream` called")}getBaseStreams(){return null}}t.BaseStream=BaseStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NetworkPdfManager=t.LocalPdfManager=void 0;var r=a(2),n=a(9),i=a(6),s=a(11),o=a(10);function parseDocBaseUrl(e){if(e){const t=(0,r.createValidAbsoluteUrl)(e);if(t)return t.href;(0,r.warn)(`Invalid absolute docBaseUrl: "${e}".`)}return null}class BasePdfManager{constructor(){this.constructor===BasePdfManager&&(0,r.unreachable)("Cannot initialize BasePdfManager.")}get docId(){return this._docId}get password(){return this._password}get docBaseUrl(){const e=this.pdfDocument.catalog;return(0,r.shadow)(this,"docBaseUrl",e.baseUrl||this._docBaseUrl)}onLoadedStream(){(0,r.unreachable)("Abstract method `onLoadedStream` called")}ensureDoc(e,t){return this.ensure(this.pdfDocument,e,t)}ensureXRef(e,t){return this.ensure(this.pdfDocument.xref,e,t)}ensureCatalog(e,t){return this.ensure(this.pdfDocument.catalog,e,t)}getPage(e){return this.pdfDocument.getPage(e)}fontFallback(e,t){return this.pdfDocument.fontFallback(e,t)}loadXfaFonts(e,t){return this.pdfDocument.loadXfaFonts(e,t)}loadXfaImages(){return this.pdfDocument.loadXfaImages()}serializeXfaData(e){return this.pdfDocument.serializeXfaData(e)}cleanup(e=!1){return this.pdfDocument.cleanup(e)}async ensure(e,t,a){(0,r.unreachable)("Abstract method `ensure` called")}requestRange(e,t){(0,r.unreachable)("Abstract method `requestRange` called")}requestLoadedStream(){(0,r.unreachable)("Abstract method `requestLoadedStream` called")}sendProgressiveData(e){(0,r.unreachable)("Abstract method `sendProgressiveData` called")}updatePassword(e){this._password=e}terminate(e){(0,r.unreachable)("Abstract method `terminate` called")}}t.LocalPdfManager=class LocalPdfManager extends BasePdfManager{constructor(e,t,a,r,n,i,c){super();this._docId=e;this._password=a;this._docBaseUrl=parseDocBaseUrl(c);this.msgHandler=r;this.evaluatorOptions=n;this.enableXfa=i;const l=new o.Stream(t);this.pdfDocument=new s.PDFDocument(this,l);this._loadedStreamPromise=Promise.resolve(l)}async ensure(e,t,a){const r=e[t];return"function"==typeof r?r.apply(e,a):r}requestRange(e,t){return Promise.resolve()}requestLoadedStream(){}onLoadedStream(){return this._loadedStreamPromise}terminate(e){}};t.NetworkPdfManager=class NetworkPdfManager extends BasePdfManager{constructor(e,t,a,r,i,o){super();this._docId=e;this._password=a.password;this._docBaseUrl=parseDocBaseUrl(o);this.msgHandler=a.msgHandler;this.evaluatorOptions=r;this.enableXfa=i;this.streamManager=new n.ChunkedStreamManager(t,{msgHandler:a.msgHandler,length:a.length,disableAutoFetch:a.disableAutoFetch,rangeChunkSize:a.rangeChunkSize});this.pdfDocument=new s.PDFDocument(this,this.streamManager.getStream())}async ensure(e,t,a){try{const r=e[t];return"function"==typeof r?r.apply(e,a):r}catch(r){if(!(r instanceof i.MissingDataException))throw r;await this.requestRange(r.begin,r.end);return this.ensure(e,t,a)}}requestRange(e,t){return this.streamManager.requestRange(e,t)}requestLoadedStream(){this.streamManager.requestAllChunks()}sendProgressiveData(e){this.streamManager.onReceiveData({chunk:e})}onLoadedStream(){return this.streamManager.onLoadedStream()}terminate(e){this.streamManager.abort(e)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ChunkedStreamManager=t.ChunkedStream=void 0;var r=a(2),n=a(6),i=a(10);class ChunkedStream extends i.Stream{constructor(e,t,a){super(new Uint8Array(e),0,e,null);this.chunkSize=t;this._loadedChunks=new Set;this.numChunks=Math.ceil(e/t);this.manager=a;this.progressiveDataLength=0;this.lastSuccessfulEnsureByteChunk=-1}getMissingChunks(){const e=[];for(let t=0,a=this.numChunks;t=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(let e=a;ethis.numChunks)&&t!==this.lastSuccessfulEnsureByteChunk){if(!this._loadedChunks.has(t))throw new n.MissingDataException(e,e+1);this.lastSuccessfulEnsureByteChunk=t}}ensureRange(e,t){if(e>=t)return;if(t<=this.progressiveDataLength)return;const a=Math.floor(e/this.chunkSize);if(a>this.numChunks)return;const r=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let i=a;i=this.end)return-1;e>=this.progressiveDataLength&&this.ensureByte(e);return this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,r=this.end;if(!e){r>this.progressiveDataLength&&this.ensureRange(a,r);return t.subarray(a,r)}let n=a+e;n>r&&(n=r);n>this.progressiveDataLength&&this.ensureRange(a,n);this.pos=n;return t.subarray(a,n)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);t>this.progressiveDataLength&&this.ensureRange(e,t);return this.bytes.subarray(e,t)}makeSubStream(e,t,a=null){t?e+t>this.progressiveDataLength&&this.ensureRange(e,e+t):e>=this.progressiveDataLength&&this.ensureByte(e);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){const e=this.chunkSize,t=Math.floor(this.start/e),a=Math.floor((this.end-1)/e)+1,r=[];for(let e=t;e{const readChunk=s=>{try{if(!s.done){const e=s.value;n.push(e);i+=(0,r.arrayByteLength)(e);a.isStreamingSupported&&this.onProgress({loaded:i});a.read().then(readChunk,t);return}const o=(0,r.arraysToBytes)(n);n=null;e(o)}catch(e){t(e)}};a.read().then(readChunk,t)})).then((t=>{this.aborted||this.onReceiveData({chunk:t,begin:e})}))}requestAllChunks(){const e=this.stream.getMissingChunks();this._requestChunks(e);return this._loadedStreamCapability.promise}_requestChunks(e){const t=this.currRequestId++,a=new Set;this._chunksNeededByRequest.set(t,a);for(const t of e)this.stream.hasChunk(t)||a.add(t);if(0===a.size)return Promise.resolve();const n=(0,r.createPromiseCapability)();this._promisesByRequest.set(t,n);const i=[];for(const e of a){let a=this._requestsByChunk.get(e);if(!a){a=[];this._requestsByChunk.set(e,a);i.push(e)}a.push(t)}if(i.length>0){const e=this.groupChunks(i);for(const t of e){const e=t.beginChunk*this.chunkSize,a=Math.min(t.endChunk*this.chunkSize,this.length);this.sendRequest(e,a).catch(n.reject)}}return n.promise.catch((e=>{if(!this.aborted)throw e}))}getStream(){return this.stream}requestRange(e,t){t=Math.min(t,this.length);const a=this.getBeginChunk(e),r=this.getEndChunk(t),n=[];for(let e=a;e=0&&r+1!==i){t.push({beginChunk:a,endChunk:r+1});a=i}n+1===e.length&&t.push({beginChunk:a,endChunk:i+1});r=i}return t}onProgress(e){this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize+e.loaded,total:this.length})}onReceiveData(e){const t=e.chunk,a=void 0===e.begin,r=a?this.progressiveDataLength:e.begin,n=r+t.byteLength,i=Math.floor(r/this.chunkSize),s=n0||o.push(a)}}}if(!this.disableAutoFetch&&0===this._requestsByChunk.size){let e;if(1===this.stream.numChunksLoaded){const t=this.stream.numChunks-1;this.stream.hasChunk(t)||(e=t)}else e=this.stream.nextEmptyChunk(s);Number.isInteger(e)&&this._requestChunks([e])}for(const e of o){const t=this._promisesByRequest.get(e);this._promisesByRequest.delete(e);t.resolve()}this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})}onError(e){this._loadedStreamCapability.reject(e)}getBeginChunk(e){return Math.floor(e/this.chunkSize)}getEndChunk(e){return Math.floor((e-1)/this.chunkSize)+1}abort(e){this.aborted=!0;this.pdfNetworkStream&&this.pdfNetworkStream.cancelAllRequests(e);for(const t of this._promisesByRequest.values())t.reject(e)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StringStream=t.Stream=t.NullStream=void 0;var r=a(7),n=a(2);class Stream extends r.BaseStream{constructor(e,t,a,r){super();this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+a||this.bytes.length;this.dict=r}get length(){return this.end-this.start}get isEmpty(){return 0===this.length}getByte(){return this.pos>=this.end?-1:this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,r=this.end;if(!e)return t.subarray(a,r);let n=a+e;n>r&&(n=r);this.pos=n;return t.subarray(a,n)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);return this.bytes.subarray(e,t)}reset(){this.pos=this.start}moveStart(){this.start=this.pos}makeSubStream(e,t,a=null){return new Stream(this.bytes.buffer,e,t,a)}}t.Stream=Stream;t.StringStream=class StringStream extends Stream{constructor(e){super((0,n.stringToBytes)(e))}};t.NullStream=class NullStream extends Stream{constructor(){super(new Uint8Array(0))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Page=t.PDFDocument=void 0;var r=a(12),n=a(2),i=a(6),s=a(5),o=a(51),c=a(7),l=a(67),h=a(69),u=a(71),d=a(100),f=a(17),g=a(10),p=a(75),m=a(62),b=a(15),y=a(19),w=a(74),S=a(65),x=a(76),k=a(101);const C=[0,0,612,792];class Page{constructor({pdfManager:e,xref:t,pageIndex:a,pageDict:r,ref:n,globalIdFactory:i,fontCache:s,builtInCMapCache:o,standardFontDataCache:c,globalImageCache:l,nonBlendModesSet:h,xfaFactory:u}){this.pdfManager=e;this.pageIndex=a;this.pageDict=r;this.xref=t;this.ref=n;this.fontCache=s;this.builtInCMapCache=o;this.standardFontDataCache=c;this.globalImageCache=l;this.nonBlendModesSet=h;this.evaluatorOptions=e.evaluatorOptions;this.resourcesPromise=null;this.xfaFactory=u;const d={obj:0};this._localIdFactory=class extends i{static createObjId(){return`p${a}_${++d.obj}`}static getPageObjId(){return`page${n.toString()}`}}}_getInheritableProperty(e,t=!1){const a=(0,i.getInheritableProperty)({dict:this.pageDict,key:e,getArray:t,stopWhenFound:!1});return Array.isArray(a)?1!==a.length&&a[0]instanceof s.Dict?s.Dict.merge({xref:this.xref,dictArray:a}):a[0]:a}get content(){return this.pageDict.getArray("Contents")}get resources(){const e=this._getInheritableProperty("Resources");return(0,n.shadow)(this,"resources",e instanceof s.Dict?e:s.Dict.empty)}_getBoundingBox(e){if(this.xfaData)return this.xfaData.bbox;const t=this._getInheritableProperty(e,!0);if(Array.isArray(t)&&4===t.length){if(t[2]-t[0]!=0&&t[3]-t[1]!=0)return t;(0,n.warn)(`Empty /${e} entry.`)}return null}get mediaBox(){return(0,n.shadow)(this,"mediaBox",this._getBoundingBox("MediaBox")||C)}get cropBox(){return(0,n.shadow)(this,"cropBox",this._getBoundingBox("CropBox")||this.mediaBox)}get userUnit(){let e=this.pageDict.get("UserUnit");("number"!=typeof e||e<=0)&&(e=1);return(0,n.shadow)(this,"userUnit",e)}get view(){const{cropBox:e,mediaBox:t}=this;let a;if(e===t||(0,n.isArrayEqual)(e,t))a=t;else{const r=n.Util.intersect(e,t);r&&r[2]-r[0]!=0&&r[3]-r[1]!=0?a=r:(0,n.warn)("Empty /CropBox and /MediaBox intersection.")}return(0,n.shadow)(this,"view",a||t)}get rotate(){let e=this._getInheritableProperty("Rotate")||0;e%90!=0?e=0:e>=360?e%=360:e<0&&(e=(e%360+360)%360);return(0,n.shadow)(this,"rotate",e)}_onSubStreamError(e,t,a){if(!this.evaluatorOptions.ignoreErrors)throw t;e.send("UnsupportedFeature",{featureId:n.UNSUPPORTED_FEATURES.errorContentSubStream});(0,n.warn)(`getContentStream - ignoring sub-stream (${a}): "${t}".`)}getContentStream(e){return this.pdfManager.ensure(this,"content").then((t=>t instanceof c.BaseStream?t:Array.isArray(t)?new y.StreamsSequenceStream(t,this._onSubStreamError.bind(this,e)):new g.NullStream))}get xfaData(){return(0,n.shadow)(this,"xfaData",this.xfaFactory?{bbox:this.xfaFactory.getBoundingBox(this.pageIndex)}:null)}async saveNewAnnotations(e,t,a){if(this.xfaFactory)throw new Error("XFA: Cannot save new annotations.");const n=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}),i=this.pageDict,s=this.annotations.slice(),o=await r.AnnotationFactory.saveNewAnnotations(n,t,a);for(const{ref:e}of o.annotations)s.push(e);const c=i.get("Annots");i.set("Annots",s);const l=[];let h=null;this.xref.encrypt&&(h=this.xref.encrypt.createCipherTransform(this.ref.num,this.ref.gen));(0,S.writeObject)(this.ref,i,l,h);c&&i.set("Annots",c);const u=o.dependencies;u.push({ref:this.ref,data:l.join("")},...o.annotations);return u}save(e,t,a){const r=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions});return this._parsedAnnotations.then((function(e){const i=[];for(const s of e)s.mustBePrinted(a)&&i.push(s.save(r,t,a).catch((function(e){(0,n.warn)(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null})));return Promise.all(i).then((function(e){return e.filter((e=>!!e))}))}))}loadResources(e){this.resourcesPromise||(this.resourcesPromise=this.pdfManager.ensure(this,"resources"));return this.resourcesPromise.then((()=>new p.ObjectLoader(this.resources,e,this.xref).load()))}getOperatorList({handler:e,sink:t,task:a,intent:s,cacheKey:o,annotationStorage:c=null}){const l=this.getContentStream(e),h=this.loadResources(["ColorSpace","ExtGState","Font","Pattern","Properties","Shading","XObject"]),u=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}),d=this.xfaFactory?null:(0,i.getNewAnnotationsMap)(c);let f=Promise.resolve(null);if(d){const e=d.get(this.pageIndex);e&&(f=r.AnnotationFactory.printNewAnnotations(u,a,e))}const g=Promise.all([l,h]).then((([r])=>{const n=new m.OperatorList(s,t);e.send("StartRenderPage",{transparency:u.hasBlendModes(this.resources,this.nonBlendModesSet),pageIndex:this.pageIndex,cacheKey:o});return u.getOperatorList({stream:r,task:a,resources:this.resources,operatorList:n}).then((function(){return n}))}));return Promise.all([g,this._parsedAnnotations,f]).then((function([e,t,r]){r&&(t=t.concat(r));if(0===t.length||s&n.RenderingIntentFlag.ANNOTATIONS_DISABLE){e.flush(!0);return{length:e.totalLength}}const i=!!(s&n.RenderingIntentFlag.ANNOTATIONS_FORMS),o=!!(s&n.RenderingIntentFlag.ANY),l=!!(s&n.RenderingIntentFlag.DISPLAY),h=!!(s&n.RenderingIntentFlag.PRINT),d=[];for(const e of t)(o||l&&e.mustBeViewed(c)||h&&e.mustBePrinted(c))&&d.push(e.getOperatorList(u,a,s,i,c).catch((function(e){(0,n.warn)(`getOperatorList - ignoring annotation data during "${a.name}" task: "${e}".`);return null})));return Promise.all(d).then((function(t){let a=!1,r=!1;for(const{opList:n,separateForm:i,separateCanvas:s}of t){e.addOpList(n);i&&(a=i);s&&(r=s)}e.flush(!0,{form:a,canvas:r});return{length:e.totalLength}}))}))}extractTextContent({handler:e,task:t,includeMarkedContent:a,sink:r,combineTextItems:n}){const i=this.getContentStream(e),s=this.loadResources(["ExtGState","Font","Properties","XObject"]);return Promise.all([i,s]).then((([i])=>new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}).getTextContent({stream:i,task:t,resources:this.resources,includeMarkedContent:a,combineTextItems:n,sink:r,viewBox:this.view})))}async getStructTree(){const e=await this.pdfManager.ensureCatalog("structTreeRoot");if(!e)return null;return(await this.pdfManager.ensure(this,"_parseStructTree",[e])).serializable}_parseStructTree(e){const t=new w.StructTreePage(e,this.pageDict);t.parse();return t}async getAnnotationsData(e,t,a){const r=await this._parsedAnnotations;if(0===r.length)return[];const i=[],s=[];let o;const c=!!(a&n.RenderingIntentFlag.ANY),l=!!(a&n.RenderingIntentFlag.DISPLAY),h=!!(a&n.RenderingIntentFlag.PRINT);for(const a of r){const r=c||l&&a.viewable;(r||h&&a.printable)&&s.push(a.data);if(a.hasTextContent&&r){o||(o=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}));i.push(a.extractTextContent(o,t,this.view).catch((function(e){(0,n.warn)(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)})))}}await Promise.all(i);return s}get annotations(){const e=this._getInheritableProperty("Annots");return(0,n.shadow)(this,"annotations",Array.isArray(e)?e:[])}get _parsedAnnotations(){const e=this.pdfManager.ensure(this,"annotations").then((()=>{const e=[];for(const t of this.annotations)e.push(r.AnnotationFactory.create(this.xref,t,this.pdfManager,this._localIdFactory,!1).catch((function(e){(0,n.warn)(`_parsedAnnotations: "${e}".`);return null})));return Promise.all(e).then((function(e){if(0===e.length)return e;const t=[];let a;for(const n of e)if(n)if(n instanceof r.PopupAnnotation){a||(a=[]);a.push(n)}else t.push(n);a&&t.push(...a);return t}))}));return(0,n.shadow)(this,"_parsedAnnotations",e)}get jsActions(){const e=(0,i.collectActions)(this.xref,this.pageDict,n.PageActionEventType);return(0,n.shadow)(this,"jsActions",e)}}t.Page=Page;const v=new Uint8Array([37,80,68,70,45]),F=new Uint8Array([115,116,97,114,116,120,114,101,102]),O=new Uint8Array([101,110,100,111,98,106]),T=/^[1-9]\.\d$/;function find(e,t,a=1024,r=!1){const n=t.length,i=e.peekBytes(a),s=i.length-n;if(s<=0)return!1;if(r){const a=n-1;let r=i.length-1;for(;r>=a;){let s=0;for(;s=n){e.pos+=r-a;return!0}r--}}else{let a=0;for(;a<=s;){let r=0;for(;r=n){e.pos+=a;return!0}a++}}return!1}t.PDFDocument=class PDFDocument{constructor(e,t){if(t.length<=0)throw new n.InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new k.XRef(t,e);this._pagePromises=new Map;this._version=null;const a={font:0};this._globalIdFactory=class{static getDocId(){return`g_${e.docId}`}static createFontId(){return"f"+ ++a.font}static createObjId(){(0,n.unreachable)("Abstract method `createObjId` called.")}static getPageObjId(){(0,n.unreachable)("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new h.Catalog(this.pdfManager,this.xref);this.catalog.version&&(this._version=this.catalog.version)}get linearization(){let e=null;try{e=f.Linearization.create(this.stream)}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.info)(e)}return(0,n.shadow)(this,"linearization",e)}get startXRef(){const e=this.stream;let t=0;if(this.linearization){e.reset();find(e,O)&&(t=e.pos+6-e.start)}else{const a=1024,r=F.length;let n=!1,s=e.end;for(;!n&&s>0;){s-=a-r;s<0&&(s=0);e.pos=s;n=find(e,F,a,!0)}if(n){e.skip(9);let a;do{a=e.getByte()}while((0,i.isWhiteSpace)(a));let r="";for(;a>=32&&a<=57;){r+=String.fromCharCode(a);a=e.getByte()}t=parseInt(r,10);isNaN(t)&&(t=0)}}return(0,n.shadow)(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,v))return;e.moveStart();let t,a="";for(;(t=e.getByte())>32&&!(a.length>=12);)a+=String.fromCharCode(t);this._version||(this._version=a.substring(5))}parseStartXRef(){this.xref.setStartXRef(this.startXRef)}get numPages(){let e=0;e=this.catalog.hasActualNumPages?this.catalog.numPages:this.xfaFactory?this.xfaFactory.getNumPages():this.linearization?this.linearization.numPages:this.catalog.numPages;return(0,n.shadow)(this,"numPages",e)}_hasOnlyDocumentSignatures(e,t=0){return!!Array.isArray(e)&&e.every((e=>{if(!((e=this.xref.fetchIfRef(e))instanceof s.Dict))return!1;if(e.has("Kids")){if(++t>10){(0,n.warn)("_hasOnlyDocumentSignatures: maximum recursion depth reached");return!1}return this._hasOnlyDocumentSignatures(e.get("Kids"),t)}const a=(0,s.isName)(e.get("FT"),"Sig"),r=e.get("Rect"),i=Array.isArray(r)&&r.every((e=>0===e));return a&&i}))}get _xfaStreams(){const e=this.catalog.acroForm;if(!e)return null;const t=e.get("XFA"),a={"xdp:xdp":"",template:"",datasets:"",config:"",connectionSet:"",localeSet:"",stylesheet:"","/xdp:xdp":""};if(t instanceof c.BaseStream&&!t.isEmpty){a["xdp:xdp"]=t;return a}if(!Array.isArray(t)||0===t.length)return null;for(let e=0,r=t.length;e{y.set(e,t)}));const w=[];for(const[e,a]of y){const o=a.get("FontDescriptor");if(!(o instanceof s.Dict))continue;let c=o.get("FontFamily");c=c.replace(/[ ]+(\d)/g,"$1");const l={fontFamily:c,fontWeight:o.get("FontWeight"),italicAngle:-o.get("ItalicAngle")};(0,i.validateCSSFont)(l)&&w.push(u.handleSetFont(r,[s.Name.get(e),1],null,d,t,g,null,l).catch((function(e){(0,n.warn)(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(w);const S=this.xfaFactory.setFonts(f);if(!S)return;h.ignoreErrors=!0;w.length=0;f.length=0;const x=new Set;for(const e of S)(0,o.getXfaFontName)(`${e}-Regular`)||x.add(e);x.size&&S.push("PdfJS-Fallback");for(const e of S)if(!x.has(e))for(const a of[{name:"Regular",fontWeight:400,italicAngle:0},{name:"Bold",fontWeight:700,italicAngle:0},{name:"Italic",fontWeight:400,italicAngle:12},{name:"BoldItalic",fontWeight:700,italicAngle:12}]){const i=`${e}-${a.name}`,c=(0,o.getXfaFontDict)(i);w.push(u.handleSetFont(r,[s.Name.get(i),1],null,d,t,g,c,{fontFamily:e,fontWeight:a.fontWeight,italicAngle:a.italicAngle}).catch((function(e){(0,n.warn)(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(w);this.xfaFactory.appendFonts(f,x)}async serializeXfaData(e){return this.xfaFactory?this.xfaFactory.serializeData(e):null}get formInfo(){const e={hasFields:!1,hasAcroForm:!1,hasXfa:!1,hasSignatures:!1},t=this.catalog.acroForm;if(!t)return(0,n.shadow)(this,"formInfo",e);try{const a=t.get("Fields"),r=Array.isArray(a)&&a.length>0;e.hasFields=r;const n=t.get("XFA");e.hasXfa=Array.isArray(n)&&n.length>0||n instanceof c.BaseStream&&!n.isEmpty;const i=!!(1&t.get("SigFlags")),s=i&&this._hasOnlyDocumentSignatures(a);e.hasAcroForm=r&&!s;e.hasSignatures=i}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.warn)(`Cannot fetch form information: "${e}".`)}return(0,n.shadow)(this,"formInfo",e)}get documentInfo(){let e=this._version;if("string"!=typeof e||!T.test(e)){(0,n.warn)(`Invalid PDF header version number: ${e}`);e=null}const t={PDFFormatVersion:e,Language:this.catalog.lang,EncryptFilterName:this.xref.encrypt?this.xref.encrypt.filterName:null,IsLinearized:!!this.linearization,IsAcroFormPresent:this.formInfo.hasAcroForm,IsXFAPresent:this.formInfo.hasXfa,IsCollectionPresent:!!this.catalog.collection,IsSignaturesPresent:this.formInfo.hasSignatures};let a;try{a=this.xref.trailer.get("Info")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.info)("The document information dictionary is invalid.")}if(!(a instanceof s.Dict))return(0,n.shadow)(this,"documentInfo",t);for(const e of a.getKeys()){const r=a.get(e);switch(e){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof r){t[e]=(0,n.stringToPDFString)(r);continue}break;case"Trapped":if(r instanceof s.Name){t[e]=r;continue}break;default:let a;switch(typeof r){case"string":a=(0,n.stringToPDFString)(r);break;case"number":case"boolean":a=r;break;default:r instanceof s.Name&&(a=r)}if(void 0===a){(0,n.warn)(`Bad value, for custom key "${e}", in Info: ${r}.`);continue}t.Custom||(t.Custom=Object.create(null));t.Custom[e]=a;continue}(0,n.warn)(`Bad value, for key "${e}", in Info: ${r}.`)}return(0,n.shadow)(this,"documentInfo",t)}get fingerprints(){function validate(e){return"string"==typeof e&&e.length>0&&"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"!==e}function hexString(e){const t=[];for(let a=0,r=e.length;anew Page({pdfManager:this.pdfManager,xref:this.xref,pageIndex:e,pageDict:t,ref:r,globalIdFactory:this._globalIdFactory,fontCache:a.fontCache,builtInCMapCache:a.builtInCMapCache,standardFontDataCache:a.standardFontDataCache,globalImageCache:a.globalImageCache,nonBlendModesSet:a.nonBlendModesSet,xfaFactory:n})));this._pagePromises.set(e,i);return i}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof i.XRefEntryException){this._pagePromises.delete(0);await this.cleanup();throw new i.XRefParseException}}}async checkLastPage(e=!1){const{catalog:t,pdfManager:a}=this;t.setActualNumPages();let r;try{await Promise.all([a.ensureDoc("xfaFactory"),a.ensureDoc("linearization"),a.ensureCatalog("numPages")]);if(this.xfaFactory)return;r=this.linearization?this.linearization.numPages:t.numPages;if(!Number.isInteger(r))throw new n.FormatError("Page count is not an integer.");if(r<=1)return;await this.getPage(r-1)}catch(s){this._pagePromises.delete(r-1);await this.cleanup();if(s instanceof i.XRefEntryException&&!e)throw new i.XRefParseException;(0,n.warn)(`checkLastPage - invalid /Pages tree /Count: ${r}.`);let o;try{o=await t.getAllPageDicts(e)}catch(a){if(a instanceof i.XRefEntryException&&!e)throw new i.XRefParseException;t.setActualNumPages(1);return}for(const[e,[r,n]]of o){let i;if(r instanceof Error){i=Promise.reject(r);i.catch((()=>{}))}else i=Promise.resolve(new Page({pdfManager:a,xref:this.xref,pageIndex:e,pageDict:r,ref:n,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalImageCache:t.globalImageCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this._pagePromises.set(e,i)}t.setActualNumPages(o.size)}}fontFallback(e,t){return this.catalog.fontFallback(e,t)}async cleanup(e=!1){return this.catalog?this.catalog.cleanup(e):(0,u.clearGlobalCaches)()}_collectFieldObjects(e,t,a){const i=this.xref.fetchIfRef(t);if(i.has("T")){const t=(0,n.stringToPDFString)(i.get("T"));e=""===e?t:`${e}.${t}`}a.has(e)||a.set(e,[]);a.get(e).push(r.AnnotationFactory.create(this.xref,t,this.pdfManager,this._localIdFactory,!0).then((e=>e&&e.getFieldObject())).catch((function(e){(0,n.warn)(`_collectFieldObjects: "${e}".`);return null})));if(i.has("Kids")){const t=i.get("Kids");for(const r of t)this._collectFieldObjects(e,r,a)}}get fieldObjects(){if(!this.formInfo.hasFields)return(0,n.shadow)(this,"fieldObjects",Promise.resolve(null));const e=Object.create(null),t=new Map;for(const e of this.catalog.acroForm.get("Fields"))this._collectFieldObjects("",e,t);const a=[];for(const[r,n]of t)a.push(Promise.all(n).then((t=>{(t=t.filter((e=>!!e))).length>0&&(e[r]=t)})));return(0,n.shadow)(this,"fieldObjects",Promise.all(a).then((()=>e)))}get hasJSActions(){const e=this.pdfManager.ensureDoc("_parseHasJSActions");return(0,n.shadow)(this,"hasJSActions",e)}async _parseHasJSActions(){const[e,t]=await Promise.all([this.pdfManager.ensureCatalog("jsActions"),this.pdfManager.ensureDoc("fieldObjects")]);return!!e||!!t&&Object.values(t).some((e=>e.some((e=>null!==e.actions))))}get calculationOrderIds(){const e=this.catalog.acroForm;if(!e||!e.has("CO"))return(0,n.shadow)(this,"calculationOrderIds",null);const t=e.get("CO");if(!Array.isArray(t)||0===t.length)return(0,n.shadow)(this,"calculationOrderIds",null);const a=[];for(const e of t)e instanceof s.Ref&&a.push(e.toString());return 0===a.length?(0,n.shadow)(this,"calculationOrderIds",null):(0,n.shadow)(this,"calculationOrderIds",a)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PopupAnnotation=t.MarkupAnnotation=t.AnnotationFactory=t.AnnotationBorderStyle=t.Annotation=void 0;t.getQuadPoints=getQuadPoints;var r=a(2),n=a(6),i=a(13),s=a(5),o=a(65),c=a(7),l=a(60),h=a(69),u=a(14),d=a(72),f=a(75),g=a(62),p=a(10),m=a(76);t.AnnotationFactory=class AnnotationFactory{static create(e,t,a,r,n){return Promise.all([a.ensureCatalog("acroForm"),a.ensureCatalog("baseUrl"),a.ensureDoc("xfaDatasets"),n?this._getPageIndex(e,t,a):-1]).then((([i,s,o,c])=>a.ensure(this,"_create",[e,t,a,r,i,o,n,c])))}static _create(e,t,a,i,o,c,l,h=-1){const u=e.fetchIfRef(t);if(!(u instanceof s.Dict))return;const d=t instanceof s.Ref?t.toString():`annot_${i.createObjId()}`;let f=u.get("Subtype");f=f instanceof s.Name?f.name:null;const g={xref:e,ref:t,dict:u,subtype:f,id:d,pdfManager:a,acroForm:o instanceof s.Dict?o:s.Dict.empty,xfaDatasets:c,collectFields:l,pageIndex:h};switch(f){case"Link":return new LinkAnnotation(g);case"Text":return new TextAnnotation(g);case"Widget":let e=(0,n.getInheritableProperty)({dict:u,key:"FT"});e=e instanceof s.Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(g);case"Btn":return new ButtonWidgetAnnotation(g);case"Ch":return new ChoiceWidgetAnnotation(g);case"Sig":return new SignatureWidgetAnnotation(g)}(0,r.warn)(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(g);case"Popup":return new PopupAnnotation(g);case"FreeText":return new FreeTextAnnotation(g);case"Line":return new LineAnnotation(g);case"Square":return new SquareAnnotation(g);case"Circle":return new CircleAnnotation(g);case"PolyLine":return new PolylineAnnotation(g);case"Polygon":return new PolygonAnnotation(g);case"Caret":return new CaretAnnotation(g);case"Ink":return new InkAnnotation(g);case"Highlight":return new HighlightAnnotation(g);case"Underline":return new UnderlineAnnotation(g);case"Squiggly":return new SquigglyAnnotation(g);case"StrikeOut":return new StrikeOutAnnotation(g);case"Stamp":return new StampAnnotation(g);case"FileAttachment":return new FileAttachmentAnnotation(g);default:l||(f?(0,r.warn)(`Unimplemented annotation type "${f}", falling back to base annotation.`):(0,r.warn)("Annotation is missing the required /Subtype."));return new Annotation(g)}}static async _getPageIndex(e,t,a){try{const r=await e.fetchIfRefAsync(t);if(!(r instanceof s.Dict))return-1;const n=r.getRaw("P");if(!(n instanceof s.Ref))return-1;return await a.ensureCatalog("getPageIndex",[n])}catch(e){(0,r.warn)(`_getPageIndex: "${e}".`);return-1}}static async saveNewAnnotations(e,t,a){const n=e.xref;let i;const c=[],l=[];for(const h of a)switch(h.annotationType){case r.AnnotationEditorType.FREETEXT:if(!i){const e=new s.Dict(n);e.set("BaseFont",s.Name.get("Helvetica"));e.set("Type",s.Name.get("Font"));e.set("Subtype",s.Name.get("Type1"));e.set("Encoding",s.Name.get("WinAnsiEncoding"));const t=[];i=n.getNewRef();(0,o.writeObject)(i,e,t,null);c.push({ref:i,data:t.join("")})}l.push(FreeTextAnnotation.createNewAnnotation(n,h,c,{evaluator:e,task:t,baseFontRef:i}));break;case r.AnnotationEditorType.INK:l.push(InkAnnotation.createNewAnnotation(n,h,c))}return{annotations:await Promise.all(l),dependencies:c}}static async printNewAnnotations(e,t,a){if(!a)return null;const n=e.xref,i=[];for(const s of a)switch(s.annotationType){case r.AnnotationEditorType.FREETEXT:i.push(FreeTextAnnotation.createNewPrintAnnotation(n,s,{evaluator:e,task:t}));break;case r.AnnotationEditorType.INK:i.push(InkAnnotation.createNewPrintAnnotation(n,s))}return Promise.all(i)}};function getRgbColor(e,t=new Uint8ClampedArray(3)){if(!Array.isArray(e))return t;const a=t||new Uint8ClampedArray(3);switch(e.length){case 0:return null;case 1:u.ColorSpace.singletons.gray.getRgbItem(e,0,a,0);return a;case 3:u.ColorSpace.singletons.rgb.getRgbItem(e,0,a,0);return a;case 4:u.ColorSpace.singletons.cmyk.getRgbItem(e,0,a,0);return a;default:return t}}function getQuadPoints(e,t){if(!e.has("QuadPoints"))return null;const a=e.getArray("QuadPoints");if(!Array.isArray(a)||0===a.length||a.length%8>0)return null;const r=[];for(let e=0,n=a.length/8;et[2]||st[3]))return null;r[e].push({x:i,y:s})}}return r.map((e=>{const[t,a,r,n]=e.reduce((([e,t,a,r],n)=>[Math.min(e,n.x),Math.max(t,n.x),Math.min(a,n.y),Math.max(r,n.y)]),[Number.MAX_VALUE,Number.MIN_VALUE,Number.MAX_VALUE,Number.MIN_VALUE]);return[{x:t,y:n},{x:a,y:n},{x:t,y:r},{x:a,y:r}]}))}function getTransformMatrix(e,t,a){const[n,i,s,o]=r.Util.getAxialAlignedBoundingBox(t,a);if(n===s||i===o)return[1,0,0,1,e[0],e[1]];const c=(e[2]-e[0])/(s-n),l=(e[3]-e[1])/(o-i);return[c,0,0,l,e[0]-n*c,e[1]-i*l]}class Annotation{constructor(e){const t=e.dict;this.setTitle(t.get("T"));this.setContents(t.get("Contents"));this.setModificationDate(t.get("M"));this.setFlags(t.get("F"));this.setRectangle(t.getArray("Rect"));this.setColor(t.getArray("C"));this.setBorderStyle(t);this.setAppearance(t);this.setOptionalContent(t);const a=t.get("MK");this.setBorderAndBackgroundColors(a);this.setRotation(a);this._streams=[];this.appearance&&this._streams.push(this.appearance);this.data={annotationFlags:this.flags,borderStyle:this.borderStyle,color:this.color,backgroundColor:this.backgroundColor,borderColor:this.borderColor,rotation:this.rotation,contentsObj:this._contents,hasAppearance:!!this.appearance,id:e.id,modificationDate:this.modificationDate,rect:this.rectangle,subtype:e.subtype,hasOwnCanvas:!1};if(e.collectFields){const a=t.get("Kids");if(Array.isArray(a)){const e=[];for(const t of a)t instanceof s.Ref&&e.push(t.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=(0,n.collectActions)(e.xref,t,r.AnnotationActionEventType);this.data.fieldName=this._constructFieldName(t);this.data.pageIndex=e.pageIndex}this._fallbackFontDict=null}_hasFlag(e,t){return!!(e&t)}_isViewable(e){return!this._hasFlag(e,r.AnnotationFlag.INVISIBLE)&&!this._hasFlag(e,r.AnnotationFlag.NOVIEW)}_isPrintable(e){return this._hasFlag(e,r.AnnotationFlag.PRINT)&&!this._hasFlag(e,r.AnnotationFlag.INVISIBLE)}mustBeViewed(e){const t=e&&e.get(this.data.id);return t&&void 0!==t.hidden?!t.hidden:this.viewable&&!this._hasFlag(this.flags,r.AnnotationFlag.HIDDEN)}mustBePrinted(e){const t=e&&e.get(this.data.id);return t&&void 0!==t.print?t.print:this.printable}get viewable(){return null!==this.data.quadPoints&&(0===this.flags||this._isViewable(this.flags))}get printable(){return null!==this.data.quadPoints&&(0!==this.flags&&this._isPrintable(this.flags))}_parseStringHelper(e){const t="string"==typeof e?(0,r.stringToPDFString)(e):"";return{str:t,dir:t&&"rtl"===(0,l.bidi)(t).dir?"rtl":"ltr"}}setTitle(e){this._title=this._parseStringHelper(e)}setContents(e){this._contents=this._parseStringHelper(e)}setModificationDate(e){this.modificationDate="string"==typeof e?e:null}setFlags(e){this.flags=Number.isInteger(e)&&e>0?e:0}hasFlag(e){return this._hasFlag(this.flags,e)}setRectangle(e){Array.isArray(e)&&4===e.length?this.rectangle=r.Util.normalizeRect(e):this.rectangle=[0,0,0,0]}setColor(e){this.color=getRgbColor(e)}setLineEndings(e){this.lineEndings=["None","None"];if(Array.isArray(e)&&2===e.length)for(let t=0;t<2;t++){const a=e[t];if(a instanceof s.Name)switch(a.name){case"None":continue;case"Square":case"Circle":case"Diamond":case"OpenArrow":case"ClosedArrow":case"Butt":case"ROpenArrow":case"RClosedArrow":case"Slash":this.lineEndings[t]=a.name;continue}(0,r.warn)(`Ignoring invalid lineEnding: ${a}`)}}setRotation(e){this.rotation=0;if(e instanceof s.Dict){let t=e.get("R")||0;if(Number.isInteger(t)&&0!==t){t%=360;t<0&&(t+=360);t%90==0&&(this.rotation=t)}}}setBorderAndBackgroundColors(e){if(e instanceof s.Dict){this.borderColor=getRgbColor(e.getArray("BC"),null);this.backgroundColor=getRgbColor(e.getArray("BG"),null)}else this.borderColor=this.backgroundColor=null}setBorderStyle(e){this.borderStyle=new AnnotationBorderStyle;if(e instanceof s.Dict)if(e.has("BS")){const t=e.get("BS"),a=t.get("Type");if(!a||(0,s.isName)(a,"Border")){this.borderStyle.setWidth(t.get("W"),this.rectangle);this.borderStyle.setStyle(t.get("S"));this.borderStyle.setDashArray(t.getArray("D"))}}else if(e.has("Border")){const t=e.getArray("Border");if(Array.isArray(t)&&t.length>=3){this.borderStyle.setHorizontalCornerRadius(t[0]);this.borderStyle.setVerticalCornerRadius(t[1]);this.borderStyle.setWidth(t[2],this.rectangle);4===t.length&&this.borderStyle.setDashArray(t[3],!0)}}else this.borderStyle.setWidth(0)}setAppearance(e){this.appearance=null;const t=e.get("AP");if(!(t instanceof s.Dict))return;const a=t.get("N");if(a instanceof c.BaseStream){this.appearance=a;return}if(!(a instanceof s.Dict))return;const r=e.get("AS");r instanceof s.Name&&a.has(r.name)&&(this.appearance=a.get(r.name))}setOptionalContent(e){this.oc=null;const t=e.get("OC");t instanceof s.Name?(0,r.warn)("setOptionalContent: Support for /Name-entry is not implemented."):t instanceof s.Dict&&(this.oc=t)}loadResources(e,t){return t.dict.getAsync("Resources").then((t=>{if(!t)return;return new f.ObjectLoader(t,e,t.xref).load().then((function(){return t}))}))}async getOperatorList(e,t,a,n,i){const o=this.data;let c=this.appearance;const l=!!(this.data.hasOwnCanvas&&a&r.RenderingIntentFlag.DISPLAY);if(!c){if(!l)return{opList:new g.OperatorList,separateForm:!1,separateCanvas:!1};c=new p.StringStream("");c.dict=new s.Dict}const h=c.dict,u=await this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"],c),d=h.getArray("BBox")||[0,0,1,1],f=h.getArray("Matrix")||[1,0,0,1,0,0],m=getTransformMatrix(o.rect,d,f),b=new g.OperatorList;let y;this.oc&&(y=await e.parseMarkedContentProps(this.oc,null));void 0!==y&&b.addOp(r.OPS.beginMarkedContentProps,["OC",y]);b.addOp(r.OPS.beginAnnotation,[o.id,o.rect,m,f,l]);await e.getOperatorList({stream:c,task:t,resources:u,operatorList:b,fallbackFontDict:this._fallbackFontDict});b.addOp(r.OPS.endAnnotation,[]);void 0!==y&&b.addOp(r.OPS.endMarkedContent,[]);this.reset();return{opList:b,separateForm:!1,separateCanvas:l}}async save(e,t,a){return null}get hasTextContent(){return!1}async extractTextContent(e,t,a){if(!this.appearance)return;const r=await this.loadResources(["ExtGState","Font","Properties","XObject"],this.appearance),n=[],i=[],s={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items){i.push(t.str);if(t.hasEOL){n.push(i.join(""));i.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:r,includeMarkedContent:!0,combineTextItems:!0,sink:s,viewBox:a});this.reset();i.length&&n.push(i.join(""));n.length>0&&(this.data.textContent=n)}getFieldObject(){return this.data.kidIds?{id:this.data.id,actions:this.data.actions,name:this.data.fieldName,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,type:"",kidIds:this.data.kidIds,page:this.data.pageIndex,rotation:this.rotation}:null}reset(){for(const e of this._streams)e.reset()}_constructFieldName(e){if(!e.has("T")&&!e.has("Parent")){(0,r.warn)("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return(0,r.stringToPDFString)(e.get("T"));const t=[];e.has("T")&&t.unshift((0,r.stringToPDFString)(e.get("T")));let a=e;const n=new s.RefSet;e.objId&&n.put(e.objId);for(;a.has("Parent");){a=a.get("Parent");if(!(a instanceof s.Dict)||a.objId&&n.has(a.objId))break;a.objId&&n.put(a.objId);a.has("T")&&t.unshift((0,r.stringToPDFString)(a.get("T")))}return t.join(".")}}t.Annotation=Annotation;class AnnotationBorderStyle{constructor(){this.width=1;this.style=r.AnnotationBorderStyleType.SOLID;this.dashArray=[3];this.horizontalCornerRadius=0;this.verticalCornerRadius=0}setWidth(e,t=[0,0,0,0]){if(e instanceof s.Name)this.width=0;else if("number"==typeof e){if(e>0){const a=(t[2]-t[0])/2,n=(t[3]-t[1])/2;if(a>0&&n>0&&(e>a||e>n)){(0,r.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`);e=1}}this.width=e}}setStyle(e){if(e instanceof s.Name)switch(e.name){case"S":this.style=r.AnnotationBorderStyleType.SOLID;break;case"D":this.style=r.AnnotationBorderStyleType.DASHED;break;case"B":this.style=r.AnnotationBorderStyleType.BEVELED;break;case"I":this.style=r.AnnotationBorderStyleType.INSET;break;case"U":this.style=r.AnnotationBorderStyleType.UNDERLINE}}setDashArray(e,t=!1){if(Array.isArray(e)&&e.length>0){let a=!0,r=!0;for(const t of e){if(!(+t>=0)){a=!1;break}t>0&&(r=!1)}if(a&&!r){this.dashArray=e;t&&this.setStyle(s.Name.get("D"))}else this.width=0}else e&&(this.width=0)}setHorizontalCornerRadius(e){Number.isInteger(e)&&(this.horizontalCornerRadius=e)}setVerticalCornerRadius(e){Number.isInteger(e)&&(this.verticalCornerRadius=e)}}t.AnnotationBorderStyle=AnnotationBorderStyle;class MarkupAnnotation extends Annotation{constructor(e){super(e);const t=e.dict;if(t.has("IRT")){const e=t.getRaw("IRT");this.data.inReplyTo=e instanceof s.Ref?e.toString():null;const a=t.get("RT");this.data.replyType=a instanceof s.Name?a.name:r.AnnotationReplyType.REPLY}if(this.data.replyType===r.AnnotationReplyType.GROUP){const e=t.get("IRT");this.setTitle(e.get("T"));this.data.titleObj=this._title;this.setContents(e.get("Contents"));this.data.contentsObj=this._contents;if(e.has("CreationDate")){this.setCreationDate(e.get("CreationDate"));this.data.creationDate=this.creationDate}else this.data.creationDate=null;if(e.has("M")){this.setModificationDate(e.get("M"));this.data.modificationDate=this.modificationDate}else this.data.modificationDate=null;this.data.hasPopup=e.has("Popup");if(e.has("C")){this.setColor(e.getArray("C"));this.data.color=this.color}else this.data.color=null}else{this.data.titleObj=this._title;this.setCreationDate(t.get("CreationDate"));this.data.creationDate=this.creationDate;this.data.hasPopup=t.has("Popup");t.has("C")||(this.data.color=null)}t.has("RC")&&(this.data.richText=m.XFAFactory.getRichTextAsHtml(t.get("RC")))}setCreationDate(e){this.creationDate="string"==typeof e?e:null}_setDefaultAppearance({xref:e,extra:t,strokeColor:a,fillColor:r,blendMode:n,strokeAlpha:i,fillAlpha:o,pointsCallback:c}){let l=Number.MAX_VALUE,h=Number.MAX_VALUE,u=Number.MIN_VALUE,d=Number.MIN_VALUE;const f=["q"];t&&f.push(t);a&&f.push(`${a[0]} ${a[1]} ${a[2]} RG`);r&&f.push(`${r[0]} ${r[1]} ${r[2]} rg`);let g=this.data.quadPoints;g||(g=[[{x:this.rectangle[0],y:this.rectangle[3]},{x:this.rectangle[2],y:this.rectangle[3]},{x:this.rectangle[0],y:this.rectangle[1]},{x:this.rectangle[2],y:this.rectangle[1]}]]);for(const e of g){const[t,a,r,n]=c(f,e);l=Math.min(l,t);u=Math.max(u,a);h=Math.min(h,r);d=Math.max(d,n)}f.push("Q");const m=new s.Dict(e),b=new s.Dict(e);b.set("Subtype",s.Name.get("Form"));const y=new p.StringStream(f.join(" "));y.dict=b;m.set("Fm0",y);const w=new s.Dict(e);n&&w.set("BM",s.Name.get(n));"number"==typeof i&&w.set("CA",i);"number"==typeof o&&w.set("ca",o);const S=new s.Dict(e);S.set("GS0",w);const x=new s.Dict(e);x.set("ExtGState",S);x.set("XObject",m);const k=new s.Dict(e);k.set("Resources",x);const C=this.data.rect=[l,h,u,d];k.set("BBox",C);this.appearance=new p.StringStream("/GS0 gs /Fm0 Do");this.appearance.dict=k;this._streams.push(this.appearance,y)}static async createNewAnnotation(e,t,a,r){const n=e.getNewRef(),i=e.getNewRef(),s=this.createNewDict(t,e,{apRef:i}),c=await this.createNewAppearanceStream(t,e,r),l=[];let h=e.encrypt?e.encrypt.createCipherTransform(i.num,i.gen):null;(0,o.writeObject)(i,c,l,h);a.push({ref:i,data:l.join("")});l.length=0;h=e.encrypt?e.encrypt.createCipherTransform(n.num,n.gen):null;(0,o.writeObject)(n,s,l,h);return{ref:n,data:l.join("")}}static async createNewPrintAnnotation(e,t,a){const r=await this.createNewAppearanceStream(t,e,a),n=this.createNewDict(t,e,{ap:r});return new this.prototype.constructor({dict:n,xref:e})}}t.MarkupAnnotation=MarkupAnnotation;class WidgetAnnotation extends Annotation{constructor(e){super(e);const t=e.dict,a=this.data;this.ref=e.ref;a.annotationType=r.AnnotationType.WIDGET;void 0===a.fieldName&&(a.fieldName=this._constructFieldName(t));void 0===a.actions&&(a.actions=(0,n.collectActions)(e.xref,t,r.AnnotationActionEventType));let o=(0,n.getInheritableProperty)({dict:t,key:"V",getArray:!0});a.fieldValue=this._decodeFormValue(o);const c=(0,n.getInheritableProperty)({dict:t,key:"DV",getArray:!0});a.defaultFieldValue=this._decodeFormValue(c);if(void 0===o&&e.xfaDatasets){const t=this._title.str;if(t){this._hasValueFromXFA=!0;a.fieldValue=o=e.xfaDatasets.getValue(t)}}void 0===o&&null!==a.defaultFieldValue&&(a.fieldValue=a.defaultFieldValue);a.alternativeText=(0,r.stringToPDFString)(t.get("TU")||"");const l=(0,n.getInheritableProperty)({dict:t,key:"DA"})||e.acroForm.get("DA");this._defaultAppearance="string"==typeof l?l:"";a.defaultAppearanceData=(0,i.parseDefaultAppearance)(this._defaultAppearance);const h=(0,n.getInheritableProperty)({dict:t,key:"FT"});a.fieldType=h instanceof s.Name?h.name:null;const u=(0,n.getInheritableProperty)({dict:t,key:"DR"}),d=e.acroForm.get("DR"),f=this.appearance&&this.appearance.dict.get("Resources");this._fieldResources={localResources:u,acroFormResources:d,appearanceResources:f,mergedResources:s.Dict.merge({xref:e.xref,dictArray:[u,f,d],mergeSubDicts:!0})};a.fieldFlags=(0,n.getInheritableProperty)({dict:t,key:"Ff"});(!Number.isInteger(a.fieldFlags)||a.fieldFlags<0)&&(a.fieldFlags=0);a.readOnly=this.hasFieldFlag(r.AnnotationFieldFlag.READONLY);a.required=this.hasFieldFlag(r.AnnotationFieldFlag.REQUIRED);a.hidden=this._hasFlag(a.annotationFlags,r.AnnotationFlag.HIDDEN)}_decodeFormValue(e){return Array.isArray(e)?e.filter((e=>"string"==typeof e)).map((e=>(0,r.stringToPDFString)(e))):e instanceof s.Name?(0,r.stringToPDFString)(e.name):"string"==typeof e?(0,r.stringToPDFString)(e):null}hasFieldFlag(e){return!!(this.data.fieldFlags&e)}static _getRotationMatrix(e,t,a){switch(e){case 90:return[0,1,-1,0,t,0];case 180:return[-1,0,0,-1,t,a];case 270:return[0,-1,1,0,0,a];default:throw new Error("Invalid rotation")}}getRotationMatrix(e){const t=e?e.get(this.data.id):void 0;let a=t&&t.rotation;void 0===a&&(a=this.rotation);if(0===a)return r.IDENTITY_MATRIX;const n=this.data.rect[2]-this.data.rect[0],i=this.data.rect[3]-this.data.rect[1];return WidgetAnnotation._getRotationMatrix(a,n,i)}getBorderAndBackgroundAppearances(e){const t=e?e.get(this.data.id):void 0;let a=t&&t.rotation;void 0===a&&(a=this.rotation);if(!this.backgroundColor&&!this.borderColor)return"";const r=this.data.rect[2]-this.data.rect[0],n=this.data.rect[3]-this.data.rect[1],s=0===a||180===a?`0 0 ${r} ${n} re`:`0 0 ${n} ${r} re`;let o="";this.backgroundColor&&(o=`${(0,i.getPdfColor)(this.backgroundColor,!0)} ${s} f `);if(this.borderColor){o+=`${this.borderStyle.width||1} w ${(0,i.getPdfColor)(this.borderColor,!1)} ${s} S `}return o}async getOperatorList(e,t,a,n,i){if(n&&!(this instanceof SignatureWidgetAnnotation))return{opList:new g.OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,a,n,i);const s=await this._getAppearance(e,t,i);if(this.appearance&&null===s)return super.getOperatorList(e,t,a,n,i);const o=new g.OperatorList;if(!this._defaultAppearance||null===s)return{opList:o,separateForm:!1,separateCanvas:!1};const c=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],l=getTransformMatrix(this.data.rect,c,[1,0,0,1,0,0]);let h;this.oc&&(h=await e.parseMarkedContentProps(this.oc,null));void 0!==h&&o.addOp(r.OPS.beginMarkedContentProps,["OC",h]);o.addOp(r.OPS.beginAnnotation,[this.data.id,this.data.rect,l,this.getRotationMatrix(i),!1]);const u=new p.StringStream(s);await e.getOperatorList({stream:u,task:t,resources:this._fieldResources.mergedResources,operatorList:o});o.addOp(r.OPS.endAnnotation,[]);void 0!==h&&o.addOp(r.OPS.endMarkedContent,[]);return{opList:o,separateForm:!1,separateCanvas:!1}}_getMKDict(e){const t=new s.Dict(null);e&&t.set("R",e);this.borderColor&&t.set("BC",Array.from(this.borderColor).map((e=>e/255)));this.backgroundColor&&t.set("BG",Array.from(this.backgroundColor).map((e=>e/255)));return t.size>0?t:null}async save(e,t,a){const n=a?a.get(this.data.id):void 0;let i=n&&n.value,c=n&&n.rotation;if(i===this.data.fieldValue||void 0===i){if(!this._hasValueFromXFA&&void 0===c)return null;i=i||this.data.fieldValue}if(void 0===c&&!this._hasValueFromXFA&&Array.isArray(i)&&Array.isArray(this.data.fieldValue)&&i.length===this.data.fieldValue.length&&i.every(((e,t)=>e===this.data.fieldValue[t])))return null;void 0===c&&(c=this.rotation);let l=await this._getAppearance(e,t,a);if(null===l)return null;const{xref:h}=e,u=h.fetchIfRef(this.ref);if(!(u instanceof s.Dict))return null;const d=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],f={path:(0,r.stringToPDFString)(u.get("T")||""),value:i},g=h.getNewRef(),p=new s.Dict(h);p.set("N",g);const m=h.encrypt;let b=null,y=null;if(m){b=m.createCipherTransform(this.ref.num,this.ref.gen);y=m.createCipherTransform(g.num,g.gen);l=y.encryptString(l)}const encoder=e=>(0,r.isAscii)(e)?e:(0,r.stringToUTF16BEString)(e);u.set("V",Array.isArray(i)?i.map(encoder):encoder(i));u.set("AP",p);u.set("M",`D:${(0,r.getModificationDate)()}`);const w=this._getMKDict(c);w&&u.set("MK",w);const S=new s.Dict(h);S.set("Length",l.length);S.set("Subtype",s.Name.get("Form"));S.set("Resources",this._getSaveFieldResources(h));S.set("BBox",d);const x=this.getRotationMatrix(a);x!==r.IDENTITY_MATRIX&&S.set("Matrix",x);const k=[`${this.ref.num} ${this.ref.gen} obj\n`];(0,o.writeDict)(u,k,b);k.push("\nendobj\n");const C=[`${g.num} ${g.gen} obj\n`];(0,o.writeDict)(S,C,y);C.push(" stream\n",l,"\nendstream\nendobj\n");return[{ref:this.ref,data:k.join(""),xfa:f},{ref:g,data:C.join(""),xfa:null}]}async _getAppearance(e,t,a){if(this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD))return null;const n=a?a.get(this.data.id):void 0;let s,o;if(n){s=n.formattedValue||n.value;o=n.rotation}if(void 0===o&&void 0===s&&(!this._hasValueFromXFA||this.appearance))return null;if(void 0===s){s=this.data.fieldValue;if(!s)return""}Array.isArray(s)&&1===s.length&&(s=s[0]);(0,r.assert)("string"==typeof s,"Expected `value` to be a string.");s=s.trim();if(""===s)return"";void 0===o&&(o=this.rotation);let c=-1;this.data.multiLine&&(c=s.split(/\r\n|\r|\n/).length);let l=this.data.rect[3]-this.data.rect[1],h=this.data.rect[2]-this.data.rect[0];90!==o&&270!==o||([h,l]=[l,h]);this._defaultAppearance||(this.data.defaultAppearanceData=(0,i.parseDefaultAppearance)(this._defaultAppearance="/Helvetica 0 Tf 0 g"));const u=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources),[d,f]=this._computeFontSize(l-2,h-4,s,u,c);let g=u.descent;isNaN(g)&&(g=0);const p=Math.min(Math.floor((l-f)/2),2)+Math.abs(g)*f,m=this.data.textAlignment;if(this.data.multiLine)return this._getMultilineAppearance(d,s,u,f,h,l,m,2,p,a);const b=u.encodeString(s).join("");if(this.data.comb)return this._getCombAppearance(d,u,b,h,2,p,a);const y=this.getBorderAndBackgroundAppearances(a);if(0===m||m>2)return`/Tx BMC q ${y}BT `+d+` 1 0 0 1 2 ${p} Tm (${(0,r.escapeString)(b)}) Tj ET Q EMC`;return`/Tx BMC q ${y}BT `+d+` 1 0 0 1 0 0 Tm ${this._renderText(b,u,f,h,m,2,p)} ET Q EMC`}static async _getFontData(e,t,a,r){const n=new g.OperatorList,i={font:null,clone(){return this}},{fontName:o,fontSize:c}=a;await e.handleSetFont(r,[o&&s.Name.get(o),c],null,n,t,i,null);return i.font}_getTextWidth(e,t){return t.charsToGlyphs(e).reduce(((e,t)=>e+t.width),0)/1e3}_computeFontSize(e,t,a,n,s){let{fontSize:o}=this.data.defaultAppearanceData;if(!o){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===s){const i=this._getTextWidth(a,n);o=roundWithTwoDigits(Math.min(e/r.LINE_FACTOR,t/i))}else{const i=a.split(/\r\n?|\n/),c=[];for(const e of i){const t=n.encodeString(e).join(""),a=n.charsToGlyphs(t),r=n.getCharPositions(t);c.push({line:t,glyphs:a,positions:r})}const isTooBig=a=>{let r=0;for(const i of c){r+=this._splitLine(null,n,a,t,i).length*a;if(r>e)return!0}return!1};o=12;let l=o*r.LINE_FACTOR,h=Math.round(e/l);h=Math.max(h,s);for(;;){l=e/h;o=roundWithTwoDigits(l/r.LINE_FACTOR);if(!isTooBig(o))break;h++}}const{fontName:c,fontColor:l}=this.data.defaultAppearanceData;this._defaultAppearance=(0,i.createDefaultAppearance)({fontSize:o,fontName:c,fontColor:l})}return[this._defaultAppearance,o]}_renderText(e,t,a,i,s,o,c){let l;if(1===s){l=(i-this._getTextWidth(e,t)*a)/2}else if(2===s){l=i-this._getTextWidth(e,t)*a-o}else l=o;l=(0,n.numberToString)(l);return`${l} ${c=(0,n.numberToString)(c)} Td (${(0,r.escapeString)(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:a,acroFormResources:r}=this._fieldResources,n=this.data.defaultAppearanceData&&this.data.defaultAppearanceData.fontName;if(!n)return t||s.Dict.empty;for(const e of[t,a])if(e instanceof s.Dict){const t=e.get("Font");if(t instanceof s.Dict&&t.has(n))return e}if(r instanceof s.Dict){const a=r.get("Font");if(a instanceof s.Dict&&a.has(n)){const r=new s.Dict(e);r.set(n,a.getRaw(n));const i=new s.Dict(e);i.set("Font",r);return s.Dict.merge({xref:e,dictArray:[i,t],mergeSubDicts:!0})}}return t||s.Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this._hasText=!0;const t=e.dict;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let a=(0,n.getInheritableProperty)({dict:t,key:"Q"});(!Number.isInteger(a)||a<0||a>2)&&(a=null);this.data.textAlignment=a;let i=(0,n.getInheritableProperty)({dict:t,key:"MaxLen"});(!Number.isInteger(i)||i<0)&&(i=0);this.data.maxLen=i;this.data.multiLine=this.hasFieldFlag(r.AnnotationFieldFlag.MULTILINE);this.data.comb=this.hasFieldFlag(r.AnnotationFieldFlag.COMB)&&!this.hasFieldFlag(r.AnnotationFieldFlag.MULTILINE)&&!this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD)&&!this.hasFieldFlag(r.AnnotationFieldFlag.FILESELECT)&&0!==this.data.maxLen;this.data.doNotScroll=this.hasFieldFlag(r.AnnotationFieldFlag.DONOTSCROLL)}_getCombAppearance(e,t,a,i,s,o,c){const l=(0,n.numberToString)(i/this.data.maxLen),h=[],u=t.getCharPositions(a);for(const[e,t]of u)h.push(`(${(0,r.escapeString)(a.substring(e,t))}) Tj`);return`/Tx BMC q ${this.getBorderAndBackgroundAppearances(c)}BT `+e+` 1 0 0 1 ${s} ${o} Tm ${h.join(` ${l} 0 Td `)} ET Q EMC`}_getMultilineAppearance(e,t,a,r,n,i,s,o,c,l){const h=t.split(/\r\n?|\n/),u=[],d=n-2*o;for(const e of h){const t=this._splitLine(e,a,r,d);for(const e of t){const t=0===u.length?o:0;u.push(this._renderText(e,a,r,n,s,t,-r))}}const f=u.join("\n");return`/Tx BMC q ${this.getBorderAndBackgroundAppearances(l)}BT `+e+` 1 0 0 1 0 ${i} Tm ${f} ET Q EMC`}_splitLine(e,t,a,r,n={}){e=n.line||t.encodeString(e).join("");const i=n.glyphs||t.charsToGlyphs(e);if(i.length<=1)return[e];const s=n.positions||t.getCharPositions(e),o=a/1e3,c=[];let l=-1,h=-1,u=-1,d=0,f=0;for(let t=0,a=i.length;tr){c.push(e.substring(d,a));d=a;f=p;l=-1;u=-1}else{f+=p;l=a;h=n;u=t}else if(f+p>r)if(-1!==l){c.push(e.substring(d,h));d=h;t=u+1;l=-1;f=0}else{c.push(e.substring(d,a));d=a;f=p}else f+=p}d"Off"!==e));i.length=0;i.push("Off",e)}i.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=i[1];this.checkedAppearance=a.get(this.data.exportValue)||null;this.uncheckedAppearance=a.get("Off")||null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"check");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict}_processRadioButton(e){this.data.fieldValue=this.data.buttonValue=null;const t=e.dict.get("Parent");if(t instanceof s.Dict){this.parent=e.dict.getRaw("Parent");const a=t.get("V");a instanceof s.Name&&(this.data.fieldValue=this._decodeFormValue(a))}const a=e.dict.get("AP");if(!(a instanceof s.Dict))return;const r=a.get("N");if(r instanceof s.Dict){for(const e of r.getKeys())if("Off"!==e){this.data.buttonValue=this._decodeFormValue(e);break}this.checkedAppearance=r.get(this.data.buttonValue)||null;this.uncheckedAppearance=r.get("Off")||null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"disc");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict}}_processPushButton(e){if(e.dict.has("A")||e.dict.has("AA")||this.data.alternativeText){this.data.isTooltipOnly=!e.dict.has("A")&&!e.dict.has("AA");h.Catalog.parseDestDictionary({destDict:e.dict,resultObj:this.data,docBaseUrl:e.pdfManager.docBaseUrl})}else(0,r.warn)("Push buttons without action dictionaries are not supported")}getFieldObject(){let e,t="button";if(this.data.checkBox){t="checkbox";e=this.data.exportValue}else if(this.data.radioButton){t="radiobutton";e=this.data.buttonValue}return{id:this.data.id,value:this.data.fieldValue||"Off",defaultValue:this.data.defaultFieldValue,exportValues:e,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,hidden:this.data.hidden,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:t}}get fallbackFontDict(){const e=new s.Dict;e.set("BaseFont",s.Name.get("ZapfDingbats"));e.set("Type",s.Name.get("FallbackType"));e.set("Subtype",s.Name.get("FallbackType"));e.set("Encoding",s.Name.get("ZapfDingbatsEncoding"));return(0,r.shadow)(this,"fallbackFontDict",e)}}class ChoiceWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.data.options=[];const t=(0,n.getInheritableProperty)({dict:e.dict,key:"Opt"});if(Array.isArray(t)){const a=e.xref;for(let e=0,r=t.length;e0?this.data.fieldValue[0]:null;return{id:this.data.id,value:t,defaultValue:this.data.defaultFieldValue,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,numItems:this.data.fieldValue.length,multipleSelection:this.data.multiSelect,hidden:this.data.hidden,actions:this.data.actions,items:this.data.options,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:e}}async _getAppearance(e,t,a){if(this.data.combo)return super._getAppearance(e,t,a);if(!a)return null;const n=a.get(this.data.id);if(!n)return null;const s=n.rotation;let o=n.value;if(void 0===s&&void 0===o)return null;void 0===o?o=this.data.fieldValue:Array.isArray(o)||(o=[o]);let c=this.data.rect[3]-this.data.rect[1],l=this.data.rect[2]-this.data.rect[0];90!==s&&270!==s||([l,c]=[c,l]);const h=this.data.options.length,u=[];for(let e=0;ea){a=r;t=e}}[f,g]=this._computeFontSize(e,l-4,t,d,-1)}const p=g*r.LINE_FACTOR,m=(p-g)/2,b=Math.floor(c/p);let y;if(1===u.length){const e=u[0];y=e-e%b}else y=u.length?u[0]:0;const w=Math.min(y+b+1,h),S=["/Tx BMC q",`1 1 ${l} ${c} re W n`];if(u.length){S.push("0.600006 0.756866 0.854904 rg");for(const e of u)y<=e&&eC&&(E=C/T);let D=1;const N=r.LINE_FACTOR*u,R=r.LINE_DESCENT_FACTOR*u,L=N*F.length;L>v&&(D=v/L);const j=u*Math.min(E,D),$=["q",`0 0 ${(0,n.numberToString)(C)} ${(0,n.numberToString)(v)} re W n`,"BT",`1 0 0 1 0 ${(0,n.numberToString)(v+R)} Tm 0 Tc ${(0,i.getPdfColor)(h,!0)}`,`/Helv ${(0,n.numberToString)(j)} Tf`],_=(0,n.numberToString)(N);for(const e of M)$.push(`0 -${_} Td (${(0,r.escapeString)(e)}) Tj`);$.push("ET","Q");const U=$.join("\n"),X=new s.Dict(t);X.set("FormType",1);X.set("Subtype",s.Name.get("Form"));X.set("Type",s.Name.get("XObject"));X.set("BBox",[0,0,C,v]);X.set("Length",U.length);X.set("Resources",m);if(f){const e=WidgetAnnotation._getRotationMatrix(f,C,v);X.set("Matrix",e)}const H=new p.StringStream(U);H.dict=X;return H}}class LineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t}=e;this.data.annotationType=r.AnnotationType.LINE;const a=t.getArray("L");this.data.lineCoordinates=r.Util.normalizeRect(a);this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings;if(!this.appearance){const n=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],i=t.get("CA");let s=null,o=t.getArray("IC");if(o){o=getRgbColor(o,null);s=o?Array.from(o).map((e=>e/255)):null}const c=s?i:null,l=this.borderStyle.width||1,h=2*l,u=[this.data.lineCoordinates[0]-h,this.data.lineCoordinates[1]-h,this.data.lineCoordinates[2]+h,this.data.lineCoordinates[3]+h];r.Util.intersect(this.rectangle,u)||(this.rectangle=u);this._setDefaultAppearance({xref:e.xref,extra:`${l} w`,strokeColor:n,fillColor:s,strokeAlpha:i,fillAlpha:c,pointsCallback:(e,t)=>{e.push(`${a[0]} ${a[1]} m`,`${a[2]} ${a[3]} l`,"S");return[t[0].x-l,t[1].x+l,t[3].y-l,t[1].y+l]}})}}}class SquareAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.SQUARE;if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");let r=null,n=e.dict.getArray("IC");if(n){n=getRgbColor(n,null);r=n?Array.from(n).map((e=>e/255)):null}const i=r?a:null;if(0===this.borderStyle.width&&!r)return;this._setDefaultAppearance({xref:e.xref,extra:`${this.borderStyle.width} w`,strokeColor:t,fillColor:r,strokeAlpha:a,fillAlpha:i,pointsCallback:(e,t)=>{const a=t[2].x+this.borderStyle.width/2,n=t[2].y+this.borderStyle.width/2,i=t[3].x-t[2].x-this.borderStyle.width,s=t[1].y-t[3].y-this.borderStyle.width;e.push(`${a} ${n} ${i} ${s} re`);r?e.push("B"):e.push("S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}}class CircleAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.CIRCLE;if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");let r=null,n=e.dict.getArray("IC");if(n){n=getRgbColor(n,null);r=n?Array.from(n).map((e=>e/255)):null}const i=r?a:null;if(0===this.borderStyle.width&&!r)return;const s=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:e.xref,extra:`${this.borderStyle.width} w`,strokeColor:t,fillColor:r,strokeAlpha:a,fillAlpha:i,pointsCallback:(e,t)=>{const a=t[0].x+this.borderStyle.width/2,n=t[0].y-this.borderStyle.width/2,i=t[3].x-this.borderStyle.width/2,o=t[3].y+this.borderStyle.width/2,c=a+(i-a)/2,l=n+(o-n)/2,h=(i-a)/2*s,u=(o-n)/2*s;e.push(`${c} ${o} m`,`${c+h} ${o} ${i} ${l+u} ${i} ${l} c`,`${i} ${l-u} ${c+h} ${n} ${c} ${n} c`,`${c-h} ${n} ${a} ${l-u} ${a} ${l} c`,`${a} ${l+u} ${c-h} ${o} ${c} ${o} c`,"h");r?e.push("B"):e.push("S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}}class PolylineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t}=e;this.data.annotationType=r.AnnotationType.POLYLINE;this.data.vertices=[];if(!(this instanceof PolygonAnnotation)){this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings}const a=t.getArray("Vertices");if(Array.isArray(a)){for(let e=0,t=a.length;ee/255)):[0,0,0],n=t.get("CA"),i=this.borderStyle.width||1,s=2*i,o=[1/0,1/0,-1/0,-1/0];for(const e of this.data.vertices){o[0]=Math.min(o[0],e.x-s);o[1]=Math.min(o[1],e.y-s);o[2]=Math.max(o[2],e.x+s);o[3]=Math.max(o[3],e.y+s)}r.Util.intersect(this.rectangle,o)||(this.rectangle=o);this._setDefaultAppearance({xref:e.xref,extra:`${i} w`,strokeColor:a,strokeAlpha:n,pointsCallback:(e,t)=>{const a=this.data.vertices;for(let t=0,r=a.length;te/255)):[0,0,0],a=e.dict.get("CA"),n=this.borderStyle.width||1,i=2*n,s=[1/0,1/0,-1/0,-1/0];for(const e of this.data.inkLists)for(const t of e){s[0]=Math.min(s[0],t.x-i);s[1]=Math.min(s[1],t.y-i);s[2]=Math.max(s[2],t.x+i);s[3]=Math.max(s[3],t.y+i)}r.Util.intersect(this.rectangle,s)||(this.rectangle=s);this._setDefaultAppearance({xref:e.xref,extra:`${n} w`,strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{for(const t of this.data.inkLists){for(let a=0,r=t.length;ae.points)));l.set("F",4);l.set("Border",[0,0,0]);l.set("Rotate",c);const h=new s.Dict(t);l.set("AP",h);a?h.set("N",a):h.set("N",n);return l}static async createNewAppearanceStream(e,t,a){const{color:r,rect:o,rotation:c,paths:l,thickness:h,opacity:u}=e,[d,f,g,m]=o;let b=g-d,y=m-f;c%180!=0&&([b,y]=[y,b]);const w=[`${h} w 1 J 1 j`,`${(0,i.getPdfColor)(r,!1)}`];1!==u&&w.push("/R0 gs");const S=[];for(const{bezier:e}of l){S.length=0;S.push(`${(0,n.numberToString)(e[0])} ${(0,n.numberToString)(e[1])} m`);for(let t=2,a=e.length;te/255)):[1,1,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,fillColor:t,blendMode:"Multiply",fillAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[0].x} ${t[0].y} m`,`${t[1].x} ${t[1].y} l`,`${t[3].x} ${t[3].y} l`,`${t[2].x} ${t[2].y} l`,"f");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class UnderlineAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.UNDERLINE;if(this.data.quadPoints=getQuadPoints(e.dict,null)){if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[2].x} ${t[2].y} m`,`${t[3].x} ${t[3].y} l`,"S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class SquigglyAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.SQUIGGLY;if(this.data.quadPoints=getQuadPoints(e.dict,null)){if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{const a=(t[0].y-t[2].y)/6;let r=a,n=t[2].x;const i=t[2].y,s=t[3].x;e.push(`${n} ${i+r} m`);do{n+=2;r=0===r?a:0;e.push(`${n} ${i+r} l`)}while(ne/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{e.push((t[0].x+t[2].x)/2+" "+(t[0].y+t[2].y)/2+" m",(t[1].x+t[3].x)/2+" "+(t[1].y+t[3].y)/2+" l","S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class StampAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.STAMP}}class FileAttachmentAnnotation extends MarkupAnnotation{constructor(e){super(e);const t=new d.FileSpec(e.dict.get("FS"),e.xref);this.data.annotationType=r.AnnotationType.FILEATTACHMENT;this.data.file=t.serializable}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.createDefaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:a}){return`/${(0,r.escapePDFName)(t)} ${e} Tf ${getPdfColor(a,!0)}`};t.getPdfColor=getPdfColor;t.parseDefaultAppearance=function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()};var r=a(6),n=a(2),i=a(14),s=a(15),o=a(5),c=a(10);class DefaultAppearanceEvaluator extends s.EvaluatorPreprocessor{constructor(e){super(new c.StringStream(e))}parse(){const e={fn:0,args:[]},t={fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3)};try{for(;;){e.args.length=0;if(!this.read(e))break;if(0!==this.savedStatesDepth)continue;const{fn:a,args:r}=e;switch(0|a){case n.OPS.setFont:const[e,a]=r;e instanceof o.Name&&(t.fontName=e.name);"number"==typeof a&&a>0&&(t.fontSize=a);break;case n.OPS.setFillRGBColor:i.ColorSpace.singletons.rgb.getRgbItem(r,0,t.fontColor,0);break;case n.OPS.setFillGray:i.ColorSpace.singletons.gray.getRgbItem(r,0,t.fontColor,0);break;case n.OPS.setFillColorSpace:i.ColorSpace.singletons.cmyk.getRgbItem(r,0,t.fontColor,0)}}}catch(e){(0,n.warn)(`parseDefaultAppearance - ignoring errors: "${e}".`)}return t}}function getPdfColor(e,t){if(e[0]===e[1]&&e[1]===e[2]){const a=e[0]/255;return`${(0,r.numberToString)(a)} ${t?"g":"G"}`}return Array.from(e).map((e=>(0,r.numberToString)(e/255))).join(" ")+" "+(t?"rg":"RG")}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ColorSpace=void 0;var r=a(2),n=a(5),i=a(7),s=a(6);class ColorSpace{constructor(e,t){this.constructor===ColorSpace&&(0,r.unreachable)("Cannot initialize ColorSpace.");this.name=e;this.numComps=t}getRgb(e,t){const a=new Uint8ClampedArray(3);this.getRgbItem(e,t,a,0);return a}getRgbItem(e,t,a,n){(0,r.unreachable)("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,a,n,i,s,o){(0,r.unreachable)("Should not call ColorSpace.getRgbBuffer")}getOutputLength(e,t){(0,r.unreachable)("Should not call ColorSpace.getOutputLength")}isPassthrough(e){return!1}isDefaultDecode(e,t){return ColorSpace.isDefaultDecode(e,this.numComps)}fillRgb(e,t,a,r,n,i,s,o,c){const l=t*a;let h=null;const u=1<u&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){const t=s<=8?new Uint8Array(u):new Uint16Array(u);for(let e=0;e=.99554525?1:adjustToRange(0,1,1.055*e**(1/2.4)-.055)}function adjustToRange(e,t,a){return Math.max(e,Math.min(t,a))}function decodeL(e){return e<0?-decodeL(-e):e>8?((e+16)/116)**3:.0011070564598794539*e}function convertToRgb(r,c,l,h,u,d){const f=adjustToRange(0,1,c[l]*d),g=adjustToRange(0,1,c[l+1]*d),p=adjustToRange(0,1,c[l+2]*d),m=1===f?1:f**r.GR,b=1===g?1:g**r.GG,y=1===p?1:p**r.GB,w=r.MXA*m+r.MXB*b+r.MXC*y,S=r.MYA*m+r.MYB*b+r.MYC*y,x=r.MZA*m+r.MZB*b+r.MZC*y,k=s;k[0]=w;k[1]=S;k[2]=x;const C=o;!function normalizeWhitePointToFlat(a,r,n){if(1===a[0]&&1===a[2]){n[0]=r[0];n[1]=r[1];n[2]=r[2];return}const s=n;matrixProduct(e,r,s);const o=i;!function convertToFlat(e,t,a){a[0]=1*t[0]/e[0];a[1]=1*t[1]/e[1];a[2]=1*t[2]/e[2]}(a,s,o);matrixProduct(t,o,n)}(r.whitePoint,k,C);const v=s;!function compensateBlackPoint(e,t,a){if(0===e[0]&&0===e[1]&&0===e[2]){a[0]=t[0];a[1]=t[1];a[2]=t[2];return}const r=decodeL(0),n=(1-r)/(1-decodeL(e[0])),i=1-n,s=(1-r)/(1-decodeL(e[1])),o=1-s,c=(1-r)/(1-decodeL(e[2])),l=1-c;a[0]=t[0]*n+i;a[1]=t[1]*s+o;a[2]=t[2]*c+l}(r.blackPoint,C,v);const F=o;!function normalizeWhitePointToD65(a,r,n){const s=n;matrixProduct(e,r,s);const o=i;!function convertToD65(e,t,a){a[0]=.95047*t[0]/e[0];a[1]=1*t[1]/e[1];a[2]=1.08883*t[2]/e[2]}(a,s,o);matrixProduct(t,o,n)}(n,v,F);const O=s;matrixProduct(a,F,O);h[u]=255*sRGBTransferFunction(O[0]);h[u+1]=255*sRGBTransferFunction(O[1]);h[u+2]=255*sRGBTransferFunction(O[2])}return class CalRGBCS extends ColorSpace{constructor(e,t,a,n){super("CalRGB",3);if(!e)throw new r.FormatError("WhitePoint missing - required for color space CalRGB");t=t||new Float32Array(3);a=a||new Float32Array([1,1,1]);n=n||new Float32Array([1,0,0,0,1,0,0,0,1]);const i=e[0],s=e[1],o=e[2];this.whitePoint=e;const c=t[0],l=t[1],h=t[2];this.blackPoint=t;this.GR=a[0];this.GG=a[1];this.GB=a[2];this.MXA=n[0];this.MYA=n[1];this.MZA=n[2];this.MXB=n[3];this.MYB=n[4];this.MZB=n[5];this.MXC=n[6];this.MYC=n[7];this.MZC=n[8];if(i<0||o<0||1!==s)throw new r.FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);if(c<0||l<0||h<0){(0,r.info)(`Invalid BlackPoint for ${this.name} [${c}, ${l}, ${h}], falling back to default.`);this.blackPoint=new Float32Array(3)}if(this.GR<0||this.GG<0||this.GB<0){(0,r.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ${this.name}, falling back to default.`);this.GR=this.GG=this.GB=1}}getRgbItem(e,t,a,r){convertToRgb(this,e,t,a,r,1)}getRgbBuffer(e,t,a,r,n,i,s){const o=1/((1<=6/29?e**3:108/841*(e-4/29);return t}function decode(e,t,a,r){return a+e*(r-a)/t}function convertToRgb(e,t,a,r,n,i){let s=t[a],o=t[a+1],c=t[a+2];if(!1!==r){s=decode(s,r,0,100);o=decode(o,r,e.amin,e.amax);c=decode(c,r,e.bmin,e.bmax)}o>e.amax?o=e.amax:oe.bmax?c=e.bmax:cthis.amax||this.bmin>this.bmax){(0,r.info)("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}getRgbItem(e,t,a,r){convertToRgb(this,e,t,!1,a,r)}getRgbBuffer(e,t,a,r,n,i,s){const o=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.PartialEvaluator=t.EvaluatorPreprocessor=void 0;var r=a(2),n=a(16),i=a(5),s=a(34),o=a(38),c=a(37),l=a(41),h=a(40),u=a(50),d=a(51),f=a(42),g=a(57),p=a(17),m=a(59),b=a(10),y=a(7),w=a(60),S=a(14),x=a(19),k=a(39),C=a(6),v=a(45),F=a(61),O=a(62),T=a(63);const M=Object.freeze({maxImageSize:-1,disableFontFace:!1,ignoreErrors:!1,isEvalSupported:!0,fontExtraProperties:!1,useSystemFonts:!0,cMapUrl:null,standardFontDataUrl:null}),E=1,D=2,N=Promise.resolve();function normalizeBlendMode(e,t=!1){if(Array.isArray(e)){for(let t=0,a=e.length;t0&&e.args[0].count++}class TimeSlotManager{static get TIME_SLOT_DURATION_MS(){return(0,r.shadow)(this,"TIME_SLOT_DURATION_MS",20)}static get CHECK_TIME_EVERY(){return(0,r.shadow)(this,"CHECK_TIME_EVERY",100)}constructor(){this.reset()}check(){if(++this.checkedd){const e="Image exceeded maximum allowed size and was removed.";if(this.options.ignoreErrors){(0,r.warn)(e);return}throw new Error(e)}let f;c.has("OC")&&(f=await this.parseMarkedContentProps(c.get("OC"),e));let g,p;if(c.get("IM","ImageMask")||!1){const e=c.get("I","Interpolate"),a=h+7>>3,o=t.getBytes(a*u),d=c.getArray("D","Decode");if(this.parsingType3Font){g=T.PDFImage.createRawMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof x.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e});g.cached=!!i;p=[g];n.addImageOps(r.OPS.paintImageMaskXObject,p,f);i&&s.set(i,l,{fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f});return}g=T.PDFImage.createMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof x.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e});if(g.isSingleOpaquePixel){n.addImageOps(r.OPS.paintSolidColorImageMask,[],f);i&&s.set(i,l,{fn:r.OPS.paintSolidColorImageMask,args:[],optionalContent:f});return}const m=`mask_${this.idFactory.createObjId()}`;n.addDependency(m);this._sendImgData(m,g);p=[{data:m,width:g.width,height:g.height,interpolate:g.interpolate,count:1}];n.addImageOps(r.OPS.paintImageMaskXObject,p,f);i&&s.set(i,l,{fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f});return}const m=c.get("SM","SMask")||!1,b=c.get("Mask")||!1;if(a&&!m&&!b&&h+u<200){const i=new T.PDFImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o});g=i.createImageData(!0);n.addImageOps(r.OPS.paintInlineImageXObject,[g],f);return}let y=`img_${this.idFactory.createObjId()}`,w=!1;if(this.parsingType3Font)y=`${this.idFactory.getDocId()}_type3_${y}`;else if(l){w=this.globalImageCache.shouldCache(l,this.pageIndex);w&&(y=`${this.idFactory.getDocId()}_${y}`)}n.addDependency(y);p=[y,h,u];T.PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o}).then((e=>{g=e.createImageData(!1);i&&l&&w&&this.globalImageCache.addByteSize(l,g.data.length);return this._sendImgData(y,g,w)})).catch((e=>{(0,r.warn)(`Unable to decode image "${y}": "${e}".`);return this._sendImgData(y,null,w)}));n.addImageOps(r.OPS.paintImageXObject,p,f);if(i){s.set(i,l,{fn:r.OPS.paintImageXObject,args:p,optionalContent:f});if(l){(0,r.assert)(!a,"Cannot cache an inline image globally.");this.globalImageCache.addPageIndex(l,this.pageIndex);w&&this.globalImageCache.setData(l,{objId:y,fn:r.OPS.paintImageXObject,args:p,optionalContent:f,byteSize:0})}}}handleSMask(e,t,a,r,n,i){const s=e.get("G"),o={subtype:e.get("S").name,backdrop:e.get("BC")},c=e.get("TR");if((0,g.isPDFFunction)(c)){const e=this._pdfFunctionFactory.create(c),t=new Uint8Array(256),a=new Float32Array(1);for(let r=0;r<256;r++){a[0]=r/255;e(a,0,a,0);t[r]=255*a[0]|0}o.transferMap=t}return this.buildFormXObject(t,s,o,a,r,n.state.clone(),i)}handleTransferFunction(e){let t;if(Array.isArray(e))t=e;else{if(!(0,g.isPDFFunction)(e))return null;t=[e]}const a=[];let r=0,n=0;for(const e of t){const t=this.xref.fetchIfRef(e);r++;if((0,i.isName)(t,"Identity")){a.push(null);continue}if(!(0,g.isPDFFunction)(t))return null;const s=this._pdfFunctionFactory.create(t),o=new Uint8Array(256),c=new Float32Array(1);for(let e=0;e<256;e++){c[0]=e/255;s(c,0,c,0);o[e]=255*c[0]|0}a.push(o);n++}return 1!==r&&4!==r||0===n?null:a}handleTilingType(e,t,a,n,s,o,c,l){const h=new O.OperatorList,d=i.Dict.merge({xref:this.xref,dictArray:[s.get("Resources"),a]});return this.getOperatorList({stream:n,task:c,resources:d,operatorList:h}).then((function(){const a=h.getIR(),r=(0,u.getTilingPatternIR)(a,s,t);o.addDependencies(h.dependencies);o.addOp(e,r);s.objId&&l.set(null,s.objId,{operatorListIR:a,dict:s})})).catch((e=>{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorTilingPattern});(0,r.warn)(`handleTilingType - ignoring pattern: "${e}".`)}}))}handleSetFont(e,t,a,n,o,c,l=null,h=null){const u=t&&t[0]instanceof i.Name?t[0].name:null;return this.loadFont(u,a,e,l,h).then((t=>t.font.isType3Font?t.loadType3Data(this,e,o).then((function(){n.addDependencies(t.type3Dependencies);return t})).catch((e=>{this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontLoadType3});return new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Type3 font load error: ${e}`),dict:t.font,evaluatorOptions:this.options})})):t)).then((e=>{c.font=e.font;e.send(this.handler);return e.loadedName}))}handleText(e,t){const a=t.font,n=a.charsToGlyphs(e);if(a.data){(!!(t.textRenderingMode&r.TextRenderingMode.ADD_TO_PATH_FLAG)||"Pattern"===t.fillColorSpace.name||a.disableFontFace||this.options.disableFontFace)&&PartialEvaluator.buildFontPaths(a,n,this.handler,this.options)}return n}ensureStateFont(e){if(e.font)return;const t=new r.FormatError("Missing setFont (Tf) operator before text rendering operator.");if(!this.options.ignoreErrors)throw t;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontState});(0,r.warn)(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:a,cacheKey:n,task:s,stateManager:o,localGStateCache:c,localColorSpaceCache:l}){const h=t.objId;let u=!0;const d=[],f=t.getKeys();let g=Promise.resolve();for(let n=0,c=f.length;nthis.handleSetFont(e,null,h[0],a,s,o.state).then((function(e){a.addDependency(e);d.push([c,[e,h[1]]])}))));break;case"BM":d.push([c,normalizeBlendMode(h)]);break;case"SMask":if((0,i.isName)(h,"None")){d.push([c,!1]);break}if(h instanceof i.Dict){u=!1;g=g.then((()=>this.handleSMask(h,e,a,s,o,l)));d.push([c,!0])}else(0,r.warn)("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(h);d.push([c,t]);break;case"OP":case"op":case"OPM":case"BG":case"BG2":case"UCR":case"UCR2":case"TR2":case"HT":case"SM":case"SA":case"AIS":case"TK":(0,r.info)("graphic state operator "+c);break;default:(0,r.info)("Unknown graphic state operator "+c)}}return g.then((function(){d.length>0&&a.addOp(r.OPS.setGState,[d]);u&&c.set(n,h,d)}))}loadFont(e,t,a,n=null,c=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Font "${e}" is not available.`),dict:t,evaluatorOptions:this.options}),l=this.xref;let h;if(t)t instanceof i.Ref&&(h=t);else{const t=a.get("Font");t&&(h=t.getRaw(e))}if(!h){const a=`Font "${e||t&&t.toString()}" is not available`;if(!this.options.ignoreErrors&&!this.parsingType3Font){(0,r.warn)(`${a}.`);return errorFont()}this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontMissing});(0,r.warn)(`${a} -- attempting to fallback to a default font.`);h=n||PartialEvaluator.fallbackFontDict}if(this.parsingType3Font&&this.type3FontRefs.has(h))return errorFont();if(this.fontCache.has(h))return this.fontCache.get(h);if(!((t=l.fetchIfRef(h))instanceof i.Dict))return errorFont();if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const u=(0,r.createPromiseCapability)();let d;try{d=this.preEvaluateFont(t);d.cssFontInfo=c}catch(e){(0,r.warn)(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:f,hash:g}=d,p=h instanceof i.Ref;let m;p&&(m=`f${h.toString()}`);if(g&&f instanceof i.Dict){f.fontAliases||(f.fontAliases=Object.create(null));const e=f.fontAliases;if(e[g]){const t=e[g].aliasRef;if(p&&t&&this.fontCache.has(t)){this.fontCache.putAlias(h,t);return this.fontCache.get(h)}}else e[g]={fontID:this.idFactory.createFontId()};p&&(e[g].aliasRef=h);m=e[g].fontID}if(p)this.fontCache.put(h,u.promise);else{m||(m=this.idFactory.createFontId());t.cacheKey=`cacheKey_${m}`;this.fontCache.put(t.cacheKey,u.promise)}(0,r.assert)(m&&m.startsWith("f"),'The "fontID" must be (correctly) defined.');t.loadedName=`${this.idFactory.getDocId()}_${m}`;this.translateFont(d).then((e=>{void 0!==e.fontType&&l.stats.addFontType(e.fontType);u.resolve(new TranslatedFont({loadedName:t.loadedName,font:e,dict:t,evaluatorOptions:this.options}))})).catch((e=>{this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontTranslate});(0,r.warn)(`loadFont - translateFont failed: "${e}".`);try{const e=f&&f.get("FontFile3"),t=e&&e.get("Subtype"),a=(0,o.getFontType)(d.type,t&&t.name);void 0!==a&&l.stats.addFontType(a)}catch(e){}u.resolve(new TranslatedFont({loadedName:t.loadedName,font:new s.ErrorFont(e instanceof Error?e.message:e),dict:t,evaluatorOptions:this.options}))}));return u.promise}buildPath(e,t,a,n=!1){const i=e.length-1;a||(a=[]);let s;if(i<0||e.fnArray[i]!==r.OPS.constructPath){if(n){(0,r.warn)(`Encountered path operator "${t}" inside of a text object.`);e.addOp(r.OPS.save,null)}s=[1/0,-1/0,1/0,-1/0];e.addOp(r.OPS.constructPath,[[t],a,s]);n&&e.addOp(r.OPS.restore,null)}else{const r=e.argsArray[i];r[0].push(t);Array.prototype.push.apply(r[1],a);s=r[2]}switch(t){case r.OPS.rectangle:s[0]=Math.min(s[0],a[0],a[0]+a[2]);s[1]=Math.max(s[1],a[0],a[0]+a[2]);s[2]=Math.min(s[2],a[1],a[1]+a[3]);s[3]=Math.max(s[3],a[1],a[1]+a[3]);break;case r.OPS.moveTo:case r.OPS.lineTo:s[0]=Math.min(s[0],a[0]);s[1]=Math.max(s[1],a[0]);s[2]=Math.min(s[2],a[1]);s[3]=Math.max(s[3],a[1])}}parseColorSpace({cs:e,resources:t,localColorSpaceCache:a}){return S.ColorSpace.parseAsync({cs:e,xref:this.xref,resources:t,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:a}).catch((e=>{if(e instanceof r.AbortException)return null;if(this.options.ignoreErrors){this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorColorSpace});(0,r.warn)(`parseColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}))}parseShading({shading:e,resources:t,localColorSpaceCache:a,localShadingPatternCache:r}){let n=r.get(e);if(!n){const i=u.Pattern.parseShading(e,this.xref,t,this.handler,this._pdfFunctionFactory,a).getIR();n=`pattern_${this.idFactory.createObjId()}`;r.set(e,n);this.handler.send("obj",[n,this.pageIndex,"Pattern",i])}return n}handleColorN(e,t,a,n,s,o,c,l,h,d){const f=a.pop();if(f instanceof i.Name){const g=s.getRaw(f.name),p=g instanceof i.Ref&&h.getByRef(g);if(p)try{const r=n.base?n.base.getRgb(a,0):null,i=(0,u.getTilingPatternIR)(p.operatorListIR,p.dict,r);e.addOp(t,i);return}catch(e){}const m=this.xref.fetchIfRef(g);if(m){const i=m instanceof y.BaseStream?m.dict:m,s=i.get("PatternType");if(s===E){const r=n.base?n.base.getRgb(a,0):null;return this.handleTilingType(t,r,o,m,i,e,c,h)}if(s===D){const a=i.get("Shading"),r=i.getArray("Matrix"),n=this.parseShading({shading:a,resources:o,localColorSpaceCache:l,localShadingPatternCache:d});e.addOp(t,["Shading",n,r]);return}throw new r.FormatError(`Unknown PatternType: ${s}`)}}throw new r.FormatError(`Unknown PatternName: ${f}`)}_parseVisibilityExpression(e,t,a){if(++t>10){(0,r.warn)("Visibility expression is too deeply nested");return}const n=e.length,s=this.xref.fetchIfRef(e[0]);if(!(n<2)&&s instanceof i.Name){switch(s.name){case"And":case"Or":case"Not":a.push(s.name);break;default:(0,r.warn)(`Invalid operator ${s.name} in visibility expression`);return}for(let r=1;r0)return{type:"OCMD",expression:t}}const t=a.get("OCGs");if(Array.isArray(t)||t instanceof i.Dict){const e=[];if(Array.isArray(t))for(const a of t)e.push(a.toString());else e.push(t.objId);return{type:n,ids:e,policy:a.get("P")instanceof i.Name?a.get("P").name:null,expression:null}}if(t instanceof i.Ref)return{type:n,id:t.toString()}}return null}getOperatorList({stream:e,task:t,resources:a,operatorList:n,initialState:s=null,fallbackFontDict:o=null}){a=a||i.Dict.empty;s=s||new EvalState;if(!n)throw new Error('getOperatorList: missing "operatorList" parameter');const c=this,l=this.xref;let h=!1;const u=new m.LocalImageCache,d=new m.LocalColorSpaceCache,f=new m.LocalGStateCache,g=new m.LocalTilingPatternCache,p=new Map,b=a.get("XObject")||i.Dict.empty,w=a.get("Pattern")||i.Dict.empty,x=new StateManager(s),k=new EvaluatorPreprocessor(e,l,x),C=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=k.savedStatesDepth;e0&&n.addOp(r.OPS.setGState,[t]);e=null;continue}}next(new Promise((function(e,s){if(!E)throw new r.FormatError("GState must be referred to by name.");const o=a.get("ExtGState");if(!(o instanceof i.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const l=o.get(M);if(!(l instanceof i.Dict))throw new r.FormatError("GState should be a dictionary.");c.setGState({resources:a,gState:l,operatorList:n,cacheKey:M,task:t,stateManager:x,localGStateCache:f,localColorSpaceCache:d}).then(e,s)})).catch((function(e){if(!(e instanceof r.AbortException)){if(!c.options.ignoreErrors)throw e;c.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorExtGState});(0,r.warn)(`getOperatorList - ignoring ExtGState: "${e}".`)}})));return;case r.OPS.moveTo:case r.OPS.lineTo:case r.OPS.curveTo:case r.OPS.curveTo2:case r.OPS.curveTo3:case r.OPS.closePath:case r.OPS.rectangle:c.buildPath(n,s,e,h);continue;case r.OPS.markPoint:case r.OPS.markPointProps:case r.OPS.beginCompat:case r.OPS.endCompat:continue;case r.OPS.beginMarkedContentProps:if(!(e[0]instanceof i.Name)){(0,r.warn)(`Expected name for beginMarkedContentProps arg0=${e[0]}`);continue}if("OC"===e[0].name){next(c.parseMarkedContentProps(e[1],a).then((e=>{n.addOp(r.OPS.beginMarkedContentProps,["OC",e])})).catch((e=>{if(!(e instanceof r.AbortException)){if(!c.options.ignoreErrors)throw e;c.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorMarkedContent});(0,r.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`)}})));return}e=[e[0].name,e[1]instanceof i.Dict?e[1].get("MCID"):null];break;case r.OPS.beginMarkedContent:case r.OPS.endMarkedContent:default:if(null!==e){for(F=0,O=e.length;F{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorOperatorList});(0,r.warn)(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`);closePendingRestoreOPS()}}))}getTextContent({stream:e,task:t,resources:a,stateManager:n=null,combineTextItems:s=!1,includeMarkedContent:o=!1,sink:c,seenStyles:l=new Set,viewBox:u}){a=a||i.Dict.empty;n=n||new StateManager(new TextState);const d=(0,h.getNormalizedUnicodes)(),f={items:[],styles:Object.create(null)},g={initialized:!1,str:[],totalWidth:0,totalHeight:0,width:0,height:0,vertical:!1,prevTransform:null,textAdvanceScale:0,spaceInFlowMin:0,spaceInFlowMax:0,trackingSpaceMin:1/0,negativeSpaceMax:-1/0,notASpace:-1/0,transform:null,fontName:null,hasEOL:!1},p=[" "," "];let b=0;function saveLastChar(e){const t=(b+1)%2,a=" "!==p[b]&&" "===p[t];p[b]=e;b=t;return a}function resetLastChars(){p[0]=p[1]=" ";b=0}const S=this,x=this.xref,k=[];let C=null;const v=new m.LocalImageCache,F=new m.LocalGStateCache,O=new EvaluatorPreprocessor(e,x,n);let T;function getCurrentTextTransform(){const e=T.font,t=[T.fontSize*T.textHScale,0,0,T.fontSize,0,T.textRise];if(e.isType3Font&&(T.fontSize<=1||e.isCharBBox)&&!(0,r.isArrayEqual)(T.fontMatrix,r.FONT_IDENTITY_MATRIX)){const a=e.bbox[3]-e.bbox[1];a>0&&(t[3]*=a*T.fontMatrix[3])}return r.Util.transform(T.ctm,r.Util.transform(T.textMatrix,t))}function ensureTextContentItem(){if(g.initialized)return g;const e=T.font,t=e.loadedName;if(!l.has(t)){l.add(t);f.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical}}g.fontName=t;const a=g.transform=getCurrentTextTransform();if(e.vertical){g.width=g.totalWidth=Math.hypot(a[0],a[1]);g.height=g.totalHeight=0;g.vertical=!0}else{g.width=g.totalWidth=0;g.height=g.totalHeight=Math.hypot(a[2],a[3]);g.vertical=!1}const r=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),n=Math.hypot(T.ctm[0],T.ctm[1]);g.textAdvanceScale=n*r;g.trackingSpaceMin=.1*T.fontSize;g.notASpace=.03*T.fontSize;g.negativeSpaceMax=-.2*T.fontSize;g.spaceInFlowMin=.1*T.fontSize;g.spaceInFlowMax=.6*T.fontSize;g.hasEOL=!1;g.initialized=!0;return g}function updateAdvanceScale(){if(!g.initialized)return;const e=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),t=Math.hypot(T.ctm[0],T.ctm[1])*e;if(t!==g.textAdvanceScale){if(g.vertical){g.totalHeight+=g.height*g.textAdvanceScale;g.height=0}else{g.totalWidth+=g.width*g.textAdvanceScale;g.width=0}g.textAdvanceScale=t}}function handleSetFont(e,n){return S.loadFont(e,n,a).then((function(e){return e.font.isType3Font?e.loadType3Data(S,a,t).catch((function(){})).then((function(){return e})):e})).then((function(e){T.font=e.font;T.fontMatrix=e.font.fontMatrix||r.FONT_IDENTITY_MATRIX}))}function applyInverseRotation(e,t,a){const r=Math.hypot(a[0],a[1]);return[(a[0]*e+a[1]*t)/r,(a[2]*e+a[3]*t)/r]}function compareWithLastPosition(){const e=getCurrentTextTransform();let t=e[4],a=e[5];const r=t-u[0],n=a-u[1];if(r<0||r>u[2]||n<0||n>u[3])return!1;if(!s||!T.font||!g.prevTransform)return!0;let i=g.prevTransform[4],o=g.prevTransform[5];if(i===t&&o===a)return!0;let c=-1;e[0]&&0===e[1]&&0===e[2]?c=e[0]>0?0:180:e[1]&&0===e[0]&&0===e[3]&&(c=e[1]>0?90:270);switch(c){case 0:break;case 90:[t,a]=[a,t];[i,o]=[o,i];break;case 180:[t,a,i,o]=[-t,-a,-i,-o];break;case 270:[t,a]=[-a,-t];[i,o]=[-o,-i];break;default:[t,a]=applyInverseRotation(t,a,e);[i,o]=applyInverseRotation(i,o,g.prevTransform)}if(T.font.vertical){const e=(o-a)/g.textAdvanceScale,r=t-i,n=Math.sign(g.height);if(e.5*g.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(r)>g.width){appendEOL();return!0}e<=n*g.notASpace&&resetLastChars();if(e<=n*g.trackingSpaceMin)g.height+=e;else if(!addFakeSpaces(e,g.prevTransform,n))if(0===g.str.length){resetLastChars();f.items.push({str:" ",dir:"ltr",width:0,height:Math.abs(e),transform:g.prevTransform,fontName:g.fontName,hasEOL:!1})}else g.height+=e;return!0}const l=(t-i)/g.textAdvanceScale,h=a-o,d=Math.sign(g.width);if(l.5*g.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(h)>g.height){appendEOL();return!0}l<=d*g.notASpace&&resetLastChars();if(l<=d*g.trackingSpaceMin)g.width+=l;else if(!addFakeSpaces(l,g.prevTransform,d))if(0===g.str.length){resetLastChars();f.items.push({str:" ",dir:"ltr",width:Math.abs(l),height:0,transform:g.prevTransform,fontName:g.fontName,hasEOL:!1})}else g.width+=l;return!0}function buildTextContentItem({chars:e,extraSpacing:t}){const a=T.font;if(!e){const e=T.charSpacing+t;e&&(a.vertical?T.translateTextMatrix(0,-e):T.translateTextMatrix(e*T.textHScale,0));return}const r=a.charsToGlyphs(e),n=T.fontMatrix[0]*T.fontSize;for(let e=0,i=r.length;e0){const e=k.join("");k.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case r.OPS.showText:if(!n.state.font){S.ensureStateFont(n.state);continue}buildTextContentItem({chars:p[0],extraSpacing:0});break;case r.OPS.nextLineShowText:if(!n.state.font){S.ensureStateFont(n.state);continue}T.carriageReturn();buildTextContentItem({chars:p[0],extraSpacing:0});break;case r.OPS.nextLineSetSpacingShowText:if(!n.state.font){S.ensureStateFont(n.state);continue}T.wordSpacing=p[0];T.charSpacing=p[1];T.carriageReturn();buildTextContentItem({chars:p[2],extraSpacing:0});break;case r.OPS.paintXObject:flushTextContentItem();C||(C=a.get("XObject")||i.Dict.empty);var w=p[0]instanceof i.Name,E=p[0].name;if(w&&v.getByName(E))break;next(new Promise((function(e,h){if(!w)throw new r.FormatError("XObject must be referred to by name.");let d=C.getRaw(E);if(d instanceof i.Ref){if(v.getByRef(d)){e();return}if(S.globalImageCache.getData(d,S.pageIndex)){e();return}d=x.fetch(d)}if(!(d instanceof y.BaseStream))throw new r.FormatError("XObject should be a stream");const f=d.dict.get("Subtype");if(!(f instanceof i.Name))throw new r.FormatError("XObject should have a Name subtype");if("Form"!==f.name){v.set(E,d.dict.objId,!0);e();return}const g=n.state.clone(),p=new StateManager(g),m=d.dict.getArray("Matrix");Array.isArray(m)&&6===m.length&&p.transform(m);enqueueChunk();const b={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;c.enqueue(e,t)},get desiredSize(){return c.desiredSize},get ready(){return c.ready}};S.getTextContent({stream:d,task:t,resources:d.dict.get("Resources")||a,stateManager:p,combineTextItems:s,includeMarkedContent:o,sink:b,seenStyles:l,viewBox:u}).then((function(){b.enqueueInvoked||v.set(E,d.dict.objId,!0);e()}),h)})).catch((function(e){if(!(e instanceof r.AbortException)){if(!S.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring XObject: "${e}".`)}})));return;case r.OPS.setGState:w=p[0]instanceof i.Name;E=p[0].name;if(w&&F.getByName(E))break;next(new Promise((function(e,t){if(!w)throw new r.FormatError("GState must be referred to by name.");const n=a.get("ExtGState");if(!(n instanceof i.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const s=n.get(E);if(!(s instanceof i.Dict))throw new r.FormatError("GState should be a dictionary.");const o=s.get("Font");if(o){flushTextContentItem();T.fontName=null;T.fontSize=o[1];handleSetFont(null,o[0]).then(e,t)}else{F.set(E,s.objId,!0);e()}})).catch((function(e){if(!(e instanceof r.AbortException)){if(!S.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring ExtGState: "${e}".`)}})));return;case r.OPS.beginMarkedContent:flushTextContentItem();o&&f.items.push({type:"beginMarkedContent",tag:p[0]instanceof i.Name?p[0].name:null});break;case r.OPS.beginMarkedContentProps:flushTextContentItem();if(o){let e=null;p[1]instanceof i.Dict&&(e=p[1].get("MCID"));f.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${S.idFactory.getPageObjId()}_mcid${e}`:null,tag:p[0]instanceof i.Name?p[0].name:null})}break;case r.OPS.endMarkedContent:flushTextContentItem();o&&f.items.push({type:"endMarkedContent"})}if(f.items.length>=c.desiredSize){g=!0;break}}if(g)next(N);else{flushTextContentItem();enqueueChunk();e()}})).catch((e=>{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring errors during "${t.name}" task: "${e}".`);flushTextContentItem();enqueueChunk()}}))}extractDataStructures(e,t,a){const n=this.xref;let s;const l=this.readToUnicode(a.toUnicode||e.get("ToUnicode")||t.get("ToUnicode"));if(a.composite){const t=e.get("CIDSystemInfo");t instanceof i.Dict&&(a.cidSystemInfo={registry:(0,r.stringToPDFString)(t.get("Registry")),ordering:(0,r.stringToPDFString)(t.get("Ordering")),supplement:t.get("Supplement")});try{const t=e.get("CIDToGIDMap");t instanceof y.BaseStream&&(s=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const h=[];let u,d=null;if(e.has("Encoding")){u=e.get("Encoding");if(u instanceof i.Dict){d=u.get("BaseEncoding");d=d instanceof i.Name?d.name:null;if(u.has("Differences")){const e=u.get("Differences");let t=0;for(let a=0,s=e.length;a0;a.dict=e;return l.then((e=>{a.toUnicode=e;return this.buildToUnicode(a)})).then((e=>{a.toUnicode=e;s&&(a.cidToGidMap=this.readCidToGidMap(s,e));return a}))}_simpleFontToUnicode(e,t=!1){(0,r.assert)(!e.composite,"Must be a simple font.");const a=[],n=e.defaultEncoding.slice(),i=e.baseEncodingName,s=e.differences;for(const e in s){const t=s[e];".notdef"!==t&&(n[e]=t)}const o=(0,k.getGlyphsUnicode)();for(const r in n){let s=n[r];if(""!==s)if(void 0!==o[s])a[r]=String.fromCharCode(o[s]);else{let n=0;switch(s[0]){case"G":3===s.length&&(n=parseInt(s.substring(1),16));break;case"g":5===s.length&&(n=parseInt(s.substring(1),16));break;case"C":case"c":if(s.length>=3&&s.length<=4){const a=s.substring(1);if(t){n=parseInt(a,16);break}n=+a;if(Number.isNaN(n)&&Number.isInteger(parseInt(a,16)))return this._simpleFontToUnicode(e,!0)}break;default:const a=(0,h.getUnicodeForGlyph)(s,o);-1!==a&&(n=a)}if(n>0&&n<=1114111&&Number.isInteger(n)){if(i&&n===+r){const e=(0,c.getEncoding)(i);if(e&&(s=e[r])){a[r]=String.fromCharCode(o[s]);continue}}a[r]=String.fromCodePoint(n)}}}return a}async buildToUnicode(e){e.hasIncludedToUnicodeMap=!!e.toUnicode&&e.toUnicode.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._simpleFontToUnicode(e));return e.toUnicode}if(!e.composite)return new f.ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof n.IdentityCMap)||"Adobe"===e.cidSystemInfo.registry&&("GB1"===e.cidSystemInfo.ordering||"CNS1"===e.cidSystemInfo.ordering||"Japan1"===e.cidSystemInfo.ordering||"Korea1"===e.cidSystemInfo.ordering))){const{registry:t,ordering:a}=e.cidSystemInfo,s=i.Name.get(`${t}-${a}-UCS2`),o=await n.CMapFactory.create({encoding:s,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),c=[];e.cMap.forEach((function(e,t){if(t>65535)throw new r.FormatError("Max size of CID is 65,535");const a=o.lookup(t);a&&(c[e]=String.fromCharCode((a.charCodeAt(0)<<8)+a.charCodeAt(1)))}));return new f.ToUnicodeMap(c)}return new f.IdentityToUnicodeMap(e.firstChar,e.lastChar)}readToUnicode(e){return e?e instanceof i.Name?n.CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}).then((function(e){return e instanceof n.IdentityCMap?new f.IdentityToUnicodeMap(0,65535):new f.ToUnicodeMap(e.getMap())})):e instanceof y.BaseStream?n.CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}).then((function(e){if(e instanceof n.IdentityCMap)return new f.IdentityToUnicodeMap(0,65535);const t=new Array(e.length);e.forEach((function(e,a){if("number"==typeof a){t[e]=String.fromCodePoint(a);return}const r=[];for(let e=0;e{if(e instanceof r.AbortException)return null;if(this.options.ignoreErrors){this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontToUnicode});(0,r.warn)(`readToUnicode - ignoring ToUnicode data: "${e}".`);return null}throw e})):Promise.resolve(null):Promise.resolve(null)}readCidToGidMap(e,t){const a=[];for(let r=0,n=e.length;r>1;(0!==n||t.has(i))&&(a[i]=n)}return a}extractWidths(e,t,a){const r=this.xref;let n=[],s=0;const c=[];let l,h,u,d,f,g,p,m;if(a.composite){s=e.has("DW")?e.get("DW"):1e3;m=e.get("W");if(m)for(h=0,u=m.length;h{if(p){const e=[];let a=u;for(let t=0,r=p.length;t{this.extractWidths(t,e,a);return new s.Font(v.name,w,a)}))}static buildFontPaths(e,t,a,n){function buildPath(t){const i=`${e.loadedName}_path_${t}`;try{if(e.renderer.hasBuiltPath(t))return;a.send("commonobj",[i,"FontPath",e.renderer.getPathJs(t)])}catch(e){if(n.ignoreErrors){a.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontBuildPath});(0,r.warn)(`buildFontPaths - ignoring ${i} glyph: "${e}".`);return}throw e}}for(const e of t){buildPath(e.fontChar);const t=e.accent;t&&t.fontChar&&buildPath(t.fontChar)}}static get fallbackFontDict(){const e=new i.Dict;e.set("BaseFont",i.Name.get("PDFJS-FallbackFont"));e.set("Type",i.Name.get("FallbackType"));e.set("Subtype",i.Name.get("FallbackType"));e.set("Encoding",i.Name.get("WinAnsiEncoding"));return(0,r.shadow)(this,"fallbackFontDict",e)}}t.PartialEvaluator=PartialEvaluator;class TranslatedFont{constructor({loadedName:e,font:t,dict:a,evaluatorOptions:r}){this.loadedName=e;this.font=t;this.dict=a;this._evaluatorOptions=r||M;this.type3Loaded=null;this.type3Dependencies=t.isType3Font?new Set:null;this.sent=!1}send(e){if(!this.sent){this.sent=!0;e.send("commonobj",[this.loadedName,"Font",this.font.exportData(this._evaluatorOptions.fontExtraProperties)])}}fallback(e){if(this.font.data){this.font.disableFontFace=!0;PartialEvaluator.buildFontPaths(this.font,this.font.glyphCacheValues,e,this._evaluatorOptions)}}loadType3Data(e,t,a){if(this.type3Loaded)return this.type3Loaded;if(!this.font.isType3Font)throw new Error("Must be a Type3 font.");const n=e.clone({ignoreErrors:!1});n.parsingType3Font=!0;const s=new i.RefSet(e.type3FontRefs);this.dict.objId&&!s.has(this.dict.objId)&&s.put(this.dict.objId);n.type3FontRefs=s;const o=this.font,c=this.type3Dependencies;let l=Promise.resolve();const h=this.dict.get("CharProcs"),u=this.dict.get("Resources")||t,d=Object.create(null),f=r.Util.normalizeRect(o.bbox||[0,0,0,0]),g=f[2]-f[0],p=f[3]-f[1],m=Math.hypot(g,p);for(const e of h.getKeys())l=l.then((()=>{const t=h.get(e),i=new O.OperatorList;return n.getOperatorList({stream:t,task:a,resources:u,operatorList:i}).then((()=>{i.fnArray[0]===r.OPS.setCharWidthAndBounds&&this._removeType3ColorOperators(i,m);d[e]=i.getIR();for(const e of i.dependencies)c.add(e)})).catch((function(t){(0,r.warn)(`Type3 font resource "${e}" is not available.`);const a=new O.OperatorList;d[e]=a.getIR()}))}));this.type3Loaded=l.then((()=>{o.charProcOperatorList=d;if(this._bbox){o.isCharBBox=!0;o.bbox=this._bbox}}));return this.type3Loaded}_removeType3ColorOperators(e,t=NaN){const a=r.Util.normalizeRect(e.argsArray[0].slice(2)),n=a[2]-a[0],i=a[3]-a[1],s=Math.hypot(n,i);if(0===n||0===i){e.fnArray.splice(0,1);e.argsArray.splice(0,1)}else if(0===t||Math.round(s/t)>=10){this._bbox||(this._bbox=[1/0,1/0,-1/0,-1/0]);this._bbox[0]=Math.min(this._bbox[0],a[0]);this._bbox[1]=Math.min(this._bbox[1],a[1]);this._bbox[2]=Math.max(this._bbox[2],a[2]);this._bbox[3]=Math.max(this._bbox[3],a[3])}let o=0,c=e.length;for(;o=r.OPS.moveTo&&s<=r.OPS.endPath;if(i.variableArgs)c>o&&(0,r.info)(`Command ${n}: expected [0, ${o}] args, but received ${c} args.`);else{if(c!==o){const e=this.nonProcessedArgs;for(;c>o;){e.push(t.shift());c--}for(;cEvaluatorPreprocessor.MAX_INVALID_PATH_OPS)throw new r.FormatError(`Invalid ${e}`);(0,r.warn)(`Skipping ${e}`);null!==t&&(t.length=0);continue}}this.preprocessCommand(s,t);e.fn=s;e.args=t;return!0}if(a===i.EOF)return!1;if(null!==a){null===t&&(t=[]);t.push(a);if(t.length>33)throw new r.FormatError("Too many arguments")}}}preprocessCommand(e,t){switch(0|e){case r.OPS.save:this.stateManager.save();break;case r.OPS.restore:this.stateManager.restore();break;case r.OPS.transform:this.stateManager.transform(t)}}}t.EvaluatorPreprocessor=EvaluatorPreprocessor},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.IdentityCMap=t.CMapFactory=t.CMap=void 0;var r=a(2),n=a(5),i=a(7),s=a(17),o=a(6),c=a(10);const l=["Adobe-GB1-UCS2","Adobe-CNS1-UCS2","Adobe-Japan1-UCS2","Adobe-Korea1-UCS2","78-EUC-H","78-EUC-V","78-H","78-RKSJ-H","78-RKSJ-V","78-V","78ms-RKSJ-H","78ms-RKSJ-V","83pv-RKSJ-H","90ms-RKSJ-H","90ms-RKSJ-V","90msp-RKSJ-H","90msp-RKSJ-V","90pv-RKSJ-H","90pv-RKSJ-V","Add-H","Add-RKSJ-H","Add-RKSJ-V","Add-V","Adobe-CNS1-0","Adobe-CNS1-1","Adobe-CNS1-2","Adobe-CNS1-3","Adobe-CNS1-4","Adobe-CNS1-5","Adobe-CNS1-6","Adobe-GB1-0","Adobe-GB1-1","Adobe-GB1-2","Adobe-GB1-3","Adobe-GB1-4","Adobe-GB1-5","Adobe-Japan1-0","Adobe-Japan1-1","Adobe-Japan1-2","Adobe-Japan1-3","Adobe-Japan1-4","Adobe-Japan1-5","Adobe-Japan1-6","Adobe-Korea1-0","Adobe-Korea1-1","Adobe-Korea1-2","B5-H","B5-V","B5pc-H","B5pc-V","CNS-EUC-H","CNS-EUC-V","CNS1-H","CNS1-V","CNS2-H","CNS2-V","ETHK-B5-H","ETHK-B5-V","ETen-B5-H","ETen-B5-V","ETenms-B5-H","ETenms-B5-V","EUC-H","EUC-V","Ext-H","Ext-RKSJ-H","Ext-RKSJ-V","Ext-V","GB-EUC-H","GB-EUC-V","GB-H","GB-V","GBK-EUC-H","GBK-EUC-V","GBK2K-H","GBK2K-V","GBKp-EUC-H","GBKp-EUC-V","GBT-EUC-H","GBT-EUC-V","GBT-H","GBT-V","GBTpc-EUC-H","GBTpc-EUC-V","GBpc-EUC-H","GBpc-EUC-V","H","HKdla-B5-H","HKdla-B5-V","HKdlb-B5-H","HKdlb-B5-V","HKgccs-B5-H","HKgccs-B5-V","HKm314-B5-H","HKm314-B5-V","HKm471-B5-H","HKm471-B5-V","HKscs-B5-H","HKscs-B5-V","Hankaku","Hiragana","KSC-EUC-H","KSC-EUC-V","KSC-H","KSC-Johab-H","KSC-Johab-V","KSC-V","KSCms-UHC-H","KSCms-UHC-HW-H","KSCms-UHC-HW-V","KSCms-UHC-V","KSCpc-EUC-H","KSCpc-EUC-V","Katakana","NWP-H","NWP-V","RKSJ-H","RKSJ-V","Roman","UniCNS-UCS2-H","UniCNS-UCS2-V","UniCNS-UTF16-H","UniCNS-UTF16-V","UniCNS-UTF32-H","UniCNS-UTF32-V","UniCNS-UTF8-H","UniCNS-UTF8-V","UniGB-UCS2-H","UniGB-UCS2-V","UniGB-UTF16-H","UniGB-UTF16-V","UniGB-UTF32-H","UniGB-UTF32-V","UniGB-UTF8-H","UniGB-UTF8-V","UniJIS-UCS2-H","UniJIS-UCS2-HW-H","UniJIS-UCS2-HW-V","UniJIS-UCS2-V","UniJIS-UTF16-H","UniJIS-UTF16-V","UniJIS-UTF32-H","UniJIS-UTF32-V","UniJIS-UTF8-H","UniJIS-UTF8-V","UniJIS2004-UTF16-H","UniJIS2004-UTF16-V","UniJIS2004-UTF32-H","UniJIS2004-UTF32-V","UniJIS2004-UTF8-H","UniJIS2004-UTF8-V","UniJISPro-UCS2-HW-V","UniJISPro-UCS2-V","UniJISPro-UTF8-V","UniJISX0213-UTF32-H","UniJISX0213-UTF32-V","UniJISX02132004-UTF32-H","UniJISX02132004-UTF32-V","UniKS-UCS2-H","UniKS-UCS2-V","UniKS-UTF16-H","UniKS-UTF16-V","UniKS-UTF32-H","UniKS-UTF32-V","UniKS-UTF8-H","UniKS-UTF8-V","V","WP-Symbol"],h=2**24-1;class CMap{constructor(e=!1){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.name="";this.vertical=!1;this.useCMap=null;this.builtInCMap=e}addCodespaceRange(e,t,a){this.codespaceRanges[e-1].push(t,a);this.numCodespaceRanges++}mapCidRange(e,t,a){if(t-e>h)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=a++}mapBfRange(e,t,a){if(t-e>h)throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");const r=a.length-1;for(;e<=t;){this._map[e++]=a;const t=a.charCodeAt(r)+1;t>255?a=a.substring(0,r-1)+String.fromCharCode(a.charCodeAt(r-1)+1)+"\0":a=a.substring(0,r)+String.fromCharCode(t)}}mapBfRangeToArray(e,t,a){if(t-e>h)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const r=a.length;let n=0;for(;e<=t&&n>>0;const s=n[i];for(let e=0,t=s.length;e=t&&r<=n){a.charcode=r;a.length=i+1;return}}}a.charcode=0;a.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let a=0,r=t.length;a=n&&e<=i)return a+1}}return 1}get length(){return this._map.length}get isIdentityCMap(){if("Identity-H"!==this.name&&"Identity-V"!==this.name)return!1;if(65536!==this._map.length)return!1;for(let e=0;e<65536;e++)if(this._map[e]!==e)return!1;return!0}}t.CMap=CMap;class IdentityCMap extends CMap{constructor(e,t){super();this.vertical=e;this.addCodespaceRange(t,0,65535)}mapCidRange(e,t,a){(0,r.unreachable)("should not call mapCidRange")}mapBfRange(e,t,a){(0,r.unreachable)("should not call mapBfRange")}mapBfRangeToArray(e,t,a){(0,r.unreachable)("should not call mapBfRangeToArray")}mapOne(e,t){(0,r.unreachable)("should not call mapCidOne")}lookup(e){return Number.isInteger(e)&&e<=65535?e:void 0}contains(e){return Number.isInteger(e)&&e<=65535}forEach(e){for(let t=0;t<=65535;t++)e(t,t)}charCodeOf(e){return Number.isInteger(e)&&e<=65535?e:-1}getMap(){const e=new Array(65536);for(let t=0;t<=65535;t++)e[t]=t;return e}get length(){return 65536}get isIdentityCMap(){(0,r.unreachable)("should not access .isIdentityCMap")}}t.IdentityCMap=IdentityCMap;const u=function BinaryCMapReaderClosure(){function hexToInt(e,t){let a=0;for(let r=0;r<=t;r++)a=a<<8|e[r];return a>>>0}function hexToStr(e,t){return 1===t?String.fromCharCode(e[0],e[1]):3===t?String.fromCharCode(e[0],e[1],e[2],e[3]):String.fromCharCode.apply(null,e.subarray(0,t+1))}function addHex(e,t,a){let r=0;for(let n=a;n>=0;n--){r+=e[n]+t[n];e[n]=255&r;r>>=8}}function incHex(e,t){let a=1;for(let r=t;r>=0&&a>0;r--){a+=e[r];e[r]=255&a;a>>=8}}const e=16;class BinaryCMapStream{constructor(e){this.buffer=e;this.pos=0;this.end=e.length;this.tmpBuf=new Uint8Array(19)}readByte(){return this.pos>=this.end?-1:this.buffer[this.pos++]}readNumber(){let e,t=0;do{const a=this.readByte();if(a<0)throw new r.FormatError("unexpected EOF in bcmap");e=!(128&a);t=t<<7|127&a}while(!e);return t}readSigned(){const e=this.readNumber();return 1&e?~(e>>>1):e>>>1}readHex(e,t){e.set(this.buffer.subarray(this.pos,this.pos+t+1));this.pos+=t+1}readHexNumber(e,t){let a;const n=this.tmpBuf;let i=0;do{const e=this.readByte();if(e<0)throw new r.FormatError("unexpected EOF in bcmap");a=!(128&e);n[i++]=127&e}while(!a);let s=t,o=0,c=0;for(;s>=0;){for(;c<8&&n.length>0;){o|=n[--i]<>=8;c-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const a=1&e[t]?255:0;let r=0;for(let n=0;n<=t;n++){r=(1&r)<<8|e[n];e[n]=r>>1^a}}readString(){const e=this.readNumber();let t="";for(let a=0;a=0;){const t=f>>5;if(7===t){switch(31&f){case 0:n.readString();break;case 1:s=n.readString()}continue}const r=!!(16&f),i=15&f;if(i+1>e)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const g=1,p=n.readNumber();switch(t){case 0:n.readHex(o,i);n.readHexNumber(c,i);addHex(c,o,i);a.addCodespaceRange(i+1,hexToInt(o,i),hexToInt(c,i));for(let e=1;e>>0}function expectString(e){if("string"!=typeof e)throw new r.FormatError("Malformed CMap: expected string.")}function expectInt(e){if(!Number.isInteger(e))throw new r.FormatError("Malformed CMap: expected int.")}function parseBfChar(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endbfchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=a;e.mapOne(r,i)}}function parseBfRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endbfrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=strToInt(a);a=t.getObj();if(Number.isInteger(a)||"string"==typeof a){const t=Number.isInteger(a)?String.fromCharCode(a):a;e.mapBfRange(r,i,t)}else{if(!(0,n.isCmd)(a,"["))break;{a=t.getObj();const s=[];for(;!(0,n.isCmd)(a,"]")&&a!==n.EOF;){s.push(a);a=t.getObj()}e.mapBfRangeToArray(r,i,s)}}}throw new r.FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcidchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectInt(a);const i=a;e.mapOne(r,i)}}function parseCidRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcidrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=strToInt(a);a=t.getObj();expectInt(a);const s=a;e.mapCidRange(r,i,s)}}function parseCodespaceRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcodespacerange"))return;if("string"!=typeof a)break;const r=strToInt(a);a=t.getObj();if("string"!=typeof a)break;const i=strToInt(a);e.addCodespaceRange(a.length,r,i)}throw new r.FormatError("Invalid codespace range.")}function parseWMode(e,t){const a=t.getObj();Number.isInteger(a)&&(e.vertical=!!a)}function parseCMapName(e,t){const a=t.getObj();a instanceof n.Name&&(e.name=a.name)}async function parseCMap(e,t,a,i){let s,c;e:for(;;)try{const a=t.getObj();if(a===n.EOF)break;if(a instanceof n.Name){"WMode"===a.name?parseWMode(e,t):"CMapName"===a.name&&parseCMapName(e,t);s=a}else if(a instanceof n.Cmd)switch(a.cmd){case"endcmap":break e;case"usecmap":s instanceof n.Name&&(c=s.name);break;case"begincodespacerange":parseCodespaceRange(e,t);break;case"beginbfchar":parseBfChar(e,t);break;case"begincidchar":parseCidChar(e,t);break;case"beginbfrange":parseBfRange(e,t);break;case"begincidrange":parseCidRange(e,t)}}catch(e){if(e instanceof o.MissingDataException)throw e;(0,r.warn)("Invalid cMap data: "+e);continue}!i&&c&&(i=c);return i?extendCMap(e,a,i):e}async function extendCMap(e,t,a){e.useCMap=await createBuiltInCMap(a,t);if(0===e.numCodespaceRanges){const t=e.useCMap.codespaceRanges;for(let a=0;aextendCMap(i,t,e)));if(n===r.CMapCompressionType.NONE){const e=new s.Lexer(new c.Stream(a));return parseCMap(i,e,t,null)}throw new Error("TODO: Only BINARY/NONE CMap compression is currently supported.")}return{async create(e){const t=e.encoding,a=e.fetchBuiltInCMap,r=e.useCMap;if(t instanceof n.Name)return createBuiltInCMap(t.name,a);if(t instanceof i.BaseStream){const e=await parseCMap(new CMap,new s.Lexer(t),a,r);return e.isIdentityCMap?createBuiltInCMap(e.name,a):e}throw new Error("Encoding required.")}}}();t.CMapFactory=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Parser=t.Linearization=t.Lexer=void 0;var r=a(2),n=a(5),i=a(6),s=a(18),o=a(20),c=a(21),l=a(23),h=a(24),u=a(27),d=a(29),f=a(31),g=a(10),p=a(32),m=a(33);function computeAdler32(e){const t=e.length;let a=1,r=0;for(let n=0;n>")&&this.buf1!==n.EOF;){if(!(this.buf1 instanceof n.Name)){(0,r.info)("Malformed dictionary: key must be a name object");this.shift();continue}const t=this.buf1.name;this.shift();if(this.buf1===n.EOF)break;s.set(t,this.getObj(e))}if(this.buf1===n.EOF){if(this.recoveryMode)return s;throw new i.ParserEOFException("End of file inside dictionary.")}if((0,n.isCmd)(this.buf2,"stream"))return this.allowStreams?this.makeStream(s,e):s;this.shift();return s;default:return t}if(Number.isInteger(t)){if(Number.isInteger(this.buf1)&&(0,n.isCmd)(this.buf2,"R")){const e=n.Ref.get(t,this.buf1);this.shift();this.shift();return e}return t}return"string"==typeof t&&e?e.decryptString(t):t}findDefaultInlineStreamEnd(e){const t=this.lexer,a=e.pos;let s,o,c=0;for(;-1!==(s=e.getByte());)if(0===c)c=69===s?1:0;else if(1===c)c=73===s?2:0;else{(0,r.assert)(2===c,"findDefaultInlineStreamEnd - invalid state.");if(32===s||10===s||13===s){o=e.pos;const a=e.peekBytes(10);for(let e=0,t=a.length;e127))){c=0;break}}if(2!==c)continue;if(t.knownCommands){const e=t.peekObj();e instanceof n.Cmd&&!t.knownCommands[e.cmd]&&(c=0)}else(0,r.warn)("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");if(2===c)break}else c=0}if(-1===s){(0,r.warn)("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(o){(0,r.warn)('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-o))}}let l=4;e.skip(-l);s=e.peekByte();e.skip(l);(0,i.isWhiteSpace)(s)||l--;return e.pos-l-a}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let a,n,i=!1;for(;-1!==(a=e.getByte());)if(255===a){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:i=!0;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:n=e.getUint16();n>2?e.skip(n-2):e.skip(-2)}if(i)break}const s=e.pos-t;if(-1===a){(0,r.warn)("Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.");e.skip(-s);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return s}findASCII85DecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte());)if(126===a){const t=e.pos;a=e.peekByte();for(;(0,i.isWhiteSpace)(a);){e.skip();a=e.peekByte()}if(62===a){e.skip();break}if(e.pos>t){const t=e.peekBytes(2);if(69===t[0]&&73===t[1])break}}const n=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte())&&62!==a;);const n=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}inlineStreamSkipEI(e){let t,a=0;for(;-1!==(t=e.getByte());)if(0===a)a=69===t?1:0;else if(1===a)a=73===t?2:0;else if(2===a)break}makeInlineImage(e){const t=this.lexer,a=t.stream,i=new n.Dict(this.xref);let s;for(;!(0,n.isCmd)(this.buf1,"ID")&&this.buf1!==n.EOF;){if(!(this.buf1 instanceof n.Name))throw new r.FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===n.EOF)break;i.set(t,this.getObj(e))}-1!==t.beginInlineImagePos&&(s=a.pos-t.beginInlineImagePos);const o=i.get("F","Filter");let c;if(o instanceof n.Name)c=o.name;else if(Array.isArray(o)){const e=this.xref.fetchIfRef(o[0]);e instanceof n.Name&&(c=e.name)}const l=a.pos;let h;switch(c){case"DCT":case"DCTDecode":h=this.findDCTDecodeInlineStreamEnd(a);break;case"A85":case"ASCII85Decode":h=this.findASCII85DecodeInlineStreamEnd(a);break;case"AHx":case"ASCIIHexDecode":h=this.findASCIIHexDecodeInlineStreamEnd(a);break;default:h=this.findDefaultInlineStreamEnd(a)}let u,d=a.makeSubStream(l,h,i);if(h<1e3&&s<5552){const e=d.getBytes();d.reset();const r=a.pos;a.pos=t.beginInlineImagePos;const i=a.getBytes(s);a.pos=r;u=computeAdler32(e)+"_"+computeAdler32(i);const o=this.imageCache[u];if(void 0!==o){this.buf2=n.Cmd.get("EI");this.shift();o.reset();return o}}e&&(d=e.createStream(d,h));d=this.filter(d,i,h);d.dict=i;if(void 0!==u){d.cacheKey=`inline_${h}_${u}`;this.imageCache[u]=d}this.buf2=n.Cmd.get("EI");this.shift();return d}_findStreamLength(e,t){const{stream:a}=this.lexer;a.pos=e;const r=t.length;for(;a.pos=r){a.pos+=s;return a.pos-e}s++}a.pos+=i}return-1}makeStream(e,t){const a=this.lexer;let s=a.stream;a.skipToNextLine();const o=s.pos-1;let c=e.get("Length");if(!Number.isInteger(c)){(0,r.info)(`Bad length "${c&&c.toString()}" in stream.`);c=0}s.pos=o+c;a.nextChar();if(this.tryShift()&&(0,n.isCmd)(this.buf2,"endstream"))this.shift();else{const e=new Uint8Array([101,110,100,115,116,114,101,97,109]);let t=this._findStreamLength(o,e);if(t<0){const a=1;for(let n=1;n<=a;n++){const a=e.length-n,c=e.slice(0,a),l=this._findStreamLength(o,c);if(l>=0){const e=s.peekBytes(a+1)[a];if(!(0,i.isWhiteSpace)(e))break;(0,r.info)(`Found "${(0,r.bytesToString)(c)}" when searching for endstream command.`);t=l;break}}if(t<0)throw new r.FormatError("Missing endstream command.")}c=t;a.nextChar();this.shift();this.shift()}this.shift();s=s.makeSubStream(o,c,e);t&&(s=t.createStream(s,c));s=this.filter(s,e,c);s.dict=e;return s}filter(e,t,a){let i=t.get("F","Filter"),s=t.get("DP","DecodeParms");if(i instanceof n.Name){Array.isArray(s)&&(0,r.warn)("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,i.name,a,s)}let o=a;if(Array.isArray(i)){const t=i,a=s;for(let c=0,l=t.length;c=48&&e<=57?15&e:e>=65&&e<=70||e>=97&&e<=102?9+(15&e):-1}class Lexer{constructor(e,t=null){this.stream=e;this.nextChar();this.strBuf=[];this.knownCommands=t;this._hexStringNumWarn=0;this.beginInlineImagePos=-1}nextChar(){return this.currentChar=this.stream.getByte()}peekChar(){return this.stream.peekByte()}getNumber(){let e=this.currentChar,t=!1,a=0,n=0;if(45===e){n=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else if(43===e){n=1;e=this.nextChar()}if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){a=10;e=this.nextChar()}if(e<48||e>57){if((0,i.isWhiteSpace)(e)||-1===e){if(10===a&&0===n){(0,r.warn)("Lexer.getNumber - treating a single decimal point as zero.");return 0}if(0===a&&-1===n){(0,r.warn)("Lexer.getNumber - treating a single minus sign as zero.");return 0}}throw new r.FormatError(`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`)}n=n||1;let s=e-48,o=0,c=1;for(;(e=this.nextChar())>=0;)if(e>=48&&e<=57){const r=e-48;if(t)o=10*o+r;else{0!==a&&(a*=10);s=10*s+r}}else if(46===e){if(0!==a)break;a=1}else if(45===e)(0,r.warn)("Badly formatted number: minus sign in the middle");else{if(69!==e&&101!==e)break;e=this.peekChar();if(43===e||45===e){c=45===e?-1:1;this.nextChar()}else if(e<48||e>57)break;t=!0}0!==a&&(s/=a);t&&(s*=10**(c*o));return n*s}getString(){let e=1,t=!1;const a=this.strBuf;a.length=0;let n=this.nextChar();for(;;){let i=!1;switch(0|n){case-1:(0,r.warn)("Unterminated string");t=!0;break;case 40:++e;a.push("(");break;case 41:if(0==--e){this.nextChar();t=!0}else a.push(")");break;case 92:n=this.nextChar();switch(n){case-1:(0,r.warn)("Unterminated string");t=!0;break;case 110:a.push("\n");break;case 114:a.push("\r");break;case 116:a.push("\t");break;case 98:a.push("\b");break;case 102:a.push("\f");break;case 92:case 40:case 41:a.push(String.fromCharCode(n));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&n;n=this.nextChar();i=!0;if(n>=48&&n<=55){e=(e<<3)+(15&n);n=this.nextChar();if(n>=48&&n<=55){i=!1;e=(e<<3)+(15&n)}}a.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:a.push(String.fromCharCode(n))}break;default:a.push(String.fromCharCode(n))}if(t)break;i||(n=this.nextChar())}return a.join("")}getName(){let e,t;const a=this.strBuf;a.length=0;for(;(e=this.nextChar())>=0&&!b[e];)if(35===e){e=this.nextChar();if(b[e]){(0,r.warn)("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");a.push("#");break}const n=toHexDigit(e);if(-1!==n){t=e;e=this.nextChar();const i=toHexDigit(e);if(-1===i){(0,r.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`);a.push("#",String.fromCharCode(t));if(b[e])break;a.push(String.fromCharCode(e));continue}a.push(String.fromCharCode(n<<4|i))}else a.push("#",String.fromCharCode(e))}else a.push(String.fromCharCode(e));a.length>127&&(0,r.warn)(`Name token is longer than allowed by the spec: ${a.length}`);return n.Name.get(a.join(""))}_hexStringWarn(e){5!=this._hexStringNumWarn++?this._hexStringNumWarn>5||(0,r.warn)(`getHexString - ignoring invalid character: ${e}`):(0,r.warn)("getHexString - ignoring additional invalid characters.")}getHexString(){const e=this.strBuf;e.length=0;let t,a,n=this.currentChar,i=!0;this._hexStringNumWarn=0;for(;;){if(n<0){(0,r.warn)("Unterminated hex string");break}if(62===n){this.nextChar();break}if(1!==b[n]){if(i){t=toHexDigit(n);if(-1===t){this._hexStringWarn(n);n=this.nextChar();continue}}else{a=toHexDigit(n);if(-1===a){this._hexStringWarn(n);n=this.nextChar();continue}e.push(String.fromCharCode(t<<4|a))}i=!i;n=this.nextChar()}else n=this.nextChar()}return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return n.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(1!==b[t])break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return n.Cmd.get("[");case 93:this.nextChar();return n.Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return n.Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return n.Cmd.get(">>")}return n.Cmd.get(">");case 123:this.nextChar();return n.Cmd.get("{");case 125:this.nextChar();return n.Cmd.get("}");case 41:this.nextChar();throw new r.FormatError(`Illegal character: ${t}`)}let a=String.fromCharCode(t);if(t<32||t>127){const e=this.peekChar();if(e>=32&&e<=127){this.nextChar();return n.Cmd.get(a)}}const i=this.knownCommands;let s=i&&void 0!==i[a];for(;(t=this.nextChar())>=0&&!b[t];){const e=a+String.fromCharCode(t);if(s&&void 0===i[e])break;if(128===a.length)throw new r.FormatError(`Command token too long: ${a.length}`);a=e;s=i&&void 0!==i[a]}if("true"===a)return!0;if("false"===a)return!1;if("null"===a)return null;"BI"===a&&(this.beginInlineImagePos=this.stream.pos);return n.Cmd.get(a)}peekObj(){const e=this.stream.pos,t=this.currentChar,a=this.beginInlineImagePos;let n;try{n=this.getObj()}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`peekObj: ${e}`)}this.stream.pos=e;this.currentChar=t;this.beginInlineImagePos=a;return n}skipToNextLine(){let e=this.currentChar;for(;e>=0;){if(13===e){e=this.nextChar();10===e&&this.nextChar();break}if(10===e){this.nextChar();break}e=this.nextChar()}}}t.Lexer=Lexer;t.Linearization=class Linearization{static create(e){function getInt(e,t,a=!1){const r=e.get(t);if(Number.isInteger(r)&&(a?r>=0:r>0))return r;throw new Error(`The "${t}" parameter in the linearization dictionary is invalid.`)}const t=new Parser({lexer:new Lexer(e),xref:null}),a=t.getObj(),r=t.getObj(),i=t.getObj(),s=t.getObj();let o,c;if(!(Number.isInteger(a)&&Number.isInteger(r)&&(0,n.isCmd)(i,"obj")&&s instanceof n.Dict&&"number"==typeof(o=s.get("Linearized"))&&o>0))return null;if((c=getInt(s,"L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:c,hints:function getHints(e){const t=e.get("H");let a;if(Array.isArray(t)&&(2===(a=t.length)||4===a)){for(let e=0;e0))throw new Error(`Hint (${e}) in the linearization dictionary is invalid.`)}return t}throw new Error("Hint array in the linearization dictionary is invalid.")}(s),objectNumberFirst:getInt(s,"O"),endFirst:getInt(s,"E"),numPages:getInt(s,"N"),mainXRefEntriesOffset:getInt(s,"T"),pageFirst:s.has("P")?getInt(s,"P",!0):0}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Ascii85Stream=void 0;var r=a(19),n=a(6);class Ascii85Stream extends r.DecodeStream{constructor(e,t){t&&(t*=.8);super(t);this.str=e;this.dict=e.dict;this.input=new Uint8Array(5)}readBlock(){const e=this.str;let t=e.getByte();for(;(0,n.isWhiteSpace)(t);)t=e.getByte();if(-1===t||126===t){this.eof=!0;return}const a=this.bufferLength;let r,i;if(122===t){r=this.ensureBuffer(a+4);for(i=0;i<4;++i)r[a+i]=0;this.bufferLength+=4}else{const s=this.input;s[0]=t;for(i=1;i<5;++i){t=e.getByte();for(;(0,n.isWhiteSpace)(t);)t=e.getByte();s[i]=t;if(-1===t||126===t)break}r=this.ensureBuffer(a+i-1);this.bufferLength+=i-1;if(i<5){for(;i<5;++i)s[i]=117;this.eof=!0}let o=0;for(i=0;i<5;++i)o=85*o+(s[i]-33);for(i=3;i>=0;--i){r[a+i]=255&o;o>>=8}}}}t.Ascii85Stream=Ascii85Stream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StreamsSequenceStream=t.DecodeStream=void 0;var r=a(7),n=a(10);const i=new Uint8Array(0);class DecodeStream extends r.BaseStream{constructor(e){super();this._rawMinBufferLength=e||0;this.pos=0;this.bufferLength=0;this.eof=!1;this.buffer=i;this.minBufferLength=512;if(e)for(;this.minBufferLengthr&&(a=r)}else{for(;!this.eof;)this.readBlock();a=this.bufferLength}this.pos=a;return this.buffer.subarray(t,a)}reset(){this.pos=0}makeSubStream(e,t,a=null){if(void 0===t)for(;!this.eof;)this.readBlock();else{const a=e+t;for(;this.bufferLength<=a&&!this.eof;)this.readBlock()}return new n.Stream(this.buffer,e,t,a)}getBaseStreams(){return this.str?this.str.getBaseStreams():null}}t.DecodeStream=DecodeStream;t.StreamsSequenceStream=class StreamsSequenceStream extends DecodeStream{constructor(e,t=null){let a=0;for(const t of e)a+=t instanceof DecodeStream?t._rawMinBufferLength:t.length;super(a);this.streams=e;this._onError=t}readBlock(){const e=this.streams;if(0===e.length){this.eof=!0;return}const t=e.shift();let a;try{a=t.getBytes()}catch(e){if(this._onError){this._onError(e,t.dict&&t.dict.objId);return}throw e}const r=this.bufferLength,n=r+a.length;this.ensureBuffer(n).set(a,r);this.bufferLength=n}getBaseStreams(){const e=[];for(const t of this.streams){const a=t.getBaseStreams();a&&e.push(...a)}return e.length>0?e:null}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.AsciiHexStream=void 0;var r=a(19);class AsciiHexStream extends r.DecodeStream{constructor(e,t){t&&(t*=.5);super(t);this.str=e;this.dict=e.dict;this.firstDigit=-1}readBlock(){const e=this.str.getBytes(8e3);if(!e.length){this.eof=!0;return}const t=e.length+1>>1,a=this.ensureBuffer(this.bufferLength+t);let r=this.bufferLength,n=this.firstDigit;for(const t of e){let e;if(t>=48&&t<=57)e=15&t;else{if(!(t>=65&&t<=70||t>=97&&t<=102)){if(62===t){this.eof=!0;break}continue}e=9+(15&t)}if(n<0)n=e;else{a[r++]=n<<4|e;n=-1}}if(n>=0&&this.eof){a[r++]=n<<4;n=-1}this.firstDigit=n;this.bufferLength=r}}t.AsciiHexStream=AsciiHexStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxStream=void 0;var r=a(22),n=a(19),i=a(5);class CCITTFaxStream extends n.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;a instanceof i.Dict||(a=i.Dict.empty);const n={next:()=>e.getByte()};this.ccittFaxDecoder=new r.CCITTFaxDecoder(n,{K:a.get("K"),EndOfLine:a.get("EndOfLine"),EncodedByteAlign:a.get("EncodedByteAlign"),Columns:a.get("Columns"),Rows:a.get("Rows"),EndOfBlock:a.get("EndOfBlock"),BlackIs1:a.get("BlackIs1")})}readBlock(){for(;!this.eof;){const e=this.ccittFaxDecoder.readNextChar();if(-1===e){this.eof=!0;return}this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=e}}}t.CCITTFaxStream=CCITTFaxStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxDecoder=void 0;var r=a(2);const n=-1,i=[[-1,-1],[-1,-1],[7,8],[7,7],[6,6],[6,6],[6,5],[6,5],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2]],s=[[-1,-1],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[12,1984],[12,2048],[12,2112],[12,2176],[12,2240],[12,2304],[11,1856],[11,1856],[11,1920],[11,1920],[12,2368],[12,2432],[12,2496],[12,2560]],o=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[8,29],[8,29],[8,30],[8,30],[8,45],[8,45],[8,46],[8,46],[7,22],[7,22],[7,22],[7,22],[7,23],[7,23],[7,23],[7,23],[8,47],[8,47],[8,48],[8,48],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[7,20],[7,20],[7,20],[7,20],[8,33],[8,33],[8,34],[8,34],[8,35],[8,35],[8,36],[8,36],[8,37],[8,37],[8,38],[8,38],[7,19],[7,19],[7,19],[7,19],[8,31],[8,31],[8,32],[8,32],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[8,53],[8,53],[8,54],[8,54],[7,26],[7,26],[7,26],[7,26],[8,39],[8,39],[8,40],[8,40],[8,41],[8,41],[8,42],[8,42],[8,43],[8,43],[8,44],[8,44],[7,21],[7,21],[7,21],[7,21],[7,28],[7,28],[7,28],[7,28],[8,61],[8,61],[8,62],[8,62],[8,63],[8,63],[8,0],[8,0],[8,320],[8,320],[8,384],[8,384],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[7,27],[7,27],[7,27],[7,27],[8,59],[8,59],[8,60],[8,60],[9,1472],[9,1536],[9,1600],[9,1728],[7,18],[7,18],[7,18],[7,18],[7,24],[7,24],[7,24],[7,24],[8,49],[8,49],[8,50],[8,50],[8,51],[8,51],[8,52],[8,52],[7,25],[7,25],[7,25],[7,25],[8,55],[8,55],[8,56],[8,56],[8,57],[8,57],[8,58],[8,58],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[8,448],[8,448],[8,512],[8,512],[9,704],[9,768],[8,640],[8,640],[8,576],[8,576],[9,832],[9,896],[9,960],[9,1024],[9,1088],[9,1152],[9,1216],[9,1280],[9,1344],[9,1408],[7,256],[7,256],[7,256],[7,256],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7]],c=[[-1,-1],[-1,-1],[12,-2],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[11,1792],[11,1792],[12,1984],[12,1984],[12,2048],[12,2048],[12,2112],[12,2112],[12,2176],[12,2176],[12,2240],[12,2240],[12,2304],[12,2304],[11,1856],[11,1856],[11,1856],[11,1856],[11,1920],[11,1920],[11,1920],[11,1920],[12,2368],[12,2368],[12,2432],[12,2432],[12,2496],[12,2496],[12,2560],[12,2560],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[12,52],[12,52],[13,640],[13,704],[13,768],[13,832],[12,55],[12,55],[12,56],[12,56],[13,1280],[13,1344],[13,1408],[13,1472],[12,59],[12,59],[12,60],[12,60],[13,1536],[13,1600],[11,24],[11,24],[11,24],[11,24],[11,25],[11,25],[11,25],[11,25],[13,1664],[13,1728],[12,320],[12,320],[12,384],[12,384],[12,448],[12,448],[13,512],[13,576],[12,53],[12,53],[12,54],[12,54],[13,896],[13,960],[13,1024],[13,1088],[13,1152],[13,1216],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64]],l=[[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[11,23],[11,23],[12,50],[12,51],[12,44],[12,45],[12,46],[12,47],[12,57],[12,58],[12,61],[12,256],[10,16],[10,16],[10,16],[10,16],[10,17],[10,17],[10,17],[10,17],[12,48],[12,49],[12,62],[12,63],[12,30],[12,31],[12,32],[12,33],[12,40],[12,41],[11,22],[11,22],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[12,128],[12,192],[12,26],[12,27],[12,28],[12,29],[11,19],[11,19],[11,20],[11,20],[12,34],[12,35],[12,36],[12,37],[12,38],[12,39],[11,21],[11,21],[12,42],[12,43],[10,0],[10,0],[10,0],[10,0],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12]],h=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];t.CCITTFaxDecoder=class CCITTFaxDecoder{constructor(e,t={}){if(!e||"function"!=typeof e.next)throw new Error('CCITTFaxDecoder - invalid "source" parameter.');this.source=e;this.eof=!1;this.encoding=t.K||0;this.eoline=t.EndOfLine||!1;this.byteAlign=t.EncodedByteAlign||!1;this.columns=t.Columns||1728;this.rows=t.Rows||0;let a,r=t.EndOfBlock;null==r&&(r=!0);this.eoblock=r;this.black=t.BlackIs1||!1;this.codingLine=new Uint32Array(this.columns+1);this.refLine=new Uint32Array(this.columns+2);this.codingLine[0]=this.columns;this.codingPos=0;this.row=0;this.nextLine2D=this.encoding<0;this.inputBits=0;this.inputBuf=0;this.outputBits=0;this.rowsDone=!1;for(;0===(a=this._lookBits(12));)this._eatBits(1);1===a&&this._eatBits(12);if(this.encoding>0){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}}readNextChar(){if(this.eof)return-1;const e=this.refLine,t=this.codingLine,a=this.columns;let i,s,o,c,l;if(0===this.outputBits){this.rowsDone&&(this.eof=!0);if(this.eof)return-1;this.err=!1;let o,l,h;if(this.nextLine2D){for(c=0;t[c]=64);do{l+=h=this._getWhiteCode()}while(h>=64)}else{do{o+=h=this._getWhiteCode()}while(h>=64);do{l+=h=this._getBlackCode()}while(h>=64)}this._addPixels(t[this.codingPos]+o,s);t[this.codingPos]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]=64);else do{o+=h=this._getWhiteCode()}while(h>=64);this._addPixels(t[this.codingPos]+o,s);s^=1}}let u=!1;this.byteAlign&&(this.inputBits&=-8);if(this.eoblock||this.row!==this.rows-1){o=this._lookBits(12);if(this.eoline)for(;o!==n&&1!==o;){this._eatBits(1);o=this._lookBits(12)}else for(;0===o;){this._eatBits(1);o=this._lookBits(12)}if(1===o){this._eatBits(12);u=!0}else o===n&&(this.eof=!0)}else this.rowsDone=!0;if(!this.eof&&this.encoding>0&&!this.rowsDone){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}if(this.eoblock&&u&&this.byteAlign){o=this._lookBits(12);if(1===o){this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}if(this.encoding>=0)for(c=0;c<4;++c){o=this._lookBits(12);1!==o&&(0,r.info)("bad rtc code: "+o);this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}}this.eof=!0}}else if(this.err&&this.eoline){for(;;){o=this._lookBits(13);if(o===n){this.eof=!0;return-1}if(o>>1==1)break;this._eatBits(1)}this._eatBits(12);if(this.encoding>0){this._eatBits(1);this.nextLine2D=!(1&o)}}t[0]>0?this.outputBits=t[this.codingPos=0]:this.outputBits=t[this.codingPos=1];this.row++}if(this.outputBits>=8){l=1&this.codingPos?0:255;this.outputBits-=8;if(0===this.outputBits&&t[this.codingPos]o){l<<=o;1&this.codingPos||(l|=255>>8-o);this.outputBits-=o;o=0}else{l<<=this.outputBits;1&this.codingPos||(l|=255>>8-this.outputBits);o-=this.outputBits;this.outputBits=0;if(t[this.codingPos]0){l<<=o;o=0}}}while(o)}this.black&&(l^=255);return l}_addPixels(e,t){const a=this.codingLine;let n=this.codingPos;if(e>a[n]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&n^t&&++n;a[n]=e}this.codingPos=n}_addPixelsNeg(e,t){const a=this.codingLine;let n=this.codingPos;if(e>a[n]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&n^t&&++n;a[n]=e}else if(e0&&e=i){const t=a[e-i];if(t[0]===r){this._eatBits(r);return[!0,t[1],!0]}}}return[!1,0,!1]}_getTwoDimCode(){let e,t=0;if(this.eoblock){t=this._lookBits(7);e=i[t];if(e&&e[0]>0){this._eatBits(e[0]);return e[1]}}else{const e=this._findTableCode(1,7,i);if(e[0]&&e[2])return e[1]}(0,r.info)("Bad two dim code");return n}_getWhiteCode(){let e,t=0;if(this.eoblock){t=this._lookBits(12);if(t===n)return 1;e=t>>5==0?s[t]:o[t>>3];if(e[0]>0){this._eatBits(e[0]);return e[1]}}else{let e=this._findTableCode(1,9,o);if(e[0])return e[1];e=this._findTableCode(11,12,s);if(e[0])return e[1]}(0,r.info)("bad white code");this._eatBits(1);return 1}_getBlackCode(){let e,t;if(this.eoblock){e=this._lookBits(13);if(e===n)return 1;t=e>>7==0?c[e]:e>>9==0&&e>>7!=0?l[(e>>1)-64]:h[e>>7];if(t[0]>0){this._eatBits(t[0]);return t[1]}}else{let e=this._findTableCode(2,6,h);if(e[0])return e[1];e=this._findTableCode(7,12,l,64);if(e[0])return e[1];e=this._findTableCode(10,13,c);if(e[0])return e[1]}(0,r.info)("bad black code");this._eatBits(1);return 1}_lookBits(e){let t;for(;this.inputBits>16-e;this.inputBuf=this.inputBuf<<8|t;this.inputBits+=8}return this.inputBuf>>this.inputBits-e&65535>>16-e}_eatBits(e){(this.inputBits-=e)<0&&(this.inputBits=0)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FlateStream=void 0;var r=a(19),n=a(2);const i=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),o=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),c=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59e4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],l=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];class FlateStream extends r.DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict;const a=e.getByte(),r=e.getByte();if(-1===a||-1===r)throw new n.FormatError(`Invalid header in flate stream: ${a}, ${r}`);if(8!=(15&a))throw new n.FormatError(`Unknown compression method in flate stream: ${a}, ${r}`);if(((a<<8)+r)%31!=0)throw new n.FormatError(`Bad FCHECK in flate stream: ${a}, ${r}`);if(32&r)throw new n.FormatError(`FDICT bit set in flate stream: ${a}, ${r}`);this.codeSize=0;this.codeBuf=0}getBits(e){const t=this.str;let a,r=this.codeSize,i=this.codeBuf;for(;r>e;this.codeSize=r-=e;return a}getCode(e){const t=this.str,a=e[0],r=e[1];let i,s=this.codeSize,o=this.codeBuf;for(;s>16,h=65535&c;if(l<1||s>l;this.codeSize=s-l;return h}generateHuffmanTable(e){const t=e.length;let a,r=0;for(a=0;ar&&(r=e[a]);const n=1<>=1}for(a=e;a>=1;if(0===u){let t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");let r=t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");r|=t<<8;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");let i=t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");i|=t<<8;if(i!==(65535&~r)&&(0!==r||0!==i))throw new n.FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;const s=this.bufferLength,o=s+r;e=this.ensureBuffer(o);this.bufferLength=o;if(0===r)-1===a.peekByte()&&(this.eof=!0);else{const t=a.getBytes(r);e.set(t,s);t.length0;)u[o++]=g}r=this.generateHuffmanTable(u.subarray(0,e));h=this.generateHuffmanTable(u.subarray(e,l))}}e=this.buffer;let d=e?e.length:0,f=this.bufferLength;for(;;){let a=this.getCode(r);if(a<256){if(f+1>=d){e=this.ensureBuffer(f+1);d=e.length}e[f++]=a;continue}if(256===a){this.bufferLength=f;return}a-=257;a=s[a];let n=a>>16;n>0&&(n=this.getBits(n));t=(65535&a)+n;a=this.getCode(h);a=o[a];n=a>>16;n>0&&(n=this.getBits(n));const i=(65535&a)+n;if(f+t>=d){e=this.ensureBuffer(f+t);d=e.length}for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Stream=void 0;var r=a(7),n=a(19),i=a(5),s=a(25),o=a(2);class Jbig2Stream extends n.DecodeStream{constructor(e,t,a){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,o.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e=new s.Jbig2Image,t=[];if(this.params instanceof i.Dict){const e=this.params.get("JBIG2Globals");if(e instanceof r.BaseStream){const a=e.getBytes();t.push({data:a,start:0,end:a.length})}}t.push({data:this.bytes,start:0,end:this.bytes.length});const a=e.parseChunks(t),n=a.length;for(let e=0;e{Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Image=void 0;var r=a(2),n=a(6),i=a(26),s=a(22);class Jbig2Error extends r.BaseException{constructor(e){super(`JBIG2 error: ${e}`,"Jbig2Error")}}class ContextCache{getContexts(e){return e in this?this[e]:this[e]=new Int8Array(65536)}}class DecodingContext{constructor(e,t,a){this.data=e;this.start=t;this.end=a}get decoder(){const e=new i.ArithmeticDecoder(this.data,this.start,this.end);return(0,r.shadow)(this,"decoder",e)}get contextCache(){const e=new ContextCache;return(0,r.shadow)(this,"contextCache",e)}}function decodeInteger(e,t,a){const r=e.getContexts(t);let n=1;function readBits(e){let t=0;for(let i=0;i>>0}const i=readBits(1),s=readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(32)+4436:readBits(12)+340:readBits(8)+84:readBits(6)+20:readBits(4)+4:readBits(2);return 0===i?s:s>0?-s:null}function decodeIAID(e,t,a){const r=e.getContexts("IAID");let n=1;for(let e=0;e=O&&j=T){q=q<<1&y;for(b=0;b=0&&_=0){U=N[$][_];U&&(q|=U<=e?l<<=1:l=l<<1|C[o][c]}for(p=0;p=x||c<0||c>=S?l<<=1:l=l<<1|r[o][c]}const h=v.readBit(F,l);t[s]=h}}return C}function decodeTextRegion(e,t,a,r,n,i,s,o,c,l,h,u,d,f,g,p,m,b,y){if(e&&t)throw new Jbig2Error("refinement with Huffman is not supported");const w=[];let S,x;for(S=0;S1&&(n=e?y.readBits(b):decodeInteger(C,"IAIT",k));const i=s*v+n,F=e?f.symbolIDTable.decode(y):decodeIAID(C,k,c),O=t&&(e?y.readBit():decodeInteger(C,"IARI",k));let T=o[F],M=T[0].length,E=T.length;if(O){const e=decodeInteger(C,"IARDW",k),t=decodeInteger(C,"IARDH",k),a=decodeInteger(C,"IARDX",k),r=decodeInteger(C,"IARDY",k);M+=e;E+=t;T=decodeRefinement(M,E,g,T,(e>>1)+a,(t>>1)+r,!1,p,m)}const D=i-(1&u?0:E-1),N=r-(2&u?M-1:0);let R,L,j;if(l){for(R=0;R>5&7;const h=[31&c];let u=t+6;if(7===c){l=536870911&(0,n.readUint32)(e,u-1);u+=3;let t=l+7>>3;h[0]=e[u++];for(;--t>0;)h.push(e[u++])}else if(5===c||6===c)throw new Jbig2Error("invalid referred-to flags");a.retainBits=h;let f=4;a.number<=256?f=1:a.number<=65536&&(f=2);const g=[];let p,m;for(p=0;p>>24&255;i[3]=t.height>>16&255;i[4]=t.height>>8&255;i[5]=255&t.height;for(p=u,m=e.length;p>2&3;e.huffmanDWSelector=t>>4&3;e.bitmapSizeSelector=t>>6&1;e.aggregationInstancesSelector=t>>7&1;e.bitmapCodingContextUsed=!!(256&t);e.bitmapCodingContextRetained=!!(512&t);e.template=t>>10&3;e.refinementTemplate=t>>12&1;h+=2;if(!e.huffman){l=0===e.template?4:1;o=[];for(c=0;c>2&3;u.stripSize=1<>4&3;u.transposed=!!(64&f);u.combinationOperator=f>>7&3;u.defaultPixelValue=f>>9&1;u.dsOffset=f<<17>>27;u.refinementTemplate=f>>15&1;if(u.huffman){const e=(0,n.readUint16)(r,h);h+=2;u.huffmanFS=3&e;u.huffmanDS=e>>2&3;u.huffmanDT=e>>4&3;u.huffmanRefinementDW=e>>6&3;u.huffmanRefinementDH=e>>8&3;u.huffmanRefinementDX=e>>10&3;u.huffmanRefinementDY=e>>12&3;u.huffmanRefinementSizeSelector=!!(16384&e)}if(u.refinement&&!u.refinementTemplate){o=[];for(c=0;c<2;c++){o.push({x:(0,n.readInt8)(r,h),y:(0,n.readInt8)(r,h+1)});h+=2}u.refinementAt=o}u.numberOfSymbolInstances=(0,n.readUint32)(r,h);h+=4;s=[u,a.referredTo,r,h,i];break;case 16:const g={},p=r[h++];g.mmr=!!(1&p);g.template=p>>1&3;g.patternWidth=r[h++];g.patternHeight=r[h++];g.maxPatternIndex=(0,n.readUint32)(r,h);h+=4;s=[g,a.number,r,h,i];break;case 22:case 23:const m={};m.info=readRegionSegmentInformation(r,h);h+=d;const b=r[h++];m.mmr=!!(1&b);m.template=b>>1&3;m.enableSkip=!!(8&b);m.combinationOperator=b>>4&7;m.defaultPixelValue=b>>7&1;m.gridWidth=(0,n.readUint32)(r,h);h+=4;m.gridHeight=(0,n.readUint32)(r,h);h+=4;m.gridOffsetX=4294967295&(0,n.readUint32)(r,h);h+=4;m.gridOffsetY=4294967295&(0,n.readUint32)(r,h);h+=4;m.gridVectorX=(0,n.readUint16)(r,h);h+=2;m.gridVectorY=(0,n.readUint16)(r,h);h+=2;s=[m,a.referredTo,r,h,i];break;case 38:case 39:const y={};y.info=readRegionSegmentInformation(r,h);h+=d;const w=r[h++];y.mmr=!!(1&w);y.template=w>>1&3;y.prediction=!!(8&w);if(!y.mmr){l=0===y.template?4:1;o=[];for(c=0;c>2&1;S.combinationOperator=x>>3&3;S.requiresBuffer=!!(32&x);S.combinationOperatorOverride=!!(64&x);s=[S];break;case 49:case 50:case 51:case 62:break;case 53:s=[a.number,r,h,i];break;default:throw new Jbig2Error(`segment type ${a.typeName}(${a.type}) is not implemented`)}const u="on"+a.typeName;u in t&&t[u].apply(t,s)}function processSegments(e,t){for(let a=0,r=e.length;a>3,a=new Uint8ClampedArray(t*e.height);e.defaultPixelValue&&a.fill(255);this.buffer=a}drawBitmap(e,t){const a=this.currentPageInfo,r=e.width,n=e.height,i=a.width+7>>3,s=a.combinationOperatorOverride?e.combinationOperator:a.combinationOperator,o=this.buffer,c=128>>(7&e.x);let l,h,u,d,f=e.y*i+(e.x>>3);switch(s){case 0:for(l=0;l>=1;if(!u){u=128;d++}}f+=i}break;case 2:for(l=0;l>=1;if(!u){u=128;d++}}f+=i}break;default:throw new Jbig2Error(`operator ${s} is not supported`)}}onImmediateGenericRegion(e,t,a,r){const n=e.info,i=new DecodingContext(t,a,r),s=decodeBitmap(e.mmr,n.width,n.height,e.template,e.prediction,null,e.at,i);this.drawBitmap(n,s)}onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion(...arguments)}onSymbolDictionary(e,t,a,r,i,s){let o,c;if(e.huffman){o=function getSymbolDictionaryHuffmanTables(e,t,a){let r,n,i,s,o=0;switch(e.huffmanDHSelector){case 0:case 1:r=getStandardTable(e.huffmanDHSelector+4);break;case 3:r=getCustomHuffmanTable(o,t,a);o++;break;default:throw new Jbig2Error("invalid Huffman DH selector")}switch(e.huffmanDWSelector){case 0:case 1:n=getStandardTable(e.huffmanDWSelector+2);break;case 3:n=getCustomHuffmanTable(o,t,a);o++;break;default:throw new Jbig2Error("invalid Huffman DW selector")}if(e.bitmapSizeSelector){i=getCustomHuffmanTable(o,t,a);o++}else i=getStandardTable(1);s=e.aggregationInstancesSelector?getCustomHuffmanTable(o,t,a):getStandardTable(1);return{tableDeltaHeight:r,tableDeltaWidth:n,tableBitmapSize:i,tableAggregateInstances:s}}(e,a,this.customTables);c=new Reader(r,i,s)}let l=this.symbols;l||(this.symbols=l={});const h=[];for(const e of a){const t=l[e];t&&h.push(...t)}const u=new DecodingContext(r,i,s);l[t]=function decodeSymbolDictionary(e,t,a,r,i,s,o,c,l,h,u,d){if(e&&t)throw new Jbig2Error("symbol refinement with Huffman is not supported");const f=[];let g=0,p=(0,n.log2)(a.length+r);const m=u.decoder,b=u.contextCache;let y,w;if(e){y=getStandardTable(1);w=[];p=Math.max(p,1)}for(;f.length1)y=decodeTextRegion(e,t,r,g,0,n,1,a.concat(f),p,0,0,1,0,s,l,h,u,0,d);else{const e=decodeIAID(b,m,p),t=decodeInteger(b,"IARDX",m),n=decodeInteger(b,"IARDY",m);y=decodeRefinement(r,g,l,e=32){let a,r,s;switch(t){case 32:if(0===e)throw new Jbig2Error("no previous value in symbol ID table");r=n.readBits(2)+3;a=i[e-1].prefixLength;break;case 33:r=n.readBits(3)+3;a=0;break;case 34:r=n.readBits(7)+11;a=0;break;default:throw new Jbig2Error("invalid code length in symbol ID table")}for(s=0;s=0;b--){M=e?decodeMMRBitmap(T,l,h,!0):decodeBitmap(!1,l,h,a,!1,null,F,p);O[b]=M}for(E=0;E=0;y--){N^=O[y][E][D];R|=N<>8;$=d+E*f-D*g>>8;if(j>=0&&j+k<=r&&$>=0&&$+C<=i)for(b=0;b=i)){U=m[t];_=L[b];for(y=0;y=0&&e>1&7),l=1+(r>>4&7),h=[];let u,d,f=i;do{u=o.readBits(c);d=o.readBits(l);h.push(new HuffmanLine([f,u,d,0]));f+=1<>t&1;if(t<=0)this.children[a]=new HuffmanTreeNode(e);else{let r=this.children[a];r||(this.children[a]=r=new HuffmanTreeNode(null));r.buildTree(e,t-1)}}decodeNode(e){if(this.isLeaf){if(this.isOOB)return null;const t=e.readBits(this.rangeLength);return this.rangeLow+(this.isLowerRange?-t:t)}const t=this.children[e.readBit()];if(!t)throw new Jbig2Error("invalid Huffman data");return t.decodeNode(e)}}class HuffmanTable{constructor(e,t){t||this.assignPrefixCodes(e);this.rootNode=new HuffmanTreeNode(null);for(let t=0,a=e.length;t0&&this.rootNode.buildTree(a,a.prefixLength-1)}}decode(e){return this.rootNode.decodeNode(e)}assignPrefixCodes(e){const t=e.length;let a=0;for(let r=0;r=this.end)throw new Jbig2Error("end of data while reading bit");this.currentByte=this.data[this.position++];this.shift=7}const e=this.currentByte>>this.shift&1;this.shift--;return e}readBits(e){let t,a=0;for(t=e-1;t>=0;t--)a|=this.readBit()<=this.end?-1:this.data[this.position++]}}function getCustomHuffmanTable(e,t,a){let r=0;for(let n=0,i=t.length;n>a&1;a--}}if(r&&!l){const e=5;for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0});t.ArithmeticDecoder=void 0;const a=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];t.ArithmeticDecoder=class ArithmeticDecoder{constructor(e,t,a){this.data=e;this.bp=t;this.dataEnd=a;this.chigh=e[t];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}byteIn(){const e=this.data;let t=this.bp;if(255===e[t])if(e[t+1]>143){this.clow+=65280;this.ct=8}else{t++;this.clow+=e[t]<<9;this.ct=7;this.bp=t}else{t++;this.clow+=t65535){this.chigh+=this.clow>>16;this.clow&=65535}}readBit(e,t){let r=e[t]>>1,n=1&e[t];const i=a[r],s=i.qe;let o,c=this.a-s;if(this.chigh>15&1;this.clow=this.clow<<1&65535;this.ct--}while(0==(32768&c));this.a=c;e[t]=r<<1|n;return o}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.JpegStream=void 0;var r=a(19),n=a(5),i=a(28),s=a(2);class JpegStream extends r.DecodeStream{constructor(e,t,a){let r;for(;-1!==(r=e.getByte());)if(255===r){e.skip(-1);break}super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,s.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e={decodeTransform:void 0,colorTransform:void 0},t=this.dict.getArray("D","Decode");if(this.forceRGB&&Array.isArray(t)){const a=this.dict.get("BPC","BitsPerComponent")||8,r=t.length,n=new Int32Array(r);let i=!1;const s=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.JpegImage=void 0;var r=a(2),n=a(6);class JpegError extends r.BaseException{constructor(e){super(`JPEG error: ${e}`,"JpegError")}}class DNLMarkerError extends r.BaseException{constructor(e,t){super(e,"DNLMarkerError");this.scanLines=t}}class EOIMarkerError extends r.BaseException{constructor(e){super(e,"EOIMarkerError")}}const i=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),s=4017,o=799,c=3406,l=2276,h=1567,u=3784,d=5793,f=2896;function buildHuffmanTable(e,t){let a,r,n=0,i=16;for(;i>0&&!e[i-1];)i--;const s=[{children:[],index:0}];let o,c=s[0];for(a=0;a0;)c=s.pop();c.index++;s.push(c);for(;s.length<=a;){s.push(o={children:[],index:0});c.children[c.index]=o.children;c=o}n++}if(a+10){b--;return m>>b&1}m=e[t++];if(255===m){const r=e[t++];if(r){if(220===r&&d){t+=2;const r=(0,n.readUint16)(e,t);t+=2;if(r>0&&r!==a.scanLines)throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",r)}else if(217===r){if(d){const e=x*(8===a.precision?8:0);if(e>0&&Math.round(a.scanLines/e)>=10)throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, possibly caused by incorrect `scanLines` parameter",e)}throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data")}throw new JpegError(`unexpected marker ${(m<<8|r).toString(16)}`)}}b=7;return m>>>7}function decodeHuffman(e){let t=e;for(;;){t=t[readBit()];switch(typeof t){case"number":return t;case"object":continue}throw new JpegError("invalid huffman sequence")}}function receive(e){let t=0;for(;e>0;){t=t<<1|readBit();e--}return t}function receiveAndExtend(e){if(1===e)return 1===readBit()?1:-1;const t=receive(e);return t>=1<0){y--;return}let a=c;const r=l;for(;a<=r;){const r=decodeHuffman(e.huffmanTableAC),n=15&r,s=r>>4;if(0===n){if(s<15){y=receive(s)+(1<>4;if(0===n)if(o<15){y=receive(o)+(1<>4;if(0===r){if(s<15)break;n+=16;continue}n+=s;const o=i[n];e.blockData[t+o]=receiveAndExtend(r);n++}};let E,D,N,R,L=0;D=1===k?s[0].blocksPerLine*s[0].blocksPerColumn:f*a.mcusPerColumn;for(;L<=D;){const a=o?Math.min(D-L,o):D;if(a>0){for(v=0;v0?"unexpected":"excessive";(0,r.warn)(`decodeScan - ${e} MCU data, current marker is: ${E.invalid}`);t=E.offset}if(!(E.marker>=65488&&E.marker<=65495))break;t+=2}return t-p}function quantizeAndInverse(e,t,a){const r=e.quantizationTable,n=e.blockData;let i,g,p,m,b,y,w,S,x,k,C,v,F,O,T,M,E;if(!r)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){x=n[t+e];k=n[t+e+1];C=n[t+e+2];v=n[t+e+3];F=n[t+e+4];O=n[t+e+5];T=n[t+e+6];M=n[t+e+7];x*=r[e];if(0!=(k|C|v|F|O|T|M)){k*=r[e+1];C*=r[e+2];v*=r[e+3];F*=r[e+4];O*=r[e+5];T*=r[e+6];M*=r[e+7];i=d*x+128>>8;g=d*F+128>>8;p=C;m=T;b=f*(k-M)+128>>8;S=f*(k+M)+128>>8;y=v<<4;w=O<<4;i=i+g+1>>1;g=i-g;E=p*u+m*h+128>>8;p=p*h-m*u+128>>8;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;i=i+m+1>>1;m=i-m;g=g+p+1>>1;p=g-p;E=b*l+S*c+2048>>12;b=b*c-S*l+2048>>12;S=E;E=y*o+w*s+2048>>12;y=y*s-w*o+2048>>12;w=E;a[e]=i+S;a[e+7]=i-S;a[e+1]=g+w;a[e+6]=g-w;a[e+2]=p+y;a[e+5]=p-y;a[e+3]=m+b;a[e+4]=m-b}else{E=d*x+512>>10;a[e]=E;a[e+1]=E;a[e+2]=E;a[e+3]=E;a[e+4]=E;a[e+5]=E;a[e+6]=E;a[e+7]=E}}for(let e=0;e<8;++e){x=a[e];k=a[e+8];C=a[e+16];v=a[e+24];F=a[e+32];O=a[e+40];T=a[e+48];M=a[e+56];if(0!=(k|C|v|F|O|T|M)){i=d*x+2048>>12;g=d*F+2048>>12;p=C;m=T;b=f*(k-M)+2048>>12;S=f*(k+M)+2048>>12;y=v;w=O;i=4112+(i+g+1>>1);g=i-g;E=p*u+m*h+2048>>12;p=p*h-m*u+2048>>12;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;i=i+m+1>>1;m=i-m;g=g+p+1>>1;p=g-p;E=b*l+S*c+2048>>12;b=b*c-S*l+2048>>12;S=E;E=y*o+w*s+2048>>12;y=y*s-w*o+2048>>12;w=E;x=i+S;M=i-S;k=g+w;T=g-w;C=p+y;O=p-y;v=m+b;F=m-b;x<16?x=0:x>=4080?x=255:x>>=4;k<16?k=0:k>=4080?k=255:k>>=4;C<16?C=0:C>=4080?C=255:C>>=4;v<16?v=0:v>=4080?v=255:v>>=4;F<16?F=0:F>=4080?F=255:F>>=4;O<16?O=0:O>=4080?O=255:O>>=4;T<16?T=0:T>=4080?T=255:T>>=4;M<16?M=0:M>=4080?M=255:M>>=4;n[t+e]=x;n[t+e+8]=k;n[t+e+16]=C;n[t+e+24]=v;n[t+e+32]=F;n[t+e+40]=O;n[t+e+48]=T;n[t+e+56]=M}else{E=d*x+8192>>14;E=E<-2040?0:E>=2024?255:E+2056>>4;n[t+e]=E;n[t+e+8]=E;n[t+e+16]=E;n[t+e+24]=E;n[t+e+32]=E;n[t+e+40]=E;n[t+e+48]=E;n[t+e+56]=E}}}function buildComponentData(e,t){const a=t.blocksPerLine,r=t.blocksPerColumn,n=new Int16Array(64);for(let e=0;e=r)return null;const s=(0,n.readUint16)(e,t);if(s>=65472&&s<=65534)return{invalid:null,marker:s,offset:t};let o=(0,n.readUint16)(e,i);for(;!(o>=65472&&o<=65534);){if(++i>=r)return null;o=(0,n.readUint16)(e,i)}return{invalid:s.toString(16),marker:o,offset:i}}t.JpegImage=class JpegImage{constructor({decodeTransform:e=null,colorTransform:t=-1}={}){this._decodeTransform=e;this._colorTransform=t}parse(e,{dnlScanLines:t=null}={}){function readDataBlock(){const t=(0,n.readUint16)(e,o);o+=2;let a=o+t-2;const i=findNextFileMarker(e,a,o);if(i&&i.invalid){(0,r.warn)("readDataBlock - incorrect length, current marker is: "+i.invalid);a=i.offset}const s=e.subarray(o,a);o+=s.length;return s}function prepareComponents(e){const t=Math.ceil(e.samplesPerLine/8/e.maxH),a=Math.ceil(e.scanLines/8/e.maxV);for(let r=0,n=e.components.length;r>4==0)for(m=0;m<64;m++){x=i[m];a[x]=e[o++]}else{if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(m=0;m<64;m++){x=i[m];a[x]=(0,n.readUint16)(e,o);o+=2}}u[15&t]=a}break;case 65472:case 65473:case 65474:if(a)throw new JpegError("Only single frame JPEGs supported");o+=2;a={};a.extended=65473===g;a.progressive=65474===g;a.precision=e[o++];const k=(0,n.readUint16)(e,o);o+=2;a.scanLines=t||k;a.samplesPerLine=(0,n.readUint16)(e,o);o+=2;a.components=[];a.componentIds={};const C=e[o++];let v=0,F=0;for(p=0;p>4,n=15&e[o+1];v>4==0?f:d)[15&t]=buildHuffmanTable(a,n)}break;case 65501:o+=2;s=(0,n.readUint16)(e,o);o+=2;break;case 65498:const T=1==++h&&!t;o+=2;const M=e[o++],E=[];for(p=0;p>4];n.huffmanTableAC=d[15&i];E.push(n)}const D=e[o++],N=e[o++],R=e[o++];try{const t=decodeScan(e,o,a,E,s,D,N,R>>4,15&R,T);o+=t}catch(t){if(t instanceof DNLMarkerError){(0,r.warn)(`${t.message} -- attempting to re-parse the JPEG image.`);return this.parse(e,{dnlScanLines:t.scanLines})}if(t instanceof EOIMarkerError){(0,r.warn)(`${t.message} -- ignoring the rest of the image data.`);break e}throw t}break;case 65500:o+=4;break;case 65535:255!==e[o]&&o--;break;default:const L=findNextFileMarker(e,o-2,o-3);if(L&&L.invalid){(0,r.warn)("JpegImage.parse - unexpected data, current marker is: "+L.invalid);o=L.offset;break}if(!L||o>=e.length-1){(0,r.warn)("JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).");break e}throw new JpegError("JpegImage.parse - unknown marker: "+g.toString(16))}g=(0,n.readUint16)(e,o);o+=2}this.width=a.samplesPerLine;this.height=a.scanLines;this.jfif=c;this.adobe=l;this.components=[];for(let e=0,t=a.components.length;e>8)+C[f+1];return w}get _isColorConversionNeeded(){return this.adobe?!!this.adobe.transformCode:3===this.numComponents?0!==this._colorTransform&&(82!==this.components[0].index||71!==this.components[1].index||66!==this.components[2].index):1===this._colorTransform}_convertYccToRgb(e){let t,a,r;for(let n=0,i=e.length;n4)throw new JpegError("Unsupported color mode");const n=this._getLinearizedBlockData(e,t,r);if(1===this.numComponents&&a){const e=n.length,t=new Uint8ClampedArray(3*e);let a=0;for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});t.JpxStream=void 0;var r=a(19),n=a(30),i=a(2);class JpxStream extends r.DecodeStream{constructor(e,t,a){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,i.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e=new n.JpxImage;e.parse(this.bytes);const t=e.width,a=e.height,r=e.componentsCount,i=e.tiles.length;if(1===i)this.buffer=e.tiles[0].items;else{const n=new Uint8ClampedArray(t*a*r);for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.JpxImage=void 0;var r=a(2),n=a(6),i=a(26);class JpxError extends r.BaseException{constructor(e){super(`JPX error: ${e}`,"JpxError")}}const s={LL:0,LH:1,HL:1,HH:2};t.JpxImage=class JpxImage{constructor(){this.failOnCorruptedImage=!1}parse(e){if(65359===(0,n.readUint16)(e,0)){this.parseCodestream(e,0,e.length);return}const t=e.length;let a=0;for(;a>24&255,o>>16&255,o>>8&255,255&o);(0,r.warn)(`Unsupported header type ${o} (${i}).`)}l&&(a+=c)}}parseImageProperties(e){let t=e.getByte();for(;t>=0;){const a=t;t=e.getByte();if(65361===(a<<8|t)){e.skip(4);const t=e.getInt32()>>>0,a=e.getInt32()>>>0,r=e.getInt32()>>>0,n=e.getInt32()>>>0;e.skip(16);const i=e.getUint16();this.width=t-r;this.height=a-n;this.componentsCount=i;this.bitsPerComponent=8;return}}throw new JpxError("No size marker found in JPX stream")}parseCodestream(e,t,a){const i={};let s=!1;try{let o=t;for(;o+1>5;l=[];for(;a>3;t.mu=0}else{t.epsilon=e[a]>>3;t.mu=(7&e[a])<<8|e[a+1];a+=2}l.push(t)}b.SPqcds=l;if(i.mainHeader)i.QCD=b;else{i.currentTile.QCD=b;i.currentTile.QCC=[]}break;case 65373:f=(0,n.readUint16)(e,o);const y={};a=o+2;let w;if(i.SIZ.Csiz<257)w=e[a++];else{w=(0,n.readUint16)(e,a);a+=2}c=e[a++];switch(31&c){case 0:h=8;u=!0;break;case 1:h=16;u=!1;break;case 2:h=16;u=!0;break;default:throw new Error("Invalid SQcd value "+c)}y.noQuantization=8===h;y.scalarExpounded=u;y.guardBits=c>>5;l=[];for(;a>3;t.mu=0}else{t.epsilon=e[a]>>3;t.mu=(7&e[a])<<8|e[a+1];a+=2}l.push(t)}y.SPqcds=l;i.mainHeader?i.QCC[w]=y:i.currentTile.QCC[w]=y;break;case 65362:f=(0,n.readUint16)(e,o);const S={};a=o+2;const x=e[a++];S.entropyCoderWithCustomPrecincts=!!(1&x);S.sopMarkerUsed=!!(2&x);S.ephMarkerUsed=!!(4&x);S.progressionOrder=e[a++];S.layersCount=(0,n.readUint16)(e,a);a+=2;S.multipleComponentTransform=e[a++];S.decompositionLevelsCount=e[a++];S.xcb=2+(15&e[a++]);S.ycb=2+(15&e[a++]);const k=e[a++];S.selectiveArithmeticCodingBypass=!!(1&k);S.resetContextProbabilities=!!(2&k);S.terminationOnEachCodingPass=!!(4&k);S.verticallyStripe=!!(8&k);S.predictableTermination=!!(16&k);S.segmentationSymbolUsed=!!(32&k);S.reversibleTransformation=e[a++];if(S.entropyCoderWithCustomPrecincts){const t=[];for(;a>4})}S.precinctsSizes=t}const C=[];S.selectiveArithmeticCodingBypass&&C.push("selectiveArithmeticCodingBypass");S.terminationOnEachCodingPass&&C.push("terminationOnEachCodingPass");S.verticallyStripe&&C.push("verticallyStripe");S.predictableTermination&&C.push("predictableTermination");if(C.length>0){s=!0;(0,r.warn)(`JPX: Unsupported COD options (${C.join(", ")}).`)}if(i.mainHeader)i.COD=S;else{i.currentTile.COD=S;i.currentTile.COC=[]}break;case 65424:f=(0,n.readUint16)(e,o);d={};d.index=(0,n.readUint16)(e,o+2);d.length=(0,n.readUint32)(e,o+4);d.dataEnd=d.length+o-2;d.partIndex=e[o+8];d.partsCount=e[o+9];i.mainHeader=!1;if(0===d.partIndex){d.COD=i.COD;d.COC=i.COC.slice(0);d.QCD=i.QCD;d.QCC=i.QCC.slice(0)}i.currentTile=d;break;case 65427:d=i.currentTile;if(0===d.partIndex){initializeTile(i,d.index);buildPackets(i)}f=d.dataEnd-o;parseTilePackets(i,e,o,f);break;case 65363:(0,r.warn)("JPX: Codestream code 0xFF53 (COC) is not implemented.");case 65365:case 65367:case 65368:case 65380:f=(0,n.readUint16)(e,o);break;default:throw new Error("Unknown codestream code: "+t.toString(16))}o+=f}}catch(e){if(s||this.failOnCorruptedImage)throw new JpxError(e.message);(0,r.warn)(`JPX: Trying to recover from: "${e.message}".`)}this.tiles=function transformComponents(e){const t=e.SIZ,a=e.components,r=t.Csiz,n=[];for(let t=0,i=e.tiles.length;t>2);c[b++]=e+m>>h;c[b++]=e>>h;c[b++]=e+p>>h}else for(d=0;d>h;c[b++]=g-.34413*p-.71414*m>>h;c[b++]=g+1.772*p>>h}if(e)for(d=0,b=3;d>h}else for(let e=0;e>h;b+=r}}n.push(l)}return n}(i);this.width=i.SIZ.Xsiz-i.SIZ.XOsiz;this.height=i.SIZ.Ysiz-i.SIZ.YOsiz;this.componentsCount=i.SIZ.Csiz}};function calculateComponentDimensions(e,t){e.x0=Math.ceil(t.XOsiz/e.XRsiz);e.x1=Math.ceil(t.Xsiz/e.XRsiz);e.y0=Math.ceil(t.YOsiz/e.YRsiz);e.y1=Math.ceil(t.Ysiz/e.YRsiz);e.width=e.x1-e.x0;e.height=e.y1-e.y0}function calculateTileGrids(e,t){const a=e.SIZ,r=[];let n;const i=Math.ceil((a.Xsiz-a.XTOsiz)/a.XTsiz),s=Math.ceil((a.Ysiz-a.YTOsiz)/a.YTsiz);for(let e=0;e0?Math.min(r.xcb,n.PPx-1):Math.min(r.xcb,n.PPx);n.ycb_=a>0?Math.min(r.ycb,n.PPy-1):Math.min(r.ycb,n.PPy);return n}function buildPrecincts(e,t,a){const r=1<t.trx0?Math.ceil(t.trx1/r)-Math.floor(t.trx0/r):0,l=t.try1>t.try0?Math.ceil(t.try1/n)-Math.floor(t.try0/n):0,h=c*l;t.precinctParameters={precinctWidth:r,precinctHeight:n,numprecinctswide:c,numprecinctshigh:l,numprecincts:h,precinctWidthInSubband:s,precinctHeightInSubband:o}}function buildCodeblocks(e,t,a){const r=a.xcb_,n=a.ycb_,i=1<>r,c=t.tby0>>n,l=t.tbx1+i-1>>r,h=t.tby1+s-1>>n,u=t.resolution.precinctParameters,d=[],f=[];let g,p,m,b;for(p=c;pe.cbxMax&&(e.cbxMax=g);pe.cbyMax&&(e.cbyMax=p)}else f[b]=e={cbxMin:g,cbyMin:p,cbxMax:g,cbyMax:p};m.precinct=e}t.codeblockParameters={codeblockWidth:r,codeblockHeight:n,numcodeblockwide:l-o+1,numcodeblockhigh:h-c+1};t.codeblocks=d;t.precincts=f}function createPacket(e,t,a){const r=[],n=e.subbands;for(let e=0,a=n.length;ee.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[c],a=t.precinctParameters.numprecincts;for(;he.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[o],a=t.precinctParameters.numprecincts;for(;he.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[o],a=t.precinctParameters.numprecincts;if(!(l>=a)){for(;s=0;--e){const a=t.resolutions[e],r=g*a.precinctParameters.precinctWidth,n=g*a.precinctParameters.precinctHeight;h=Math.min(h,r);u=Math.min(u,n);d=Math.max(d,a.precinctParameters.numprecinctswide);f=Math.max(f,a.precinctParameters.numprecinctshigh);l[e]={width:r,height:n};g<<=1}a=Math.min(a,h);r=Math.min(r,u);n=Math.max(n,d);i=Math.max(i,f);s[o]={resolutions:l,minWidth:h,minHeight:u,maxNumWide:d,maxNumHigh:f}}return{components:s,minWidth:a,minHeight:r,maxNumWide:n,maxNumHigh:i}}function buildPackets(e){const t=e.SIZ,a=e.currentTile.index,r=e.tiles[a],n=t.Csiz;for(let e=0;e>>o&(1<0;){const e=i.shift();o=e.codeblock;void 0===o.data&&(o.data=[]);o.data.push({data:t,start:a+s,end:a+s+e.dataLength,codingpasses:e.codingpasses});s+=e.dataLength}}return s}function copyCoefficients(e,t,a,r,n,s,c,l,h){const u=r.tbx0,d=r.tby0,f=r.tbx1-r.tbx0,g=r.codeblocks,p="H"===r.type.charAt(0)?1:0,m="H"===r.type.charAt(1)?t:0;for(let a=0,b=g.length;a=s?U:U*(1<0?1-e:0)}const p=t.subbands[r],m=s[p.type];copyCoefficients(i,a,0,p,g?1:2**(f+m-o)*(1+n/2048),h+o-1,g,u,d)}m.push({width:a,height:n,items:i})}const y=p.calculate(m,r.tcx0,r.tcy0);return{left:r.tcx0,top:r.tcy0,width:y.width,height:y.height,items:y.items}}function initializeTile(e,t){const a=e.SIZ.Csiz,r=e.tiles[t];for(let t=0;t>=1;t>>=1;r++}r--;a=this.levels[r];a.items[a.index]=n;this.currentLevel=r;delete this.value}incrementValue(){const e=this.levels[this.currentLevel];e.items[e.index]++}nextLevel(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];e--;if(e<0){this.value=a;return!1}this.currentLevel=e;t=this.levels[e];t.items[t.index]=a;return!0}}class InclusionTree{constructor(e,t,a){const r=(0,n.log2)(Math.max(e,t))+1;this.levels=[];for(let n=0;na){this.currentLevel=r;this.propagateValues();return!1}e>>=1;t>>=1;r++}this.currentLevel=r-1;return!0}incrementValue(e){const t=this.levels[this.currentLevel];t.items[t.index]=e+1;this.propagateValues()}propagateValues(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];for(;--e>=0;){t=this.levels[e];t.items[t.index]=a}}nextLevel(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];t.items[t.index]=255;e--;if(e<0)return!1;this.currentLevel=e;t=this.levels[e];t.items[t.index]=a;return!0}}const o=function BitModelClosure(){const e=17,t=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]),a=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]),r=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);return class BitModel{constructor(e,n,i,s,o){this.width=e;this.height=n;let c;c="HH"===i?r:"HL"===i?a:t;this.contextLabelTable=c;const l=e*n;this.neighborsSignificance=new Uint8Array(l);this.coefficentsSign=new Uint8Array(l);let h;h=o>14?new Uint32Array(l):o>6?new Uint16Array(l):new Uint8Array(l);this.coefficentsMagnitude=h;this.processingFlags=new Uint8Array(l);const u=new Uint8Array(l);if(0!==s)for(let e=0;e0,o=t+10){c=a-n;s&&(r[c-1]+=16);o&&(r[c+1]+=16);r[c]+=4}if(e+1=a)break;s[d]&=-2;if(r[d]||!i[d])continue;const g=c[i[d]];if(e.readBit(o,g)){const e=this.decodeSignBit(t,u,d);n[d]=e;r[d]=1;this.setNeighborsSignificance(t,u,d);s[d]|=2}l[d]++;s[d]|=1}}}decodeSignBit(e,t,a){const r=this.width,n=this.height,i=this.coefficentsMagnitude,s=this.coefficentsSign;let o,c,l,h,u,d;h=t>0&&0!==i[a-1];if(t+10&&0!==i[a-r];if(e+1=0){u=9+o;d=this.decoder.readBit(this.contexts,u)}else{u=9-o;d=1^this.decoder.readBit(this.contexts,u)}return d}runMagnitudeRefinementPass(){const e=this.decoder,t=this.width,a=this.height,r=this.coefficentsMagnitude,n=this.neighborsSignificance,i=this.contexts,s=this.bitsDecoded,o=this.processingFlags,c=t*a,l=4*t;for(let a,h=0;h>1;let n,i,s,o;const c=-1.586134342059924,l=-.052980118572961,h=.882911075530934,u=.443506852043971,d=1.230174104914001;n=(t|=0)-3;for(i=r+4;i--;n+=2)e[n]*=.8128930661159609;n=t-2;s=u*e[n-1];for(i=r+3;i--;n+=2){o=u*e[n+1];e[n]=d*e[n]-s-o;if(!i--)break;n+=2;s=u*e[n+1];e[n]=d*e[n]-s-o}n=t-1;s=h*e[n-1];for(i=r+2;i--;n+=2){o=h*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=h*e[n+1];e[n]-=s+o}n=t;s=l*e[n-1];for(i=r+1;i--;n+=2){o=l*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=l*e[n+1];e[n]-=s+o}if(0!==r){n=t+1;s=c*e[n-1];for(i=r;i--;n+=2){o=c*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=c*e[n+1];e[n]-=s+o}}}}class ReversibleTransform extends Transform{filter(e,t,a){const r=a>>1;let n,i;for(n=t|=0,i=r+1;i--;n+=2)e[n]-=e[n-1]+e[n+1]+2>>2;for(n=t+1,i=r;i--;n+=2)e[n]+=e[n-1]+e[n+1]>>1}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LZWStream=void 0;var r=a(19);class LZWStream extends r.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;const r=4096,n={earlyChange:a,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(r),dictionaryLengths:new Uint16Array(r),dictionaryPrevCodes:new Uint16Array(r),currentSequence:new Uint8Array(r),currentSequenceLength:0};for(let e=0;e<256;++e){n.dictionaryValues[e]=e;n.dictionaryLengths[e]=1}this.lzwState=n}readBits(e){let t=this.bitsCached,a=this.cachedData;for(;t>>t&(1<0;if(e<256){d[0]=e;f=1}else{if(!(e>=258)){if(256===e){h=9;s=258;f=0;continue}this.eof=!0;delete this.lzwState;break}if(e=0;t--){d[t]=o[a];a=l[a]}}else d[f++]=d[0]}if(n){l[s]=u;c[s]=c[u]+1;o[s]=d[0];s++;h=s+i&s+i-1?h:0|Math.min(Math.log(s+i)/.6931471805599453+1,12)}u=e;g+=f;if(r{Object.defineProperty(t,"__esModule",{value:!0});t.PredictorStream=void 0;var r=a(19),n=a(5),i=a(2);class PredictorStream extends r.DecodeStream{constructor(e,t,a){super(t);if(!(a instanceof n.Dict))return e;const r=this.predictor=a.get("Predictor")||1;if(r<=1)return e;if(2!==r&&(r<10||r>15))throw new i.FormatError(`Unsupported predictor: ${r}`);this.readBlock=2===r?this.readBlockTiff:this.readBlockPng;this.str=e;this.dict=e.dict;const s=this.colors=a.get("Colors")||1,o=this.bits=a.get("BPC","BitsPerComponent")||8,c=this.columns=a.get("Columns")||1;this.pixBytes=s*o+7>>3;this.rowBytes=c*s*o+7>>3;return this}readBlockTiff(){const e=this.rowBytes,t=this.bufferLength,a=this.ensureBuffer(t+e),r=this.bits,n=this.colors,i=this.str.getBytes(e);this.eof=!i.length;if(this.eof)return;let s,o=0,c=0,l=0,h=0,u=t;if(1===r&&1===n)for(s=0;s>1;e^=e>>2;e^=e>>4;o=(1&e)<<7;a[u++]=e}else if(8===r){for(s=0;s>8&255;a[u++]=255&e}}else{const e=new Uint8Array(n+1),u=(1<>l-r)&u;l-=r;c=c<=8){a[f++]=c>>h-8&255;h-=8}}h>0&&(a[f++]=(c<<8-h)+(o&(1<<8-h)-1))}this.bufferLength+=e}readBlockPng(){const e=this.rowBytes,t=this.pixBytes,a=this.str.getByte(),r=this.str.getBytes(e);this.eof=!r.length;if(this.eof)return;const n=this.bufferLength,s=this.ensureBuffer(n+e);let o=s.subarray(n-e,n);0===o.length&&(o=new Uint8Array(e));let c,l,h,u=n;switch(a){case 0:for(c=0;c>1)+r[c];for(;c>1)+r[c]&255;u++}break;case 4:for(c=0;c{Object.defineProperty(t,"__esModule",{value:!0});t.RunLengthStream=void 0;var r=a(19);class RunLengthStream extends r.DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict}readBlock(){const e=this.str.getBytes(2);if(!e||e.length<2||128===e[0]){this.eof=!0;return}let t,a=this.bufferLength,r=e[0];if(r<128){t=this.ensureBuffer(a+r+1);t[a++]=e[1];if(r>0){const e=this.str.getBytes(r);t.set(e,a);a+=r}}else{r=257-r;const n=e[1];t=this.ensureBuffer(a+r+1);for(let e=0;e{Object.defineProperty(t,"__esModule",{value:!0});t.Font=t.ErrorFont=void 0;var r=a(2),n=a(35),i=a(38),s=a(40),o=a(39),c=a(37),l=a(41),h=a(42),u=a(43),d=a(44),f=a(45),g=a(46),p=a(16),m=a(47),b=a(6),y=a(10),w=a(48);const S=[[57344,63743],[1048576,1114109]],x=1e3,k=["ascent","bbox","black","bold","charProcOperatorList","composite","cssFontInfo","data","defaultVMetrics","defaultWidth","descent","fallbackName","fontMatrix","fontType","isType3Font","italic","loadedName","mimetype","missingFile","name","remeasure","subtype","type","vertical"],C=["cMap","defaultEncoding","differences","isMonospace","isSerifFont","isSymbolicFont","seacMap","toFontChar","toUnicode","vmetrics","widths"];function adjustWidths(e){if(!e.fontMatrix)return;if(e.fontMatrix[0]===r.FONT_IDENTITY_MATRIX[0])return;const t=.001/e.fontMatrix[0],a=e.widths;for(const e in a)a[e]*=t;e.defaultWidth*=t}function amendFallbackToUnicode(e){if(!e.fallbackToUnicode)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;const t=[];for(const a in e.fallbackToUnicode)e.toUnicode.has(a)||(t[a]=e.fallbackToUnicode[a]);t.length>0&&e.toUnicode.amend(t)}class Glyph{constructor(e,t,a,r,n,i,o,c,l){this.originalCharCode=e;this.fontChar=t;this.unicode=a;this.accent=r;this.width=n;this.vmetric=i;this.operatorListId=o;this.isSpace=c;this.isInFont=l;const h=(0,s.getCharUnicodeCategory)(a);this.isWhitespace=h.isWhitespace;this.isZeroWidthDiacritic=h.isZeroWidthDiacritic;this.isInvisibleFormatMark=h.isInvisibleFormatMark}matchesForCache(e,t,a,r,n,i,s,o,c){return this.originalCharCode===e&&this.fontChar===t&&this.unicode===a&&this.accent===r&&this.width===n&&this.vmetric===i&&this.operatorListId===s&&this.isSpace===o&&this.isInFont===c}}function int16(e,t){return(e<<8)+t}function writeSignedInt16(e,t,a){e[t+1]=a;e[t]=a>>>8}function signedInt16(e,t){const a=(e<<8)+t;return 32768&a?a-65536:a}function string16(e){return String.fromCharCode(e>>8&255,255&e)}function safeString16(e){e>32767?e=32767:e<-32768&&(e=-32768);return String.fromCharCode(e>>8&255,255&e)}function isTrueTypeCollectionFile(e){const t=e.peekBytes(4);return"ttcf"===(0,r.bytesToString)(t)}function getFontFileType(e,{type:t,subtype:a,composite:n}){let i,s;if(function isTrueTypeFile(e){const t=e.peekBytes(4);return 65536===(0,b.readUint32)(t,0)||"true"===(0,r.bytesToString)(t)}(e)||isTrueTypeCollectionFile(e))i=n?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){const t=e.peekBytes(4);return"OTTO"===(0,r.bytesToString)(t)}(e))i=n?"CIDFontType2":"OpenType";else if(function isType1File(e){const t=e.peekBytes(2);return 37===t[0]&&33===t[1]||128===t[0]&&1===t[1]}(e))i=n?"CIDFontType0":"MMType1"===t?"MMType1":"Type1";else if(function isCFFFile(e){const t=e.peekBytes(4);return t[0]>=1&&t[3]>=1&&t[3]<=4}(e))if(n){i="CIDFontType0";s="CIDFontType0C"}else{i="MMType1"===t?"MMType1":"Type1";s="Type1C"}else{(0,r.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");i=t;s=a}return[i,s]}function applyStandardFontGlyphMap(e,t){for(const a in t)e[+a]=t[a]}function buildToFontChar(e,t,a){const r=[];let n;for(let a=0,i=e.length;ad){l++;if(l>=S.length){(0,r.warn)("Ran out of space in font private use area.");break}u=S[l][0];d=S[l][1]}const p=u++;0===g&&(g=a);let m=n.get(f);"string"==typeof m&&(m=m.codePointAt(0));if(m&&m=a||r.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,n]of t)n>=a||r.push({fontCharCode:e,glyphId:n});0===r.length&&r.push({fontCharCode:0,glyphId:0});r.sort((function fontGetRangesSort(e,t){return e.fontCharCode-t.fontCharCode}));const n=[],i=r.length;for(let e=0;e65535?2:1;let s,o,c,l,h="\0\0"+string16(i)+"\0\0"+(0,r.string32)(4+8*i);for(s=n.length-1;s>=0&&!(n[s][0]<=65535);--s);const u=s+1;n[s][0]<65535&&65535===n[s][1]&&(n[s][1]=65534);const d=n[s][1]<65535?1:0,f=u+d,g=m.OpenTypeFileBuilder.getSearchParams(f,2);let p,b,y,w,S="",x="",k="",C="",v="",F=0;for(s=0,o=u;s0){x+="ÿÿ";S+="ÿÿ";k+="\0";C+="\0\0"}const O="\0\0"+string16(2*f)+string16(g.range)+string16(g.entry)+string16(g.rangeShift)+x+"\0\0"+S+k+C+v;let T="",M="";if(i>1){h+="\0\0\n"+(0,r.string32)(4+8*i+4+O.length);T="";for(s=0,o=n.length;se||!l)&&(l=e);h 123 are reserved for internal usage");c|=1<65535&&(h=65535)}else{l=0;h=255}const u=e.bbox||[0,0,0,0],d=a.unitsPerEm||1/(e.fontMatrix||r.FONT_IDENTITY_MATRIX)[0],f=e.ascentScaled?1:d/x,g=a.ascent||Math.round(f*(e.ascent||u[3]));let p=a.descent||Math.round(f*(e.descent||u[1]));p>0&&e.descent>0&&u[1]<0&&(p=-p);const m=a.yMax||g,b=-a.yMin||-p;return"\0$ô\0\0\0Š»\0\0\0ŒŠ»\0\0ß\x001\0\0\0\0"+String.fromCharCode(e.fixedPitch?9:0)+"\0\0\0\0\0\0"+(0,r.string32)(n)+(0,r.string32)(i)+(0,r.string32)(o)+(0,r.string32)(c)+"*21*"+string16(e.italicAngle?1:0)+string16(l||e.firstChar)+string16(h||e.lastChar)+string16(g)+string16(p)+"\0d"+string16(m)+string16(b)+"\0\0\0\0\0\0\0\0"+string16(e.xHeight)+string16(e.capHeight)+string16(0)+string16(l||e.firstChar)+"\0"}function createPostTable(e){const t=Math.floor(65536*e.italicAngle);return"\0\0\0"+(0,r.string32)(t)+"\0\0\0\0"+(0,r.string32)(e.fixedPitch?1:0)+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}function createPostscriptName(e){return e.replace(/[^\x21-\x7E]|[[\](){}<>/%]/g,"").slice(0,63)}function createNameTable(e,t){t||(t=[[],[]]);const a=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||createPostscriptName(e),t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"],r=[];let n,i,s,o,c;for(n=0,i=a.length;n0;if((p||m)&&"CIDFontType2"===a&&this.cidEncoding.startsWith("Identity-")){const a=e.cidToGidMap,r=[];applyStandardFontGlyphMap(r,(0,l.getGlyphMapForStandardFonts)());/Arial-?Black/i.test(t)?applyStandardFontGlyphMap(r,(0,l.getSupplementalGlyphMapForArialBlack)()):/Calibri/i.test(t)&&applyStandardFontGlyphMap(r,(0,l.getSupplementalGlyphMapForCalibri)());if(a){for(const e in r){const t=r[e];void 0!==a[t]&&(r[+e]=a[t])}a.length!==this.toUnicode.length&&e.hasIncludedToUnicodeMap&&this.toUnicode instanceof h.IdentityToUnicodeMap&&this.toUnicode.forEach((function(e,t){const n=r[e];void 0===a[n]&&(r[+e]=t)}))}this.toUnicode instanceof h.IdentityToUnicodeMap||this.toUnicode.forEach((function(e,t){r[+e]=t}));this.toFontChar=r;this.toUnicode=new h.ToUnicodeMap(r)}else if(/Symbol/i.test(u))this.toFontChar=buildToFontChar(c.SymbolSetEncoding,(0,o.getGlyphsUnicode)(),this.differences);else if(/Dingbats/i.test(u)){/Wingdings/i.test(t)&&(0,r.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats.");this.toFontChar=buildToFontChar(c.ZapfDingbatsEncoding,(0,o.getDingbatsGlyphsUnicode)(),this.differences)}else if(p){const e=buildToFontChar(this.defaultEncoding,(0,o.getGlyphsUnicode)(),this.differences);"CIDFontType2"!==a||this.cidEncoding.startsWith("Identity-")||this.toUnicode instanceof h.IdentityToUnicodeMap||this.toUnicode.forEach((function(t,a){e[+t]=a}));this.toFontChar=e}else{const e=(0,o.getGlyphsUnicode)(),a=[];this.toUnicode.forEach(((t,r)=>{if(!this.composite){const a=this.differences[t]||this.defaultEncoding[t],n=(0,s.getUnicodeForGlyph)(a,e);-1!==n&&(r=n)}a[+t]=r}));this.composite&&this.toUnicode instanceof h.IdentityToUnicodeMap&&/Verdana/i.test(t)&&applyStandardFontGlyphMap(a,(0,l.getGlyphMapForStandardFonts)());this.toFontChar=a}amendFallbackToUnicode(e);this.loadedName=u.split("-")[0];this.fontType=(0,i.getFontType)(a,n,e.isStandardFont)}checkAndRepair(e,t,a){const s=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function readTables(e,t){const a=Object.create(null);a["OS/2"]=null;a.cmap=null;a.head=null;a.hhea=null;a.hmtx=null;a.maxp=null;a.name=null;a.post=null;for(let r=0;r>>0,r=e.getInt32()>>>0,n=e.getInt32()>>>0,i=e.pos;e.pos=e.start||0;e.skip(r);const s=e.getBytes(n);e.pos=i;if("head"===t){s[8]=s[9]=s[10]=s[11]=0;s[17]|=32}return{tag:t,checksum:a,length:n,offset:r,data:s}}function readOpenTypeHeader(e){return{version:e.getString(4),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function sanitizeGlyph(e,t,a,r,n,i){const s={length:0,sizeOfInstructions:0};if(a-t<=12)return s;const o=e.subarray(t,a);let c=signedInt16(o[0],o[1]);if(c<0){c=-1;writeSignedInt16(o,0,c);r.set(o,n);s.length=o.length;return s}let l,h=10,u=0;for(l=0;lo.length)return s;if(!i&&f>0){r.set(o.subarray(0,d),n);r.set([0,0],n+d);r.set(o.subarray(g,m),n+d+2);m-=f;o.length-m>3&&(m=m+3&-4);s.length=m;return s}if(o.length-m>3){m=m+3&-4;r.set(o.subarray(0,m),n);s.length=m;return s}r.set(o,n);s.length=o.length;return s}function readNameTable(e){const a=(t.start||0)+e.offset;t.pos=a;const r=[[],[]],n=e.length,i=a+n;if(0!==t.getUint16()||n<6)return r;const s=t.getUint16(),o=t.getUint16(),c=[];let l,h;for(l=0;li)continue;t.pos=n;const s=e.name;if(e.encoding){let a="";for(let r=0,n=e.length;r0&&(h+=e-1)}}else{if(b||w){(0,r.warn)("TT: nested FDEFs not allowed");m=!0}b=!0;d=h;s=f.pop();t.functionsDefined[s]={data:c,i:h}}else if(!b&&!w){s=f.at(-1);if(isNaN(s))(0,r.info)("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[s]=!0;if(s in t.functionsStackDeltas){const e=f.length+t.functionsStackDeltas[s];if(e<0){(0,r.warn)("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}f.length=e}else if(s in t.functionsDefined&&!p.includes(s)){g.push({data:c,i:h,stackTop:f.length-1});p.push(s);o=t.functionsDefined[s];if(!o){(0,r.warn)("TT: CALL non-existent function");t.hintsValid=!1;return}c=o.data;h=o.i}}}if(!b&&!w){let t=0;e<=142?t=l[e]:e>=192&&e<=223?t=-1:e>=224&&(t=-2);if(e>=113&&e<=117){n=f.pop();isNaN(n)||(t=2*-n)}for(;t<0&&f.length>0;){f.pop();t++}for(;t>0;){f.push(NaN);t--}}}t.tooComplexToFollowFunctions=m;const S=[c];h>c.length&&S.push(new Uint8Array(h-c.length));if(d>u){(0,r.warn)("TT: complementing a missing function tail");S.push(new Uint8Array([34,45]))}!function foldTTTable(e,t){if(t.length>1){let a,r,n=0;for(a=0,r=t.length;a>>0,s=[];for(let t=0;t>>0);const o={ttcTag:t,majorVersion:a,minorVersion:n,numFonts:i,offsetTable:s};switch(a){case 1:return o;case 2:o.dsigTag=e.getInt32()>>>0;o.dsigLength=e.getInt32()>>>0;o.dsigOffset=e.getInt32()>>>0;return o}throw new r.FormatError(`Invalid TrueType Collection majorVersion: ${a}.`)}(e),i=t.split("+");let s;for(let o=0;o0||!(a.cMap instanceof p.IdentityCMap));if("OTTO"===d.version&&!t||!f.head||!f.hhea||!f.maxp||!f.post){w=new y.Stream(f["CFF "].data);b=new u.CFFFont(w,a);adjustWidths(a);return this.convert(e,b,a)}delete f.glyf;delete f.loca;delete f.fpgm;delete f.prep;delete f["cvt "];this.isOpenType=!0}if(!f.maxp)throw new r.FormatError('Required "maxp" table is not found');t.pos=(t.start||0)+f.maxp.offset;const x=t.getInt32(),k=t.getUint16();if(a.scaleFactors&&a.scaleFactors.length===k&&S){const{scaleFactors:e}=a,t=int16(f.head.data[50],f.head.data[51]),r=new g.GlyfTable({glyfTable:f.glyf.data,isGlyphLocationsLong:t,locaTable:f.loca.data,numGlyphs:k});r.scale(e);const{glyf:n,loca:i,isLocationLong:s}=r.write();f.glyf.data=n;f.loca.data=i;if(s!==!!t){f.head.data[50]=0;f.head.data[51]=s?1:0}const o=f.hmtx.data;for(let t=0;t>8&255;o[a+1]=255&r;writeSignedInt16(o,a+2,Math.round(e[t]*signedInt16(o[a+2],o[a+3])))}}let C=k+1,v=!0;if(C>65535){v=!1;C=k;(0,r.warn)("Not enough space in glyfs to duplicate first glyph.")}let F=0,O=0;if(x>=65536&&f.maxp.length>=22){t.pos+=8;if(t.getUint16()>2){f.maxp.data[14]=0;f.maxp.data[15]=2}t.pos+=4;F=t.getUint16();t.pos+=4;O=t.getUint16()}f.maxp.data[4]=C>>8;f.maxp.data[5]=255&C;const T=function sanitizeTTPrograms(e,t,a,n){const i={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,i);t&&sanitizeTTProgram(t,i);e&&function checkInvalidFunctions(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){(0,r.warn)("TT: more functions defined than expected");e.hintsValid=!1}else for(let a=0,n=e.functionsUsed.length;at){(0,r.warn)("TT: invalid function id: "+a);e.hintsValid=!1;return}if(e.functionsUsed[a]&&!e.functionsDefined[a]){(0,r.warn)("TT: undefined function: "+a);e.hintsValid=!1;return}}}(i,n);if(a&&1&a.length){const e=new Uint8Array(a.length+1);e.set(a.data);a.data=e}return i.hintsValid}(f.fpgm,f.prep,f["cvt "],F);if(!T){delete f.fpgm;delete f.prep;delete f["cvt "]}!function sanitizeMetrics(e,t,a,n,i,s){if(!t){a&&(a.data=null);return}e.pos=(e.start||0)+t.offset;e.pos+=4;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;const o=e.getUint16();e.pos+=8;e.pos+=2;let c=e.getUint16();if(0!==o){if(!(2&int16(n.data[44],n.data[45]))){t.data[22]=0;t.data[23]=0}}if(c>i){(0,r.info)(`The numOfMetrics (${c}) should not be greater than the numGlyphs (${i}).`);c=i;t.data[34]=(65280&c)>>8;t.data[35]=255&c}const l=i-c-(a.length-4*c>>1);if(l>0){const e=new Uint8Array(a.length+2*l);e.set(a.data);if(s){e[a.length]=a.data[2];e[a.length+1]=a.data[3]}a.data=e}}(t,f.hhea,f.hmtx,f.head,C,v);if(!f.head)throw new r.FormatError('Required "head" table is not found');!function sanitizeHead(e,t,a){const n=e.data,i=function int32(e,t,a,r){return(e<<24)+(t<<16)+(a<<8)+r}(n[0],n[1],n[2],n[3]);if(i>>16!=1){(0,r.info)("Attempting to fix invalid version in head table: "+i);n[0]=0;n[1]=1;n[2]=0;n[3]=0}const s=int16(n[50],n[51]);if(s<0||s>1){(0,r.info)("Attempting to fix invalid indexToLocFormat in head table: "+s);const e=t+1;if(a===e<<1){n[50]=0;n[51]=0}else{if(a!==e<<2)throw new r.FormatError("Could not fix indexToLocFormat: "+s);n[50]=0;n[51]=1}}}(f.head,k,S?f.loca.length:0);let M=Object.create(null);if(S){const e=int16(f.head.data[50],f.head.data[51]),t=function sanitizeGlyphLocations(e,t,a,r,n,i,s){let o,c,l;if(r){o=4;c=function fontItemDecodeLong(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};l=function fontItemEncodeLong(e,t,a){e[t]=a>>>24&255;e[t+1]=a>>16&255;e[t+2]=a>>8&255;e[t+3]=255&a}}else{o=2;c=function fontItemDecode(e,t){return e[t]<<9|e[t+1]<<1};l=function fontItemEncode(e,t,a){e[t]=a>>9&255;e[t+1]=a>>1&255}}const h=i?a+1:a,u=o*(1+h),d=new Uint8Array(u);d.set(e.data.subarray(0,u));e.data=d;const f=t.data,g=f.length,p=new Uint8Array(g);let m,b;const y=[];for(m=0,b=0;mg&&(e=g);y.push({index:m,offset:e,endOffset:0})}y.sort(((e,t)=>e.offset-t.offset));for(m=0;me.index-t.index));for(m=0;ms&&(s=e.sizeOfInstructions);S+=t;l(d,b,S)}if(0===S){const e=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(m=0,b=o;ma+S)t.data=p.subarray(0,a+S);else{t.data=new Uint8Array(a+S);t.data.set(p.subarray(0,S))}t.data.set(p.subarray(0,a),S);l(e.data,d.length-o,S+a)}else t.data=p.subarray(0,S);return{missingGlyphs:w,maxSizeOfInstructions:s}}(f.loca,f.glyf,k,e,T,v,O);M=t.missingGlyphs;if(x>=65536&&f.maxp.length>=22){f.maxp.data[26]=t.maxSizeOfInstructions>>8;f.maxp.data[27]=255&t.maxSizeOfInstructions}}if(!f.hhea)throw new r.FormatError('Required "hhea" table is not found');if(0===f.hhea.data[10]&&0===f.hhea.data[11]){f.hhea.data[10]=255;f.hhea.data[11]=255}const E={unitsPerEm:int16(f.head.data[18],f.head.data[19]),yMax:int16(f.head.data[42],f.head.data[43]),yMin:signedInt16(f.head.data[38],f.head.data[39]),ascent:signedInt16(f.hhea.data[4],f.hhea.data[5]),descent:signedInt16(f.hhea.data[6],f.hhea.data[7]),lineGap:signedInt16(f.hhea.data[8],f.hhea.data[9])};this.ascent=E.ascent/E.unitsPerEm;this.descent=E.descent/E.unitsPerEm;this.lineGap=E.lineGap/E.unitsPerEm;if(this.cssFontInfo&&this.cssFontInfo.lineHeight){this.lineHeight=this.cssFontInfo.metrics.lineHeight;this.lineGap=this.cssFontInfo.metrics.lineGap}else this.lineHeight=this.ascent-this.descent+this.lineGap;f.post&&function readPostScriptTable(e,a,n){const s=(t.start||0)+e.offset;t.pos=s;const o=s+e.length,c=t.getInt32();t.skip(28);let l,h,u=!0;switch(c){case 65536:l=i.MacStandardGlyphOrdering;break;case 131072:const e=t.getUint16();if(e!==n){u=!1;break}const s=[];for(h=0;h=32768){u=!1;break}s.push(e)}if(!u)break;const d=[],f=[];for(;t.pos65535)throw new r.FormatError("Max size of CID is 65,535");let i=-1;t?i=n:void 0!==e[n]&&(i=e[n]);i>=0&&i>>0;let h=!1;if(!c||c.platformId!==r||c.encodingId!==i){if(0!==r||0!==i&&1!==i&&3!==i)if(1===r&&0===i)h=!0;else if(3!==r||1!==i||!n&&c){if(a&&3===r&&0===i){h=!0;let a=!0;if(e>3;e.push(r);a=Math.max(r,a)}const r=[];for(let e=0;e<=a;e++)r.push({firstCode:t.getUint16(),entryCount:t.getUint16(),idDelta:signedInt16(t.getByte(),t.getByte()),idRangePos:t.pos+t.getUint16()});for(let a=0;a<256;a++)if(0===e[a]){t.pos=r[0].idRangePos+2*a;g=t.getUint16();d.push({charCode:a,glyphId:g})}else{const n=r[e[a]];for(f=0;f>1;t.skip(6);const a=[];let r;for(r=0;r>1)-(e-r);i.offsetIndex=n;o=Math.max(o,n+i.end-i.start+1)}else i.offsetIndex=-1}const c=[];for(f=0;f>>0;for(f=0;f>>0,a=t.getInt32()>>>0;let r=t.getInt32()>>>0;for(let t=e;t<=a;t++)d.push({charCode:t,glyphId:r++})}}}d.sort((function(e,t){return e.charCode-t.charCode}));for(let e=1;e=61440&&t<=61695&&(t&=255);D[t]=l[e].glyphId}if(a.glyphNames&&(d.length||this.differences.length))for(let e=0;e<256;++e){if(!g&&void 0!==D[e])continue;const t=this.differences[e]||d[e];if(!t)continue;const r=a.glyphNames.indexOf(t);r>0&&hasGlyph(r)&&(D[e]=r)}}0===D.length&&(D[0]=0);let N=C-1;v||(N=0);if(!a.cssFontInfo){const e=adjustMapping(D,hasGlyph,N,this.toUnicode);this.toFontChar=e.toFontChar;f.cmap={tag:"cmap",data:createCmapTable(e.charCodeToGlyphId,e.toUnicodeExtraMap,C)};f["OS/2"]&&function validateOS2Table(e,t){t.pos=(t.start||0)+e.offset;const a=t.getUint16();t.skip(60);const r=t.getUint16();if(a<4&&768&r)return!1;if(t.getUint16()>t.getUint16())return!1;t.skip(6);if(0===t.getUint16())return!1;e.data[8]=e.data[9]=0;return!0}(f["OS/2"],t)||(f["OS/2"]={tag:"OS/2",data:createOS2Table(a,e.charCodeToGlyphId,E)})}if(!S)try{w=new y.Stream(f["CFF "].data);b=new n.CFFParser(w,a,i.SEAC_ANALYSIS_ENABLED).parse();b.duplicateFirstGlyph();const e=new n.CFFCompiler(b);f["CFF "].data=e.compile()}catch(e){(0,r.warn)("Failed to compile font "+a.loadedName)}if(f.name){const t=readNameTable(f.name);f.name.data=createNameTable(e,t);this.psName=t[0][6]||null}else f.name={tag:"name",data:createNameTable(this.name)};const R=new m.OpenTypeFileBuilder(d.version);for(const e in f)R.addTable(e,f[e].data);return R.toArray()}convert(e,t,a){a.fixedPitch=!1;a.builtInEncoding&&function adjustToUnicode(e,t){if(e.isInternalFont)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;const a=[],r=(0,o.getGlyphsUnicode)();for(const n in t){if(e.hasIncludedToUnicodeMap){if(e.toUnicode.has(n))continue}else if(e.hasEncoding&&(0===e.differences.length||void 0!==e.differences[n]))continue;const i=t[n],o=(0,s.getUnicodeForGlyph)(i,r);-1!==o&&(a[n]=String.fromCharCode(o))}a.length>0&&e.toUnicode.amend(a)}(a,a.builtInEncoding);let n=1;t instanceof u.CFFFont&&(n=t.numGlyphs-1);const l=t.getGlyphMapping(a);let d=null,f=l,g=null;if(!a.cssFontInfo){d=adjustMapping(l,t.hasGlyphId.bind(t),n,this.toUnicode);this.toFontChar=d.toFontChar;f=d.charCodeToGlyphId;g=d.toUnicodeExtraMap}const p=t.numGlyphs;function getCharCodes(e,t){let a=null;for(const r in e)if(t===e[r]){a||(a=[]);a.push(0|r)}return a}function createCharCode(e,t){for(const a in e)if(t===e[a])return 0|a;d.charCodeToGlyphId[d.nextAvailableFontCharCode]=t;return d.nextAvailableFontCharCode++}const b=t.seacs;if(d&&i.SEAC_ANALYSIS_ENABLED&&b&&b.length){const e=a.fontMatrix||r.FONT_IDENTITY_MATRIX,n=t.getCharset(),i=Object.create(null);for(let t in b){t|=0;const a=b[t],r=c.StandardEncoding[a[2]],s=c.StandardEncoding[a[3]],o=n.indexOf(r),h=n.indexOf(s);if(o<0||h<0)continue;const u={x:a[0]*e[0]+a[1]*e[2]+e[4],y:a[0]*e[1]+a[1]*e[3]+e[5]},f=getCharCodes(l,t);if(f)for(let e=0,t=f.length;et.length%2==1,r=this.toUnicode instanceof h.IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let n=0,i=e.length;n55295&&(i<57344||i>65533)&&n++;if(this.toUnicode){const e=r(i);if(-1!==e){if(hasCurrentBufErrors()){t.push(a.join(""));a.length=0}for(let t=(this.cMap?this.cMap.getCharCodeLength(e):1)-1;t>=0;t--)a.push(String.fromCharCode(e>>8*t&255));continue}}if(!hasCurrentBufErrors()){t.push(a.join(""));a.length=0}a.push(String.fromCodePoint(i))}t.push(a.join(""));return t}};t.ErrorFont=class ErrorFont{constructor(e){this.error=e;this.loadedName="g_font_error";this.missingFile=!0}charsToGlyphs(){return[]}encodeString(e){return[e]}exportData(e=!1){return{error:this.error}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CFFTopDict=t.CFFStrings=t.CFFStandardStrings=t.CFFPrivateDict=t.CFFParser=t.CFFIndex=t.CFFHeader=t.CFFFDSelect=t.CFFCompiler=t.CFFCharset=t.CFF=void 0;var r=a(2),n=a(36),i=a(37);const s=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"];t.CFFStandardStrings=s;const o=391,c=[null,{id:"hstem",min:2,stackClearing:!0,stem:!0},null,{id:"vstem",min:2,stackClearing:!0,stem:!0},{id:"vmoveto",min:1,stackClearing:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1,undefStack:!0},{id:"return",min:0,undefStack:!0},null,null,{id:"endchar",min:0,stackClearing:!0},null,null,null,{id:"hstemhm",min:2,stackClearing:!0,stem:!0},{id:"hintmask",min:0,stackClearing:!0},{id:"cntrmask",min:0,stackClearing:!0},{id:"rmoveto",min:2,stackClearing:!0},{id:"hmoveto",min:1,stackClearing:!0},{id:"vstemhm",min:2,stackClearing:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1,undefStack:!0},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],l=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]+e[t-1]}},{id:"sub",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]-e[t-1]}},{id:"div",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]/e[t-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn(e,t){e[t-1]=-e[t-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]*e[t-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];t.CFFParser=class CFFParser{constructor(e,t,a){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!a}parse(){const e=this.properties,t=new CFF;this.cff=t;const a=this.parseHeader(),r=this.parseIndex(a.endPos),n=this.parseIndex(r.endPos),i=this.parseIndex(n.endPos),s=this.parseIndex(i.endPos),o=this.parseDict(n.obj.get(0)),c=this.createDict(CFFTopDict,o,t.strings);t.header=a.obj;t.names=this.parseNameIndex(r.obj);t.strings=this.parseStringIndex(i.obj);t.topDict=c;t.globalSubrIndex=s.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=c.hasName("ROS");const l=c.getByName("CharStrings"),h=this.parseIndex(l).obj,u=c.getByName("FontMatrix");u&&(e.fontMatrix=u);const d=c.getByName("FontBBox");if(d){e.ascent=Math.max(d[3],d[1]);e.descent=Math.min(d[1],d[3]);e.ascentScaled=!0}let f,g;if(t.isCIDFont){const e=this.parseIndex(c.getByName("FDArray")).obj;for(let a=0,r=e.count;a=t)throw new r.FormatError("Invalid CFF header");if(0!==a){(0,r.info)("cff data is shifted");e=e.subarray(a);this.bytes=e}const n=e[0],i=e[1],s=e[2],o=e[3];return{obj:new CFFHeader(n,i,s,o),endPos:s}}parseDict(e){let t=0;function parseOperand(){let a=e[t++];if(30===a)return function parseFloatOperand(){let a="";const r=15,n=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],i=e.length;for(;t>4,o=15&i;if(s===r)break;a+=n[s];if(o===r)break;a+=n[o]}return parseFloat(a)}();if(28===a){a=e[t++];a=(a<<24|e[t++]<<16)>>16;return a}if(29===a){a=e[t++];a=a<<8|e[t++];a=a<<8|e[t++];a=a<<8|e[t++];return a}if(a>=32&&a<=246)return a-139;if(a>=247&&a<=250)return 256*(a-247)+e[t++]+108;if(a>=251&&a<=254)return-256*(a-251)-e[t++]-108;(0,r.warn)('CFFParser_parseDict: "'+a+'" is a reserved command.');return NaN}let a=[];const n=[];t=0;const i=e.length;for(;t10)return!1;let i=e.stackSize;const s=e.stack,o=t.length;for(let h=0;h>16;h+=2;i++}else if(14===o){if(i>=4){i-=4;if(this.seacAnalysisEnabled){e.seac=s.slice(i,i+4);return!1}}u=c[o]}else if(o>=32&&o<=246){s[i]=o-139;i++}else if(o>=247&&o<=254){s[i]=o<251?(o-247<<8)+t[h]+108:-(o-251<<8)-t[h]-108;h++;i++}else if(255===o){s[i]=(t[h]<<24|t[h+1]<<16|t[h+2]<<8|t[h+3])/65536;h+=4;i++}else if(19===o||20===o){e.hints+=i>>1;h+=e.hints+7>>3;i%=2;u=c[o]}else{if(10===o||29===o){let t;t=10===o?a:n;if(!t){u=c[o];(0,r.warn)("Missing subrsIndex for "+u.id);return!1}let l=32768;t.count<1240?l=107:t.count<33900&&(l=1131);const h=s[--i]+l;if(h<0||h>=t.count||isNaN(h)){u=c[o];(0,r.warn)("Out of bounds subrIndex for "+u.id);return!1}e.stackSize=i;e.callDepth++;if(!this.parseCharString(e,t.get(h),a,n))return!1;e.callDepth--;i=e.stackSize;continue}if(11===o){e.stackSize=i;return!0}if(0===o&&h===t.length){t[h-1]=14;u=c[14]}else u=c[o]}if(u){if(u.stem){e.hints+=i>>1;if(3===o||23===o)e.hasVStems=!0;else if(e.hasVStems&&(1===o||18===o)){(0,r.warn)("CFF stem hints are in wrong order");t[h-1]=1===o?3:23}}if("min"in u&&!e.undefStack&&i=2&&u.stem?i%=2:i>1&&(0,r.warn)("Found too many parameters for stack-clearing command");i>0&&(e.width=s[i-1])}if("stackDelta"in u){"stackFn"in u&&u.stackFn(s,i);i+=u.stackDelta}else if(u.stackClearing)i=0;else if(u.resetStack){i=0;e.undefStack=!1}else if(u.undefStack){i=0;e.undefStack=!0;e.firstStackClearing=!1}}}e.stackSize=i;return!0}parseCharStrings({charStrings:e,localSubrIndex:t,globalSubrIndex:a,fdSelect:n,fdArray:i,privateDict:s}){const o=[],c=[],l=e.count;for(let h=0;h=i.length){(0,r.warn)("Invalid fd index for glyph index.");d=!1}if(d){g=i[e].privateDict;f=g.subrsIndex}}else t&&(f=t);d&&(d=this.parseCharString(u,l,f,a));if(null!==u.width){const e=g.getByName("nominalWidthX");c[h]=e+u.width}else{const e=g.getByName("defaultWidthX");c[h]=e}null!==u.seac&&(o[h]=u.seac);d||e.set(h,new Uint8Array([14]))}return{charStrings:e,seacs:o,widths:c}}emptyPrivateDictionary(e){const t=this.createDict(CFFPrivateDict,[],e.strings);e.setByKey(18,[0,0]);e.privateDict=t}parsePrivateDict(e){if(!e.hasName("Private")){this.emptyPrivateDictionary(e);return}const t=e.getByName("Private");if(!Array.isArray(t)||2!==t.length){e.removeByName("Private");return}const a=t[0],r=t[1];if(0===a||r>=this.bytes.length){this.emptyPrivateDictionary(e);return}const n=r+a,i=this.bytes.subarray(r,n),s=this.parseDict(i),o=this.createDict(CFFPrivateDict,s,e.strings);e.privateDict=o;if(!o.getByName("Subrs"))return;const c=o.getByName("Subrs"),l=r+c;if(0===c||l>=this.bytes.length){this.emptyPrivateDictionary(e);return}const h=this.parseIndex(l);o.subrsIndex=h.obj}parseCharsets(e,t,a,i){if(0===e)return new CFFCharset(!0,d.ISO_ADOBE,n.ISOAdobeCharset);if(1===e)return new CFFCharset(!0,d.EXPERT,n.ExpertCharset);if(2===e)return new CFFCharset(!0,d.EXPERT_SUBSET,n.ExpertSubsetCharset);const s=this.bytes,o=e,c=s[e++],l=[i?0:".notdef"];let h,u,f;t-=1;switch(c){case 0:for(f=0;f=65535){(0,r.warn)("Not enough space in charstrings to duplicate first glyph.");return}const e=this.charStrings.get(0);this.charStrings.add(e);this.isCIDFont&&this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0])}hasGlyphId(e){if(e<0||e>=this.charStrings.count)return!1;return this.charStrings.get(e).length>0}}t.CFF=CFF;class CFFHeader{constructor(e,t,a,r){this.major=e;this.minor=t;this.hdrSize=a;this.offSize=r}}t.CFFHeader=CFFHeader;class CFFStrings{constructor(){this.strings=[]}get(e){return e>=0&&e<=390?s[e]:e-o<=this.strings.length?this.strings[e-o]:s[0]}getSID(e){let t=s.indexOf(e);if(-1!==t)return t;t=this.strings.indexOf(e);return-1!==t?t+o:-1}add(e){this.strings.push(e)}get count(){return this.strings.length}}t.CFFStrings=CFFStrings;class CFFIndex{constructor(){this.objects=[];this.length=0}add(e){this.length+=e.length;this.objects.push(e)}set(e,t){this.length+=t.length-this.objects[e].length;this.objects[e]=t}get(e){return this.objects[e]}get count(){return this.objects.length}}t.CFFIndex=CFFIndex;class CFFDict{constructor(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}setByKey(e,t){if(!(e in this.keyToNameMap))return!1;const a=t.length;if(0===a)return!0;for(let n=0;n=this.fdSelect.length?-1:this.fdSelect[e]}}t.CFFFDSelect=CFFFDSelect;class CFFOffsetTracker{constructor(){this.offsets=Object.create(null)}isTracking(e){return e in this.offsets}track(e,t){if(e in this.offsets)throw new r.FormatError(`Already tracking location of ${e}`);this.offsets[e]=t}offset(e){for(const t in this.offsets)this.offsets[t]+=e}setEntryLocation(e,t,a){if(!(e in this.offsets))throw new r.FormatError(`Not tracking location of ${e}`);const n=a.data,i=this.offsets[e];for(let e=0,a=t.length;e>24&255;n[o]=h>>16&255;n[c]=h>>8&255;n[l]=255&h}}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t={data:[],length:0,add(e){this.data=this.data.concat(e);this.length=this.data.length}},a=this.compileHeader(e.header);t.add(a);const n=this.compileNameIndex(e.names);t.add(n);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(let a=0,n=e.fdArray.length;a16&&e.topDict.removeByName("XUID");e.topDict.setByName("charset",0);let s=this.compileTopDicts([e.topDict],t.length,e.isCIDFont);t.add(s.output);const o=s.trackers[0],c=this.compileStringIndex(e.strings.strings);t.add(c);const l=this.compileIndex(e.globalSubrIndex);t.add(l);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)o.setEntryLocation("Encoding",[e.encoding.format],t);else{const a=this.compileEncoding(e.encoding);o.setEntryLocation("Encoding",[t.length],t);t.add(a)}const h=this.compileCharset(e.charset,e.charStrings.count,e.strings,e.isCIDFont);o.setEntryLocation("charset",[t.length],t);t.add(h);const u=this.compileCharStrings(e.charStrings);o.setEntryLocation("CharStrings",[t.length],t);t.add(u);if(e.isCIDFont){o.setEntryLocation("FDSelect",[t.length],t);const a=this.compileFDSelect(e.fdSelect);t.add(a);s=this.compileTopDicts(e.fdArray,t.length,!0);o.setEntryLocation("FDArray",[t.length],t);t.add(s.output);const r=s.trackers;this.compilePrivateDicts(e.fdArray,r,t)}this.compilePrivateDicts([e.topDict],[o],t);t.add([0]);return t.data}encodeNumber(e){return Number.isInteger(e)?this.encodeInteger(e):this.encodeFloat(e)}static get EncodeFloatRegExp(){return(0,r.shadow)(this,"EncodeFloatRegExp",/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/)}encodeFloat(e){let t=e.toString();const a=CFFCompiler.EncodeFloatRegExp.exec(t);if(a){const r=parseFloat("1e"+((a[2]?+a[2]:0)+a[1].length));t=(Math.round(e*r)/r).toString()}let r,n,i="";for(r=0,n=t.length;r=-107&&e<=107?[e+139]:e>=108&&e<=1131?[247+((e-=108)>>8),255&e]:e>=-1131&&e<=-108?[251+((e=-e-108)>>8),255&e]:e>=-32768&&e<=32767?[28,e>>8&255,255&e]:[29,e>>24&255,e>>16&255,e>>8&255,255&e];return t}compileHeader(e){return[e.major,e.minor,4,e.offSize]}compileNameIndex(e){const t=new CFFIndex;for(let a=0,n=e.length;a"~"||"["===t||"]"===t||"("===t||")"===t||"{"===t||"}"===t||"<"===t||">"===t||"/"===t||"%"===t)&&(t="_");s[e]=t}s=s.join("");""===s&&(s="Bad_Font_Name");t.add((0,r.stringToBytes)(s))}return this.compileIndex(t)}compileTopDicts(e,t,a){const r=[];let n=new CFFIndex;for(let i=0,s=e.length;i>8&255,255&s]);else{i=new Uint8Array(1+2*s);i[0]=0;let t=0;const n=e.charset.length;let o=!1;for(let s=1;s>8&255;i[s+1]=255&c}}return this.compileTypedArray(i)}compileEncoding(e){return this.compileTypedArray(e.raw)}compileFDSelect(e){const t=e.format;let a,r;switch(t){case 0:a=new Uint8Array(1+e.fdSelect.length);a[0]=t;for(r=0;r>8&255,255&n,i];for(r=1;r>8&255,255&r,t);i=t}}const o=(s.length-3)/3;s[1]=o>>8&255;s[2]=255&o;s.push(r>>8&255,255&r);a=new Uint8Array(s)}return this.compileTypedArray(a)}compileTypedArray(e){const t=[];for(let a=0,r=e.length;a>8&255,255&r];let i,s,o=1;for(i=0;i>8&255,255&c):3===s?n.push(c>>16&255,c>>8&255,255&c):n.push(c>>>24&255,c>>16&255,c>>8&255,255&c);a[i]&&(c+=a[i].length)}for(i=0;i{Object.defineProperty(t,"__esModule",{value:!0});t.ISOAdobeCharset=t.ExpertSubsetCharset=t.ExpertCharset=void 0;t.ISOAdobeCharset=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"];t.ExpertCharset=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];t.ExpertSubsetCharset=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"]},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ZapfDingbatsEncoding=t.WinAnsiEncoding=t.SymbolSetEncoding=t.StandardEncoding=t.MacRomanEncoding=t.ExpertEncoding=void 0;t.getEncoding=function getEncoding(e){switch(e){case"WinAnsiEncoding":return s;case"StandardEncoding":return i;case"MacRomanEncoding":return n;case"SymbolSetEncoding":return o;case"ZapfDingbatsEncoding":return c;case"ExpertEncoding":return a;case"MacExpertEncoding":return r;default:return null}};const a=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];t.ExpertEncoding=a;const r=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior","centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall","","","",""],n=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"];t.MacRomanEncoding=n;const i=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls","","","",""];t.StandardEncoding=i;const s=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn","ydieresis"];t.WinAnsiEncoding=s;const o=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon","Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset","intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt","bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt",""];t.SymbolSetEncoding=o;const c=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191",""];t.ZapfDingbatsEncoding=c},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SEAC_ANALYSIS_ENABLED=t.MacStandardGlyphOrdering=t.FontFlags=void 0;t.getFontType=function getFontType(e,t,a=!1){switch(e){case"Type1":return a?r.FontType.TYPE1STANDARD:"Type1C"===t?r.FontType.TYPE1C:r.FontType.TYPE1;case"CIDFontType0":return"CIDFontType0C"===t?r.FontType.CIDFONTTYPE0C:r.FontType.CIDFONTTYPE0;case"OpenType":return r.FontType.OPENTYPE;case"TrueType":return r.FontType.TRUETYPE;case"CIDFontType2":return r.FontType.CIDFONTTYPE2;case"MMType1":return r.FontType.MMTYPE1;case"Type0":return r.FontType.TYPE0;default:return r.FontType.UNKNOWN}};t.normalizeFontName=function normalizeFontName(e){return e.replace(/[,_]/g,"-").replace(/\s/g,"")};t.recoverGlyphName=recoverGlyphName;t.type1FontGlyphMapping=function type1FontGlyphMapping(e,t,a){const r=Object.create(null);let s,c,l;const h=!!(e.flags&o.Symbolic);if(e.isInternalFont){l=t;for(c=0;c=0?s:0}}else if(e.baseEncodingName){l=(0,n.getEncoding)(e.baseEncodingName);for(c=0;c=0?s:0}}else if(h)for(c in t)r[c]=t[c];else{l=n.StandardEncoding;for(c=0;c=0?s:0}}const u=e.differences;let d;if(u)for(c in u){const e=u[c];s=a.indexOf(e);if(-1===s){d||(d=(0,i.getGlyphsUnicode)());const t=recoverGlyphName(e,d);t!==e&&(s=a.indexOf(t))}r[c]=s>=0?s:0}return r};var r=a(2),n=a(37),i=a(39),s=a(40);t.SEAC_ANALYSIS_ENABLED=!0;const o={FixedPitch:1,Serif:2,Symbolic:4,Script:8,Nonsymbolic:32,Italic:64,AllCap:65536,SmallCap:131072,ForceBold:262144};t.FontFlags=o;t.MacStandardGlyphOrdering=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior","threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function recoverGlyphName(e,t){if(void 0!==t[e])return e;const a=(0,s.getUnicodeForGlyph)(e,t);if(-1!==a)for(const e in t)if(t[e]===a)return e;(0,r.info)("Unable to recover a standard glyph name for: "+e);return e}},(e,t,a)=>{a.r(t);a.d(t,{getDingbatsGlyphsUnicode:()=>i,getGlyphsUnicode:()=>n});var r=a(6);const n=(0,r.getArrayLookupTableFactory)((function(){return["A",65,"AE",198,"AEacute",508,"AEmacron",482,"AEsmall",63462,"Aacute",193,"Aacutesmall",63457,"Abreve",258,"Abreveacute",7854,"Abrevecyrillic",1232,"Abrevedotbelow",7862,"Abrevegrave",7856,"Abrevehookabove",7858,"Abrevetilde",7860,"Acaron",461,"Acircle",9398,"Acircumflex",194,"Acircumflexacute",7844,"Acircumflexdotbelow",7852,"Acircumflexgrave",7846,"Acircumflexhookabove",7848,"Acircumflexsmall",63458,"Acircumflextilde",7850,"Acute",63177,"Acutesmall",63412,"Acyrillic",1040,"Adblgrave",512,"Adieresis",196,"Adieresiscyrillic",1234,"Adieresismacron",478,"Adieresissmall",63460,"Adotbelow",7840,"Adotmacron",480,"Agrave",192,"Agravesmall",63456,"Ahookabove",7842,"Aiecyrillic",1236,"Ainvertedbreve",514,"Alpha",913,"Alphatonos",902,"Amacron",256,"Amonospace",65313,"Aogonek",260,"Aring",197,"Aringacute",506,"Aringbelow",7680,"Aringsmall",63461,"Asmall",63329,"Atilde",195,"Atildesmall",63459,"Aybarmenian",1329,"B",66,"Bcircle",9399,"Bdotaccent",7682,"Bdotbelow",7684,"Becyrillic",1041,"Benarmenian",1330,"Beta",914,"Bhook",385,"Blinebelow",7686,"Bmonospace",65314,"Brevesmall",63220,"Bsmall",63330,"Btopbar",386,"C",67,"Caarmenian",1342,"Cacute",262,"Caron",63178,"Caronsmall",63221,"Ccaron",268,"Ccedilla",199,"Ccedillaacute",7688,"Ccedillasmall",63463,"Ccircle",9400,"Ccircumflex",264,"Cdot",266,"Cdotaccent",266,"Cedillasmall",63416,"Chaarmenian",1353,"Cheabkhasiancyrillic",1212,"Checyrillic",1063,"Chedescenderabkhasiancyrillic",1214,"Chedescendercyrillic",1206,"Chedieresiscyrillic",1268,"Cheharmenian",1347,"Chekhakassiancyrillic",1227,"Cheverticalstrokecyrillic",1208,"Chi",935,"Chook",391,"Circumflexsmall",63222,"Cmonospace",65315,"Coarmenian",1361,"Csmall",63331,"D",68,"DZ",497,"DZcaron",452,"Daarmenian",1332,"Dafrican",393,"Dcaron",270,"Dcedilla",7696,"Dcircle",9401,"Dcircumflexbelow",7698,"Dcroat",272,"Ddotaccent",7690,"Ddotbelow",7692,"Decyrillic",1044,"Deicoptic",1006,"Delta",8710,"Deltagreek",916,"Dhook",394,"Dieresis",63179,"DieresisAcute",63180,"DieresisGrave",63181,"Dieresissmall",63400,"Digammagreek",988,"Djecyrillic",1026,"Dlinebelow",7694,"Dmonospace",65316,"Dotaccentsmall",63223,"Dslash",272,"Dsmall",63332,"Dtopbar",395,"Dz",498,"Dzcaron",453,"Dzeabkhasiancyrillic",1248,"Dzecyrillic",1029,"Dzhecyrillic",1039,"E",69,"Eacute",201,"Eacutesmall",63465,"Ebreve",276,"Ecaron",282,"Ecedillabreve",7708,"Echarmenian",1333,"Ecircle",9402,"Ecircumflex",202,"Ecircumflexacute",7870,"Ecircumflexbelow",7704,"Ecircumflexdotbelow",7878,"Ecircumflexgrave",7872,"Ecircumflexhookabove",7874,"Ecircumflexsmall",63466,"Ecircumflextilde",7876,"Ecyrillic",1028,"Edblgrave",516,"Edieresis",203,"Edieresissmall",63467,"Edot",278,"Edotaccent",278,"Edotbelow",7864,"Efcyrillic",1060,"Egrave",200,"Egravesmall",63464,"Eharmenian",1335,"Ehookabove",7866,"Eightroman",8551,"Einvertedbreve",518,"Eiotifiedcyrillic",1124,"Elcyrillic",1051,"Elevenroman",8554,"Emacron",274,"Emacronacute",7702,"Emacrongrave",7700,"Emcyrillic",1052,"Emonospace",65317,"Encyrillic",1053,"Endescendercyrillic",1186,"Eng",330,"Enghecyrillic",1188,"Enhookcyrillic",1223,"Eogonek",280,"Eopen",400,"Epsilon",917,"Epsilontonos",904,"Ercyrillic",1056,"Ereversed",398,"Ereversedcyrillic",1069,"Escyrillic",1057,"Esdescendercyrillic",1194,"Esh",425,"Esmall",63333,"Eta",919,"Etarmenian",1336,"Etatonos",905,"Eth",208,"Ethsmall",63472,"Etilde",7868,"Etildebelow",7706,"Euro",8364,"Ezh",439,"Ezhcaron",494,"Ezhreversed",440,"F",70,"Fcircle",9403,"Fdotaccent",7710,"Feharmenian",1366,"Feicoptic",996,"Fhook",401,"Fitacyrillic",1138,"Fiveroman",8548,"Fmonospace",65318,"Fourroman",8547,"Fsmall",63334,"G",71,"GBsquare",13191,"Gacute",500,"Gamma",915,"Gammaafrican",404,"Gangiacoptic",1002,"Gbreve",286,"Gcaron",486,"Gcedilla",290,"Gcircle",9404,"Gcircumflex",284,"Gcommaaccent",290,"Gdot",288,"Gdotaccent",288,"Gecyrillic",1043,"Ghadarmenian",1346,"Ghemiddlehookcyrillic",1172,"Ghestrokecyrillic",1170,"Gheupturncyrillic",1168,"Ghook",403,"Gimarmenian",1331,"Gjecyrillic",1027,"Gmacron",7712,"Gmonospace",65319,"Grave",63182,"Gravesmall",63328,"Gsmall",63335,"Gsmallhook",667,"Gstroke",484,"H",72,"H18533",9679,"H18543",9642,"H18551",9643,"H22073",9633,"HPsquare",13259,"Haabkhasiancyrillic",1192,"Hadescendercyrillic",1202,"Hardsigncyrillic",1066,"Hbar",294,"Hbrevebelow",7722,"Hcedilla",7720,"Hcircle",9405,"Hcircumflex",292,"Hdieresis",7718,"Hdotaccent",7714,"Hdotbelow",7716,"Hmonospace",65320,"Hoarmenian",1344,"Horicoptic",1e3,"Hsmall",63336,"Hungarumlaut",63183,"Hungarumlautsmall",63224,"Hzsquare",13200,"I",73,"IAcyrillic",1071,"IJ",306,"IUcyrillic",1070,"Iacute",205,"Iacutesmall",63469,"Ibreve",300,"Icaron",463,"Icircle",9406,"Icircumflex",206,"Icircumflexsmall",63470,"Icyrillic",1030,"Idblgrave",520,"Idieresis",207,"Idieresisacute",7726,"Idieresiscyrillic",1252,"Idieresissmall",63471,"Idot",304,"Idotaccent",304,"Idotbelow",7882,"Iebrevecyrillic",1238,"Iecyrillic",1045,"Ifraktur",8465,"Igrave",204,"Igravesmall",63468,"Ihookabove",7880,"Iicyrillic",1048,"Iinvertedbreve",522,"Iishortcyrillic",1049,"Imacron",298,"Imacroncyrillic",1250,"Imonospace",65321,"Iniarmenian",1339,"Iocyrillic",1025,"Iogonek",302,"Iota",921,"Iotaafrican",406,"Iotadieresis",938,"Iotatonos",906,"Ismall",63337,"Istroke",407,"Itilde",296,"Itildebelow",7724,"Izhitsacyrillic",1140,"Izhitsadblgravecyrillic",1142,"J",74,"Jaarmenian",1345,"Jcircle",9407,"Jcircumflex",308,"Jecyrillic",1032,"Jheharmenian",1355,"Jmonospace",65322,"Jsmall",63338,"K",75,"KBsquare",13189,"KKsquare",13261,"Kabashkircyrillic",1184,"Kacute",7728,"Kacyrillic",1050,"Kadescendercyrillic",1178,"Kahookcyrillic",1219,"Kappa",922,"Kastrokecyrillic",1182,"Kaverticalstrokecyrillic",1180,"Kcaron",488,"Kcedilla",310,"Kcircle",9408,"Kcommaaccent",310,"Kdotbelow",7730,"Keharmenian",1364,"Kenarmenian",1343,"Khacyrillic",1061,"Kheicoptic",998,"Khook",408,"Kjecyrillic",1036,"Klinebelow",7732,"Kmonospace",65323,"Koppacyrillic",1152,"Koppagreek",990,"Ksicyrillic",1134,"Ksmall",63339,"L",76,"LJ",455,"LL",63167,"Lacute",313,"Lambda",923,"Lcaron",317,"Lcedilla",315,"Lcircle",9409,"Lcircumflexbelow",7740,"Lcommaaccent",315,"Ldot",319,"Ldotaccent",319,"Ldotbelow",7734,"Ldotbelowmacron",7736,"Liwnarmenian",1340,"Lj",456,"Ljecyrillic",1033,"Llinebelow",7738,"Lmonospace",65324,"Lslash",321,"Lslashsmall",63225,"Lsmall",63340,"M",77,"MBsquare",13190,"Macron",63184,"Macronsmall",63407,"Macute",7742,"Mcircle",9410,"Mdotaccent",7744,"Mdotbelow",7746,"Menarmenian",1348,"Mmonospace",65325,"Msmall",63341,"Mturned",412,"Mu",924,"N",78,"NJ",458,"Nacute",323,"Ncaron",327,"Ncedilla",325,"Ncircle",9411,"Ncircumflexbelow",7754,"Ncommaaccent",325,"Ndotaccent",7748,"Ndotbelow",7750,"Nhookleft",413,"Nineroman",8552,"Nj",459,"Njecyrillic",1034,"Nlinebelow",7752,"Nmonospace",65326,"Nowarmenian",1350,"Nsmall",63342,"Ntilde",209,"Ntildesmall",63473,"Nu",925,"O",79,"OE",338,"OEsmall",63226,"Oacute",211,"Oacutesmall",63475,"Obarredcyrillic",1256,"Obarreddieresiscyrillic",1258,"Obreve",334,"Ocaron",465,"Ocenteredtilde",415,"Ocircle",9412,"Ocircumflex",212,"Ocircumflexacute",7888,"Ocircumflexdotbelow",7896,"Ocircumflexgrave",7890,"Ocircumflexhookabove",7892,"Ocircumflexsmall",63476,"Ocircumflextilde",7894,"Ocyrillic",1054,"Odblacute",336,"Odblgrave",524,"Odieresis",214,"Odieresiscyrillic",1254,"Odieresissmall",63478,"Odotbelow",7884,"Ogoneksmall",63227,"Ograve",210,"Ogravesmall",63474,"Oharmenian",1365,"Ohm",8486,"Ohookabove",7886,"Ohorn",416,"Ohornacute",7898,"Ohorndotbelow",7906,"Ohorngrave",7900,"Ohornhookabove",7902,"Ohorntilde",7904,"Ohungarumlaut",336,"Oi",418,"Oinvertedbreve",526,"Omacron",332,"Omacronacute",7762,"Omacrongrave",7760,"Omega",8486,"Omegacyrillic",1120,"Omegagreek",937,"Omegaroundcyrillic",1146,"Omegatitlocyrillic",1148,"Omegatonos",911,"Omicron",927,"Omicrontonos",908,"Omonospace",65327,"Oneroman",8544,"Oogonek",490,"Oogonekmacron",492,"Oopen",390,"Oslash",216,"Oslashacute",510,"Oslashsmall",63480,"Osmall",63343,"Ostrokeacute",510,"Otcyrillic",1150,"Otilde",213,"Otildeacute",7756,"Otildedieresis",7758,"Otildesmall",63477,"P",80,"Pacute",7764,"Pcircle",9413,"Pdotaccent",7766,"Pecyrillic",1055,"Peharmenian",1354,"Pemiddlehookcyrillic",1190,"Phi",934,"Phook",420,"Pi",928,"Piwrarmenian",1363,"Pmonospace",65328,"Psi",936,"Psicyrillic",1136,"Psmall",63344,"Q",81,"Qcircle",9414,"Qmonospace",65329,"Qsmall",63345,"R",82,"Raarmenian",1356,"Racute",340,"Rcaron",344,"Rcedilla",342,"Rcircle",9415,"Rcommaaccent",342,"Rdblgrave",528,"Rdotaccent",7768,"Rdotbelow",7770,"Rdotbelowmacron",7772,"Reharmenian",1360,"Rfraktur",8476,"Rho",929,"Ringsmall",63228,"Rinvertedbreve",530,"Rlinebelow",7774,"Rmonospace",65330,"Rsmall",63346,"Rsmallinverted",641,"Rsmallinvertedsuperior",694,"S",83,"SF010000",9484,"SF020000",9492,"SF030000",9488,"SF040000",9496,"SF050000",9532,"SF060000",9516,"SF070000",9524,"SF080000",9500,"SF090000",9508,"SF100000",9472,"SF110000",9474,"SF190000",9569,"SF200000",9570,"SF210000",9558,"SF220000",9557,"SF230000",9571,"SF240000",9553,"SF250000",9559,"SF260000",9565,"SF270000",9564,"SF280000",9563,"SF360000",9566,"SF370000",9567,"SF380000",9562,"SF390000",9556,"SF400000",9577,"SF410000",9574,"SF420000",9568,"SF430000",9552,"SF440000",9580,"SF450000",9575,"SF460000",9576,"SF470000",9572,"SF480000",9573,"SF490000",9561,"SF500000",9560,"SF510000",9554,"SF520000",9555,"SF530000",9579,"SF540000",9578,"Sacute",346,"Sacutedotaccent",7780,"Sampigreek",992,"Scaron",352,"Scarondotaccent",7782,"Scaronsmall",63229,"Scedilla",350,"Schwa",399,"Schwacyrillic",1240,"Schwadieresiscyrillic",1242,"Scircle",9416,"Scircumflex",348,"Scommaaccent",536,"Sdotaccent",7776,"Sdotbelow",7778,"Sdotbelowdotaccent",7784,"Seharmenian",1357,"Sevenroman",8550,"Shaarmenian",1351,"Shacyrillic",1064,"Shchacyrillic",1065,"Sheicoptic",994,"Shhacyrillic",1210,"Shimacoptic",1004,"Sigma",931,"Sixroman",8549,"Smonospace",65331,"Softsigncyrillic",1068,"Ssmall",63347,"Stigmagreek",986,"T",84,"Tau",932,"Tbar",358,"Tcaron",356,"Tcedilla",354,"Tcircle",9417,"Tcircumflexbelow",7792,"Tcommaaccent",354,"Tdotaccent",7786,"Tdotbelow",7788,"Tecyrillic",1058,"Tedescendercyrillic",1196,"Tenroman",8553,"Tetsecyrillic",1204,"Theta",920,"Thook",428,"Thorn",222,"Thornsmall",63486,"Threeroman",8546,"Tildesmall",63230,"Tiwnarmenian",1359,"Tlinebelow",7790,"Tmonospace",65332,"Toarmenian",1337,"Tonefive",444,"Tonesix",388,"Tonetwo",423,"Tretroflexhook",430,"Tsecyrillic",1062,"Tshecyrillic",1035,"Tsmall",63348,"Twelveroman",8555,"Tworoman",8545,"U",85,"Uacute",218,"Uacutesmall",63482,"Ubreve",364,"Ucaron",467,"Ucircle",9418,"Ucircumflex",219,"Ucircumflexbelow",7798,"Ucircumflexsmall",63483,"Ucyrillic",1059,"Udblacute",368,"Udblgrave",532,"Udieresis",220,"Udieresisacute",471,"Udieresisbelow",7794,"Udieresiscaron",473,"Udieresiscyrillic",1264,"Udieresisgrave",475,"Udieresismacron",469,"Udieresissmall",63484,"Udotbelow",7908,"Ugrave",217,"Ugravesmall",63481,"Uhookabove",7910,"Uhorn",431,"Uhornacute",7912,"Uhorndotbelow",7920,"Uhorngrave",7914,"Uhornhookabove",7916,"Uhorntilde",7918,"Uhungarumlaut",368,"Uhungarumlautcyrillic",1266,"Uinvertedbreve",534,"Ukcyrillic",1144,"Umacron",362,"Umacroncyrillic",1262,"Umacrondieresis",7802,"Umonospace",65333,"Uogonek",370,"Upsilon",933,"Upsilon1",978,"Upsilonacutehooksymbolgreek",979,"Upsilonafrican",433,"Upsilondieresis",939,"Upsilondieresishooksymbolgreek",980,"Upsilonhooksymbol",978,"Upsilontonos",910,"Uring",366,"Ushortcyrillic",1038,"Usmall",63349,"Ustraightcyrillic",1198,"Ustraightstrokecyrillic",1200,"Utilde",360,"Utildeacute",7800,"Utildebelow",7796,"V",86,"Vcircle",9419,"Vdotbelow",7806,"Vecyrillic",1042,"Vewarmenian",1358,"Vhook",434,"Vmonospace",65334,"Voarmenian",1352,"Vsmall",63350,"Vtilde",7804,"W",87,"Wacute",7810,"Wcircle",9420,"Wcircumflex",372,"Wdieresis",7812,"Wdotaccent",7814,"Wdotbelow",7816,"Wgrave",7808,"Wmonospace",65335,"Wsmall",63351,"X",88,"Xcircle",9421,"Xdieresis",7820,"Xdotaccent",7818,"Xeharmenian",1341,"Xi",926,"Xmonospace",65336,"Xsmall",63352,"Y",89,"Yacute",221,"Yacutesmall",63485,"Yatcyrillic",1122,"Ycircle",9422,"Ycircumflex",374,"Ydieresis",376,"Ydieresissmall",63487,"Ydotaccent",7822,"Ydotbelow",7924,"Yericyrillic",1067,"Yerudieresiscyrillic",1272,"Ygrave",7922,"Yhook",435,"Yhookabove",7926,"Yiarmenian",1349,"Yicyrillic",1031,"Yiwnarmenian",1362,"Ymonospace",65337,"Ysmall",63353,"Ytilde",7928,"Yusbigcyrillic",1130,"Yusbigiotifiedcyrillic",1132,"Yuslittlecyrillic",1126,"Yuslittleiotifiedcyrillic",1128,"Z",90,"Zaarmenian",1334,"Zacute",377,"Zcaron",381,"Zcaronsmall",63231,"Zcircle",9423,"Zcircumflex",7824,"Zdot",379,"Zdotaccent",379,"Zdotbelow",7826,"Zecyrillic",1047,"Zedescendercyrillic",1176,"Zedieresiscyrillic",1246,"Zeta",918,"Zhearmenian",1338,"Zhebrevecyrillic",1217,"Zhecyrillic",1046,"Zhedescendercyrillic",1174,"Zhedieresiscyrillic",1244,"Zlinebelow",7828,"Zmonospace",65338,"Zsmall",63354,"Zstroke",437,"a",97,"aabengali",2438,"aacute",225,"aadeva",2310,"aagujarati",2694,"aagurmukhi",2566,"aamatragurmukhi",2622,"aarusquare",13059,"aavowelsignbengali",2494,"aavowelsigndeva",2366,"aavowelsigngujarati",2750,"abbreviationmarkarmenian",1375,"abbreviationsigndeva",2416,"abengali",2437,"abopomofo",12570,"abreve",259,"abreveacute",7855,"abrevecyrillic",1233,"abrevedotbelow",7863,"abrevegrave",7857,"abrevehookabove",7859,"abrevetilde",7861,"acaron",462,"acircle",9424,"acircumflex",226,"acircumflexacute",7845,"acircumflexdotbelow",7853,"acircumflexgrave",7847,"acircumflexhookabove",7849,"acircumflextilde",7851,"acute",180,"acutebelowcmb",791,"acutecmb",769,"acutecomb",769,"acutedeva",2388,"acutelowmod",719,"acutetonecmb",833,"acyrillic",1072,"adblgrave",513,"addakgurmukhi",2673,"adeva",2309,"adieresis",228,"adieresiscyrillic",1235,"adieresismacron",479,"adotbelow",7841,"adotmacron",481,"ae",230,"aeacute",509,"aekorean",12624,"aemacron",483,"afii00208",8213,"afii08941",8356,"afii10017",1040,"afii10018",1041,"afii10019",1042,"afii10020",1043,"afii10021",1044,"afii10022",1045,"afii10023",1025,"afii10024",1046,"afii10025",1047,"afii10026",1048,"afii10027",1049,"afii10028",1050,"afii10029",1051,"afii10030",1052,"afii10031",1053,"afii10032",1054,"afii10033",1055,"afii10034",1056,"afii10035",1057,"afii10036",1058,"afii10037",1059,"afii10038",1060,"afii10039",1061,"afii10040",1062,"afii10041",1063,"afii10042",1064,"afii10043",1065,"afii10044",1066,"afii10045",1067,"afii10046",1068,"afii10047",1069,"afii10048",1070,"afii10049",1071,"afii10050",1168,"afii10051",1026,"afii10052",1027,"afii10053",1028,"afii10054",1029,"afii10055",1030,"afii10056",1031,"afii10057",1032,"afii10058",1033,"afii10059",1034,"afii10060",1035,"afii10061",1036,"afii10062",1038,"afii10063",63172,"afii10064",63173,"afii10065",1072,"afii10066",1073,"afii10067",1074,"afii10068",1075,"afii10069",1076,"afii10070",1077,"afii10071",1105,"afii10072",1078,"afii10073",1079,"afii10074",1080,"afii10075",1081,"afii10076",1082,"afii10077",1083,"afii10078",1084,"afii10079",1085,"afii10080",1086,"afii10081",1087,"afii10082",1088,"afii10083",1089,"afii10084",1090,"afii10085",1091,"afii10086",1092,"afii10087",1093,"afii10088",1094,"afii10089",1095,"afii10090",1096,"afii10091",1097,"afii10092",1098,"afii10093",1099,"afii10094",1100,"afii10095",1101,"afii10096",1102,"afii10097",1103,"afii10098",1169,"afii10099",1106,"afii10100",1107,"afii10101",1108,"afii10102",1109,"afii10103",1110,"afii10104",1111,"afii10105",1112,"afii10106",1113,"afii10107",1114,"afii10108",1115,"afii10109",1116,"afii10110",1118,"afii10145",1039,"afii10146",1122,"afii10147",1138,"afii10148",1140,"afii10192",63174,"afii10193",1119,"afii10194",1123,"afii10195",1139,"afii10196",1141,"afii10831",63175,"afii10832",63176,"afii10846",1241,"afii299",8206,"afii300",8207,"afii301",8205,"afii57381",1642,"afii57388",1548,"afii57392",1632,"afii57393",1633,"afii57394",1634,"afii57395",1635,"afii57396",1636,"afii57397",1637,"afii57398",1638,"afii57399",1639,"afii57400",1640,"afii57401",1641,"afii57403",1563,"afii57407",1567,"afii57409",1569,"afii57410",1570,"afii57411",1571,"afii57412",1572,"afii57413",1573,"afii57414",1574,"afii57415",1575,"afii57416",1576,"afii57417",1577,"afii57418",1578,"afii57419",1579,"afii57420",1580,"afii57421",1581,"afii57422",1582,"afii57423",1583,"afii57424",1584,"afii57425",1585,"afii57426",1586,"afii57427",1587,"afii57428",1588,"afii57429",1589,"afii57430",1590,"afii57431",1591,"afii57432",1592,"afii57433",1593,"afii57434",1594,"afii57440",1600,"afii57441",1601,"afii57442",1602,"afii57443",1603,"afii57444",1604,"afii57445",1605,"afii57446",1606,"afii57448",1608,"afii57449",1609,"afii57450",1610,"afii57451",1611,"afii57452",1612,"afii57453",1613,"afii57454",1614,"afii57455",1615,"afii57456",1616,"afii57457",1617,"afii57458",1618,"afii57470",1607,"afii57505",1700,"afii57506",1662,"afii57507",1670,"afii57508",1688,"afii57509",1711,"afii57511",1657,"afii57512",1672,"afii57513",1681,"afii57514",1722,"afii57519",1746,"afii57534",1749,"afii57636",8362,"afii57645",1470,"afii57658",1475,"afii57664",1488,"afii57665",1489,"afii57666",1490,"afii57667",1491,"afii57668",1492,"afii57669",1493,"afii57670",1494,"afii57671",1495,"afii57672",1496,"afii57673",1497,"afii57674",1498,"afii57675",1499,"afii57676",1500,"afii57677",1501,"afii57678",1502,"afii57679",1503,"afii57680",1504,"afii57681",1505,"afii57682",1506,"afii57683",1507,"afii57684",1508,"afii57685",1509,"afii57686",1510,"afii57687",1511,"afii57688",1512,"afii57689",1513,"afii57690",1514,"afii57694",64298,"afii57695",64299,"afii57700",64331,"afii57705",64287,"afii57716",1520,"afii57717",1521,"afii57718",1522,"afii57723",64309,"afii57793",1460,"afii57794",1461,"afii57795",1462,"afii57796",1467,"afii57797",1464,"afii57798",1463,"afii57799",1456,"afii57800",1458,"afii57801",1457,"afii57802",1459,"afii57803",1474,"afii57804",1473,"afii57806",1465,"afii57807",1468,"afii57839",1469,"afii57841",1471,"afii57842",1472,"afii57929",700,"afii61248",8453,"afii61289",8467,"afii61352",8470,"afii61573",8236,"afii61574",8237,"afii61575",8238,"afii61664",8204,"afii63167",1645,"afii64937",701,"agrave",224,"agujarati",2693,"agurmukhi",2565,"ahiragana",12354,"ahookabove",7843,"aibengali",2448,"aibopomofo",12574,"aideva",2320,"aiecyrillic",1237,"aigujarati",2704,"aigurmukhi",2576,"aimatragurmukhi",2632,"ainarabic",1593,"ainfinalarabic",65226,"aininitialarabic",65227,"ainmedialarabic",65228,"ainvertedbreve",515,"aivowelsignbengali",2504,"aivowelsigndeva",2376,"aivowelsigngujarati",2760,"akatakana",12450,"akatakanahalfwidth",65393,"akorean",12623,"alef",1488,"alefarabic",1575,"alefdageshhebrew",64304,"aleffinalarabic",65166,"alefhamzaabovearabic",1571,"alefhamzaabovefinalarabic",65156,"alefhamzabelowarabic",1573,"alefhamzabelowfinalarabic",65160,"alefhebrew",1488,"aleflamedhebrew",64335,"alefmaddaabovearabic",1570,"alefmaddaabovefinalarabic",65154,"alefmaksuraarabic",1609,"alefmaksurafinalarabic",65264,"alefmaksurainitialarabic",65267,"alefmaksuramedialarabic",65268,"alefpatahhebrew",64302,"alefqamatshebrew",64303,"aleph",8501,"allequal",8780,"alpha",945,"alphatonos",940,"amacron",257,"amonospace",65345,"ampersand",38,"ampersandmonospace",65286,"ampersandsmall",63270,"amsquare",13250,"anbopomofo",12578,"angbopomofo",12580,"angbracketleft",12296,"angbracketright",12297,"angkhankhuthai",3674,"angle",8736,"anglebracketleft",12296,"anglebracketleftvertical",65087,"anglebracketright",12297,"anglebracketrightvertical",65088,"angleleft",9001,"angleright",9002,"angstrom",8491,"anoteleia",903,"anudattadeva",2386,"anusvarabengali",2434,"anusvaradeva",2306,"anusvaragujarati",2690,"aogonek",261,"apaatosquare",13056,"aparen",9372,"apostrophearmenian",1370,"apostrophemod",700,"apple",63743,"approaches",8784,"approxequal",8776,"approxequalorimage",8786,"approximatelyequal",8773,"araeaekorean",12686,"araeakorean",12685,"arc",8978,"arighthalfring",7834,"aring",229,"aringacute",507,"aringbelow",7681,"arrowboth",8596,"arrowdashdown",8675,"arrowdashleft",8672,"arrowdashright",8674,"arrowdashup",8673,"arrowdblboth",8660,"arrowdbldown",8659,"arrowdblleft",8656,"arrowdblright",8658,"arrowdblup",8657,"arrowdown",8595,"arrowdownleft",8601,"arrowdownright",8600,"arrowdownwhite",8681,"arrowheaddownmod",709,"arrowheadleftmod",706,"arrowheadrightmod",707,"arrowheadupmod",708,"arrowhorizex",63719,"arrowleft",8592,"arrowleftdbl",8656,"arrowleftdblstroke",8653,"arrowleftoverright",8646,"arrowleftwhite",8678,"arrowright",8594,"arrowrightdblstroke",8655,"arrowrightheavy",10142,"arrowrightoverleft",8644,"arrowrightwhite",8680,"arrowtableft",8676,"arrowtabright",8677,"arrowup",8593,"arrowupdn",8597,"arrowupdnbse",8616,"arrowupdownbase",8616,"arrowupleft",8598,"arrowupleftofdown",8645,"arrowupright",8599,"arrowupwhite",8679,"arrowvertex",63718,"asciicircum",94,"asciicircummonospace",65342,"asciitilde",126,"asciitildemonospace",65374,"ascript",593,"ascriptturned",594,"asmallhiragana",12353,"asmallkatakana",12449,"asmallkatakanahalfwidth",65383,"asterisk",42,"asteriskaltonearabic",1645,"asteriskarabic",1645,"asteriskmath",8727,"asteriskmonospace",65290,"asterisksmall",65121,"asterism",8258,"asuperior",63209,"asymptoticallyequal",8771,"at",64,"atilde",227,"atmonospace",65312,"atsmall",65131,"aturned",592,"aubengali",2452,"aubopomofo",12576,"audeva",2324,"augujarati",2708,"augurmukhi",2580,"aulengthmarkbengali",2519,"aumatragurmukhi",2636,"auvowelsignbengali",2508,"auvowelsigndeva",2380,"auvowelsigngujarati",2764,"avagrahadeva",2365,"aybarmenian",1377,"ayin",1506,"ayinaltonehebrew",64288,"ayinhebrew",1506,"b",98,"babengali",2476,"backslash",92,"backslashmonospace",65340,"badeva",2348,"bagujarati",2732,"bagurmukhi",2604,"bahiragana",12400,"bahtthai",3647,"bakatakana",12496,"bar",124,"barmonospace",65372,"bbopomofo",12549,"bcircle",9425,"bdotaccent",7683,"bdotbelow",7685,"beamedsixteenthnotes",9836,"because",8757,"becyrillic",1073,"beharabic",1576,"behfinalarabic",65168,"behinitialarabic",65169,"behiragana",12409,"behmedialarabic",65170,"behmeeminitialarabic",64671,"behmeemisolatedarabic",64520,"behnoonfinalarabic",64621,"bekatakana",12505,"benarmenian",1378,"bet",1489,"beta",946,"betasymbolgreek",976,"betdagesh",64305,"betdageshhebrew",64305,"bethebrew",1489,"betrafehebrew",64332,"bhabengali",2477,"bhadeva",2349,"bhagujarati",2733,"bhagurmukhi",2605,"bhook",595,"bihiragana",12403,"bikatakana",12499,"bilabialclick",664,"bindigurmukhi",2562,"birusquare",13105,"blackcircle",9679,"blackdiamond",9670,"blackdownpointingtriangle",9660,"blackleftpointingpointer",9668,"blackleftpointingtriangle",9664,"blacklenticularbracketleft",12304,"blacklenticularbracketleftvertical",65083,"blacklenticularbracketright",12305,"blacklenticularbracketrightvertical",65084,"blacklowerlefttriangle",9699,"blacklowerrighttriangle",9698,"blackrectangle",9644,"blackrightpointingpointer",9658,"blackrightpointingtriangle",9654,"blacksmallsquare",9642,"blacksmilingface",9787,"blacksquare",9632,"blackstar",9733,"blackupperlefttriangle",9700,"blackupperrighttriangle",9701,"blackuppointingsmalltriangle",9652,"blackuppointingtriangle",9650,"blank",9251,"blinebelow",7687,"block",9608,"bmonospace",65346,"bobaimaithai",3610,"bohiragana",12412,"bokatakana",12508,"bparen",9373,"bqsquare",13251,"braceex",63732,"braceleft",123,"braceleftbt",63731,"braceleftmid",63730,"braceleftmonospace",65371,"braceleftsmall",65115,"bracelefttp",63729,"braceleftvertical",65079,"braceright",125,"bracerightbt",63742,"bracerightmid",63741,"bracerightmonospace",65373,"bracerightsmall",65116,"bracerighttp",63740,"bracerightvertical",65080,"bracketleft",91,"bracketleftbt",63728,"bracketleftex",63727,"bracketleftmonospace",65339,"bracketlefttp",63726,"bracketright",93,"bracketrightbt",63739,"bracketrightex",63738,"bracketrightmonospace",65341,"bracketrighttp",63737,"breve",728,"brevebelowcmb",814,"brevecmb",774,"breveinvertedbelowcmb",815,"breveinvertedcmb",785,"breveinverteddoublecmb",865,"bridgebelowcmb",810,"bridgeinvertedbelowcmb",826,"brokenbar",166,"bstroke",384,"bsuperior",63210,"btopbar",387,"buhiragana",12406,"bukatakana",12502,"bullet",8226,"bulletinverse",9688,"bulletoperator",8729,"bullseye",9678,"c",99,"caarmenian",1390,"cabengali",2458,"cacute",263,"cadeva",2330,"cagujarati",2714,"cagurmukhi",2586,"calsquare",13192,"candrabindubengali",2433,"candrabinducmb",784,"candrabindudeva",2305,"candrabindugujarati",2689,"capslock",8682,"careof",8453,"caron",711,"caronbelowcmb",812,"caroncmb",780,"carriagereturn",8629,"cbopomofo",12568,"ccaron",269,"ccedilla",231,"ccedillaacute",7689,"ccircle",9426,"ccircumflex",265,"ccurl",597,"cdot",267,"cdotaccent",267,"cdsquare",13253,"cedilla",184,"cedillacmb",807,"cent",162,"centigrade",8451,"centinferior",63199,"centmonospace",65504,"centoldstyle",63394,"centsuperior",63200,"chaarmenian",1401,"chabengali",2459,"chadeva",2331,"chagujarati",2715,"chagurmukhi",2587,"chbopomofo",12564,"cheabkhasiancyrillic",1213,"checkmark",10003,"checyrillic",1095,"chedescenderabkhasiancyrillic",1215,"chedescendercyrillic",1207,"chedieresiscyrillic",1269,"cheharmenian",1395,"chekhakassiancyrillic",1228,"cheverticalstrokecyrillic",1209,"chi",967,"chieuchacirclekorean",12919,"chieuchaparenkorean",12823,"chieuchcirclekorean",12905,"chieuchkorean",12618,"chieuchparenkorean",12809,"chochangthai",3594,"chochanthai",3592,"chochingthai",3593,"chochoethai",3596,"chook",392,"cieucacirclekorean",12918,"cieucaparenkorean",12822,"cieuccirclekorean",12904,"cieuckorean",12616,"cieucparenkorean",12808,"cieucuparenkorean",12828,"circle",9675,"circlecopyrt",169,"circlemultiply",8855,"circleot",8857,"circleplus",8853,"circlepostalmark",12342,"circlewithlefthalfblack",9680,"circlewithrighthalfblack",9681,"circumflex",710,"circumflexbelowcmb",813,"circumflexcmb",770,"clear",8999,"clickalveolar",450,"clickdental",448,"clicklateral",449,"clickretroflex",451,"club",9827,"clubsuitblack",9827,"clubsuitwhite",9831,"cmcubedsquare",13220,"cmonospace",65347,"cmsquaredsquare",13216,"coarmenian",1409,"colon",58,"colonmonetary",8353,"colonmonospace",65306,"colonsign",8353,"colonsmall",65109,"colontriangularhalfmod",721,"colontriangularmod",720,"comma",44,"commaabovecmb",787,"commaaboverightcmb",789,"commaaccent",63171,"commaarabic",1548,"commaarmenian",1373,"commainferior",63201,"commamonospace",65292,"commareversedabovecmb",788,"commareversedmod",701,"commasmall",65104,"commasuperior",63202,"commaturnedabovecmb",786,"commaturnedmod",699,"compass",9788,"congruent",8773,"contourintegral",8750,"control",8963,"controlACK",6,"controlBEL",7,"controlBS",8,"controlCAN",24,"controlCR",13,"controlDC1",17,"controlDC2",18,"controlDC3",19,"controlDC4",20,"controlDEL",127,"controlDLE",16,"controlEM",25,"controlENQ",5,"controlEOT",4,"controlESC",27,"controlETB",23,"controlETX",3,"controlFF",12,"controlFS",28,"controlGS",29,"controlHT",9,"controlLF",10,"controlNAK",21,"controlNULL",0,"controlRS",30,"controlSI",15,"controlSO",14,"controlSOT",2,"controlSTX",1,"controlSUB",26,"controlSYN",22,"controlUS",31,"controlVT",11,"copyright",169,"copyrightsans",63721,"copyrightserif",63193,"cornerbracketleft",12300,"cornerbracketlefthalfwidth",65378,"cornerbracketleftvertical",65089,"cornerbracketright",12301,"cornerbracketrighthalfwidth",65379,"cornerbracketrightvertical",65090,"corporationsquare",13183,"cosquare",13255,"coverkgsquare",13254,"cparen",9374,"cruzeiro",8354,"cstretched",663,"curlyand",8911,"curlyor",8910,"currency",164,"cyrBreve",63185,"cyrFlex",63186,"cyrbreve",63188,"cyrflex",63189,"d",100,"daarmenian",1380,"dabengali",2470,"dadarabic",1590,"dadeva",2342,"dadfinalarabic",65214,"dadinitialarabic",65215,"dadmedialarabic",65216,"dagesh",1468,"dageshhebrew",1468,"dagger",8224,"daggerdbl",8225,"dagujarati",2726,"dagurmukhi",2598,"dahiragana",12384,"dakatakana",12480,"dalarabic",1583,"dalet",1491,"daletdagesh",64307,"daletdageshhebrew",64307,"dalethebrew",1491,"dalfinalarabic",65194,"dammaarabic",1615,"dammalowarabic",1615,"dammatanaltonearabic",1612,"dammatanarabic",1612,"danda",2404,"dargahebrew",1447,"dargalefthebrew",1447,"dasiapneumatacyrilliccmb",1157,"dblGrave",63187,"dblanglebracketleft",12298,"dblanglebracketleftvertical",65085,"dblanglebracketright",12299,"dblanglebracketrightvertical",65086,"dblarchinvertedbelowcmb",811,"dblarrowleft",8660,"dblarrowright",8658,"dbldanda",2405,"dblgrave",63190,"dblgravecmb",783,"dblintegral",8748,"dbllowline",8215,"dbllowlinecmb",819,"dbloverlinecmb",831,"dblprimemod",698,"dblverticalbar",8214,"dblverticallineabovecmb",782,"dbopomofo",12553,"dbsquare",13256,"dcaron",271,"dcedilla",7697,"dcircle",9427,"dcircumflexbelow",7699,"dcroat",273,"ddabengali",2465,"ddadeva",2337,"ddagujarati",2721,"ddagurmukhi",2593,"ddalarabic",1672,"ddalfinalarabic",64393,"dddhadeva",2396,"ddhabengali",2466,"ddhadeva",2338,"ddhagujarati",2722,"ddhagurmukhi",2594,"ddotaccent",7691,"ddotbelow",7693,"decimalseparatorarabic",1643,"decimalseparatorpersian",1643,"decyrillic",1076,"degree",176,"dehihebrew",1453,"dehiragana",12391,"deicoptic",1007,"dekatakana",12487,"deleteleft",9003,"deleteright",8998,"delta",948,"deltaturned",397,"denominatorminusonenumeratorbengali",2552,"dezh",676,"dhabengali",2471,"dhadeva",2343,"dhagujarati",2727,"dhagurmukhi",2599,"dhook",599,"dialytikatonos",901,"dialytikatonoscmb",836,"diamond",9830,"diamondsuitwhite",9826,"dieresis",168,"dieresisacute",63191,"dieresisbelowcmb",804,"dieresiscmb",776,"dieresisgrave",63192,"dieresistonos",901,"dihiragana",12386,"dikatakana",12482,"dittomark",12291,"divide",247,"divides",8739,"divisionslash",8725,"djecyrillic",1106,"dkshade",9619,"dlinebelow",7695,"dlsquare",13207,"dmacron",273,"dmonospace",65348,"dnblock",9604,"dochadathai",3598,"dodekthai",3604,"dohiragana",12393,"dokatakana",12489,"dollar",36,"dollarinferior",63203,"dollarmonospace",65284,"dollaroldstyle",63268,"dollarsmall",65129,"dollarsuperior",63204,"dong",8363,"dorusquare",13094,"dotaccent",729,"dotaccentcmb",775,"dotbelowcmb",803,"dotbelowcomb",803,"dotkatakana",12539,"dotlessi",305,"dotlessj",63166,"dotlessjstrokehook",644,"dotmath",8901,"dottedcircle",9676,"doubleyodpatah",64287,"doubleyodpatahhebrew",64287,"downtackbelowcmb",798,"downtackmod",725,"dparen",9375,"dsuperior",63211,"dtail",598,"dtopbar",396,"duhiragana",12389,"dukatakana",12485,"dz",499,"dzaltone",675,"dzcaron",454,"dzcurl",677,"dzeabkhasiancyrillic",1249,"dzecyrillic",1109,"dzhecyrillic",1119,"e",101,"eacute",233,"earth",9793,"ebengali",2447,"ebopomofo",12572,"ebreve",277,"ecandradeva",2317,"ecandragujarati",2701,"ecandravowelsigndeva",2373,"ecandravowelsigngujarati",2757,"ecaron",283,"ecedillabreve",7709,"echarmenian",1381,"echyiwnarmenian",1415,"ecircle",9428,"ecircumflex",234,"ecircumflexacute",7871,"ecircumflexbelow",7705,"ecircumflexdotbelow",7879,"ecircumflexgrave",7873,"ecircumflexhookabove",7875,"ecircumflextilde",7877,"ecyrillic",1108,"edblgrave",517,"edeva",2319,"edieresis",235,"edot",279,"edotaccent",279,"edotbelow",7865,"eegurmukhi",2575,"eematragurmukhi",2631,"efcyrillic",1092,"egrave",232,"egujarati",2703,"eharmenian",1383,"ehbopomofo",12573,"ehiragana",12360,"ehookabove",7867,"eibopomofo",12575,"eight",56,"eightarabic",1640,"eightbengali",2542,"eightcircle",9319,"eightcircleinversesansserif",10129,"eightdeva",2414,"eighteencircle",9329,"eighteenparen",9349,"eighteenperiod",9369,"eightgujarati",2798,"eightgurmukhi",2670,"eighthackarabic",1640,"eighthangzhou",12328,"eighthnotebeamed",9835,"eightideographicparen",12839,"eightinferior",8328,"eightmonospace",65304,"eightoldstyle",63288,"eightparen",9339,"eightperiod",9359,"eightpersian",1784,"eightroman",8567,"eightsuperior",8312,"eightthai",3672,"einvertedbreve",519,"eiotifiedcyrillic",1125,"ekatakana",12456,"ekatakanahalfwidth",65396,"ekonkargurmukhi",2676,"ekorean",12628,"elcyrillic",1083,"element",8712,"elevencircle",9322,"elevenparen",9342,"elevenperiod",9362,"elevenroman",8570,"ellipsis",8230,"ellipsisvertical",8942,"emacron",275,"emacronacute",7703,"emacrongrave",7701,"emcyrillic",1084,"emdash",8212,"emdashvertical",65073,"emonospace",65349,"emphasismarkarmenian",1371,"emptyset",8709,"enbopomofo",12579,"encyrillic",1085,"endash",8211,"endashvertical",65074,"endescendercyrillic",1187,"eng",331,"engbopomofo",12581,"enghecyrillic",1189,"enhookcyrillic",1224,"enspace",8194,"eogonek",281,"eokorean",12627,"eopen",603,"eopenclosed",666,"eopenreversed",604,"eopenreversedclosed",606,"eopenreversedhook",605,"eparen",9376,"epsilon",949,"epsilontonos",941,"equal",61,"equalmonospace",65309,"equalsmall",65126,"equalsuperior",8316,"equivalence",8801,"erbopomofo",12582,"ercyrillic",1088,"ereversed",600,"ereversedcyrillic",1101,"escyrillic",1089,"esdescendercyrillic",1195,"esh",643,"eshcurl",646,"eshortdeva",2318,"eshortvowelsigndeva",2374,"eshreversedloop",426,"eshsquatreversed",645,"esmallhiragana",12359,"esmallkatakana",12455,"esmallkatakanahalfwidth",65386,"estimated",8494,"esuperior",63212,"eta",951,"etarmenian",1384,"etatonos",942,"eth",240,"etilde",7869,"etildebelow",7707,"etnahtafoukhhebrew",1425,"etnahtafoukhlefthebrew",1425,"etnahtahebrew",1425,"etnahtalefthebrew",1425,"eturned",477,"eukorean",12641,"euro",8364,"evowelsignbengali",2503,"evowelsigndeva",2375,"evowelsigngujarati",2759,"exclam",33,"exclamarmenian",1372,"exclamdbl",8252,"exclamdown",161,"exclamdownsmall",63393,"exclammonospace",65281,"exclamsmall",63265,"existential",8707,"ezh",658,"ezhcaron",495,"ezhcurl",659,"ezhreversed",441,"ezhtail",442,"f",102,"fadeva",2398,"fagurmukhi",2654,"fahrenheit",8457,"fathaarabic",1614,"fathalowarabic",1614,"fathatanarabic",1611,"fbopomofo",12552,"fcircle",9429,"fdotaccent",7711,"feharabic",1601,"feharmenian",1414,"fehfinalarabic",65234,"fehinitialarabic",65235,"fehmedialarabic",65236,"feicoptic",997,"female",9792,"ff",64256,"f_f",64256,"ffi",64259,"ffl",64260,"fi",64257,"fifteencircle",9326,"fifteenparen",9346,"fifteenperiod",9366,"figuredash",8210,"filledbox",9632,"filledrect",9644,"finalkaf",1498,"finalkafdagesh",64314,"finalkafdageshhebrew",64314,"finalkafhebrew",1498,"finalmem",1501,"finalmemhebrew",1501,"finalnun",1503,"finalnunhebrew",1503,"finalpe",1507,"finalpehebrew",1507,"finaltsadi",1509,"finaltsadihebrew",1509,"firsttonechinese",713,"fisheye",9673,"fitacyrillic",1139,"five",53,"fivearabic",1637,"fivebengali",2539,"fivecircle",9316,"fivecircleinversesansserif",10126,"fivedeva",2411,"fiveeighths",8541,"fivegujarati",2795,"fivegurmukhi",2667,"fivehackarabic",1637,"fivehangzhou",12325,"fiveideographicparen",12836,"fiveinferior",8325,"fivemonospace",65301,"fiveoldstyle",63285,"fiveparen",9336,"fiveperiod",9356,"fivepersian",1781,"fiveroman",8564,"fivesuperior",8309,"fivethai",3669,"fl",64258,"florin",402,"fmonospace",65350,"fmsquare",13209,"fofanthai",3615,"fofathai",3613,"fongmanthai",3663,"forall",8704,"four",52,"fourarabic",1636,"fourbengali",2538,"fourcircle",9315,"fourcircleinversesansserif",10125,"fourdeva",2410,"fourgujarati",2794,"fourgurmukhi",2666,"fourhackarabic",1636,"fourhangzhou",12324,"fourideographicparen",12835,"fourinferior",8324,"fourmonospace",65300,"fournumeratorbengali",2551,"fouroldstyle",63284,"fourparen",9335,"fourperiod",9355,"fourpersian",1780,"fourroman",8563,"foursuperior",8308,"fourteencircle",9325,"fourteenparen",9345,"fourteenperiod",9365,"fourthai",3668,"fourthtonechinese",715,"fparen",9377,"fraction",8260,"franc",8355,"g",103,"gabengali",2455,"gacute",501,"gadeva",2327,"gafarabic",1711,"gaffinalarabic",64403,"gafinitialarabic",64404,"gafmedialarabic",64405,"gagujarati",2711,"gagurmukhi",2583,"gahiragana",12364,"gakatakana",12460,"gamma",947,"gammalatinsmall",611,"gammasuperior",736,"gangiacoptic",1003,"gbopomofo",12557,"gbreve",287,"gcaron",487,"gcedilla",291,"gcircle",9430,"gcircumflex",285,"gcommaaccent",291,"gdot",289,"gdotaccent",289,"gecyrillic",1075,"gehiragana",12370,"gekatakana",12466,"geometricallyequal",8785,"gereshaccenthebrew",1436,"gereshhebrew",1523,"gereshmuqdamhebrew",1437,"germandbls",223,"gershayimaccenthebrew",1438,"gershayimhebrew",1524,"getamark",12307,"ghabengali",2456,"ghadarmenian",1394,"ghadeva",2328,"ghagujarati",2712,"ghagurmukhi",2584,"ghainarabic",1594,"ghainfinalarabic",65230,"ghaininitialarabic",65231,"ghainmedialarabic",65232,"ghemiddlehookcyrillic",1173,"ghestrokecyrillic",1171,"gheupturncyrillic",1169,"ghhadeva",2394,"ghhagurmukhi",2650,"ghook",608,"ghzsquare",13203,"gihiragana",12366,"gikatakana",12462,"gimarmenian",1379,"gimel",1490,"gimeldagesh",64306,"gimeldageshhebrew",64306,"gimelhebrew",1490,"gjecyrillic",1107,"glottalinvertedstroke",446,"glottalstop",660,"glottalstopinverted",662,"glottalstopmod",704,"glottalstopreversed",661,"glottalstopreversedmod",705,"glottalstopreversedsuperior",740,"glottalstopstroke",673,"glottalstopstrokereversed",674,"gmacron",7713,"gmonospace",65351,"gohiragana",12372,"gokatakana",12468,"gparen",9378,"gpasquare",13228,"gradient",8711,"grave",96,"gravebelowcmb",790,"gravecmb",768,"gravecomb",768,"gravedeva",2387,"gravelowmod",718,"gravemonospace",65344,"gravetonecmb",832,"greater",62,"greaterequal",8805,"greaterequalorless",8923,"greatermonospace",65310,"greaterorequivalent",8819,"greaterorless",8823,"greateroverequal",8807,"greatersmall",65125,"gscript",609,"gstroke",485,"guhiragana",12368,"guillemotleft",171,"guillemotright",187,"guilsinglleft",8249,"guilsinglright",8250,"gukatakana",12464,"guramusquare",13080,"gysquare",13257,"h",104,"haabkhasiancyrillic",1193,"haaltonearabic",1729,"habengali",2489,"hadescendercyrillic",1203,"hadeva",2361,"hagujarati",2745,"hagurmukhi",2617,"haharabic",1581,"hahfinalarabic",65186,"hahinitialarabic",65187,"hahiragana",12399,"hahmedialarabic",65188,"haitusquare",13098,"hakatakana",12495,"hakatakanahalfwidth",65418,"halantgurmukhi",2637,"hamzaarabic",1569,"hamzalowarabic",1569,"hangulfiller",12644,"hardsigncyrillic",1098,"harpoonleftbarbup",8636,"harpoonrightbarbup",8640,"hasquare",13258,"hatafpatah",1458,"hatafpatah16",1458,"hatafpatah23",1458,"hatafpatah2f",1458,"hatafpatahhebrew",1458,"hatafpatahnarrowhebrew",1458,"hatafpatahquarterhebrew",1458,"hatafpatahwidehebrew",1458,"hatafqamats",1459,"hatafqamats1b",1459,"hatafqamats28",1459,"hatafqamats34",1459,"hatafqamatshebrew",1459,"hatafqamatsnarrowhebrew",1459,"hatafqamatsquarterhebrew",1459,"hatafqamatswidehebrew",1459,"hatafsegol",1457,"hatafsegol17",1457,"hatafsegol24",1457,"hatafsegol30",1457,"hatafsegolhebrew",1457,"hatafsegolnarrowhebrew",1457,"hatafsegolquarterhebrew",1457,"hatafsegolwidehebrew",1457,"hbar",295,"hbopomofo",12559,"hbrevebelow",7723,"hcedilla",7721,"hcircle",9431,"hcircumflex",293,"hdieresis",7719,"hdotaccent",7715,"hdotbelow",7717,"he",1492,"heart",9829,"heartsuitblack",9829,"heartsuitwhite",9825,"hedagesh",64308,"hedageshhebrew",64308,"hehaltonearabic",1729,"heharabic",1607,"hehebrew",1492,"hehfinalaltonearabic",64423,"hehfinalalttwoarabic",65258,"hehfinalarabic",65258,"hehhamzaabovefinalarabic",64421,"hehhamzaaboveisolatedarabic",64420,"hehinitialaltonearabic",64424,"hehinitialarabic",65259,"hehiragana",12408,"hehmedialaltonearabic",64425,"hehmedialarabic",65260,"heiseierasquare",13179,"hekatakana",12504,"hekatakanahalfwidth",65421,"hekutaarusquare",13110,"henghook",615,"herutusquare",13113,"het",1495,"hethebrew",1495,"hhook",614,"hhooksuperior",689,"hieuhacirclekorean",12923,"hieuhaparenkorean",12827,"hieuhcirclekorean",12909,"hieuhkorean",12622,"hieuhparenkorean",12813,"hihiragana",12402,"hikatakana",12498,"hikatakanahalfwidth",65419,"hiriq",1460,"hiriq14",1460,"hiriq21",1460,"hiriq2d",1460,"hiriqhebrew",1460,"hiriqnarrowhebrew",1460,"hiriqquarterhebrew",1460,"hiriqwidehebrew",1460,"hlinebelow",7830,"hmonospace",65352,"hoarmenian",1392,"hohipthai",3627,"hohiragana",12411,"hokatakana",12507,"hokatakanahalfwidth",65422,"holam",1465,"holam19",1465,"holam26",1465,"holam32",1465,"holamhebrew",1465,"holamnarrowhebrew",1465,"holamquarterhebrew",1465,"holamwidehebrew",1465,"honokhukthai",3630,"hookabovecomb",777,"hookcmb",777,"hookpalatalizedbelowcmb",801,"hookretroflexbelowcmb",802,"hoonsquare",13122,"horicoptic",1001,"horizontalbar",8213,"horncmb",795,"hotsprings",9832,"house",8962,"hparen",9379,"hsuperior",688,"hturned",613,"huhiragana",12405,"huiitosquare",13107,"hukatakana",12501,"hukatakanahalfwidth",65420,"hungarumlaut",733,"hungarumlautcmb",779,"hv",405,"hyphen",45,"hypheninferior",63205,"hyphenmonospace",65293,"hyphensmall",65123,"hyphensuperior",63206,"hyphentwo",8208,"i",105,"iacute",237,"iacyrillic",1103,"ibengali",2439,"ibopomofo",12583,"ibreve",301,"icaron",464,"icircle",9432,"icircumflex",238,"icyrillic",1110,"idblgrave",521,"ideographearthcircle",12943,"ideographfirecircle",12939,"ideographicallianceparen",12863,"ideographiccallparen",12858,"ideographiccentrecircle",12965,"ideographicclose",12294,"ideographiccomma",12289,"ideographiccommaleft",65380,"ideographiccongratulationparen",12855,"ideographiccorrectcircle",12963,"ideographicearthparen",12847,"ideographicenterpriseparen",12861,"ideographicexcellentcircle",12957,"ideographicfestivalparen",12864,"ideographicfinancialcircle",12950,"ideographicfinancialparen",12854,"ideographicfireparen",12843,"ideographichaveparen",12850,"ideographichighcircle",12964,"ideographiciterationmark",12293,"ideographiclaborcircle",12952,"ideographiclaborparen",12856,"ideographicleftcircle",12967,"ideographiclowcircle",12966,"ideographicmedicinecircle",12969,"ideographicmetalparen",12846,"ideographicmoonparen",12842,"ideographicnameparen",12852,"ideographicperiod",12290,"ideographicprintcircle",12958,"ideographicreachparen",12867,"ideographicrepresentparen",12857,"ideographicresourceparen",12862,"ideographicrightcircle",12968,"ideographicsecretcircle",12953,"ideographicselfparen",12866,"ideographicsocietyparen",12851,"ideographicspace",12288,"ideographicspecialparen",12853,"ideographicstockparen",12849,"ideographicstudyparen",12859,"ideographicsunparen",12848,"ideographicsuperviseparen",12860,"ideographicwaterparen",12844,"ideographicwoodparen",12845,"ideographiczero",12295,"ideographmetalcircle",12942,"ideographmooncircle",12938,"ideographnamecircle",12948,"ideographsuncircle",12944,"ideographwatercircle",12940,"ideographwoodcircle",12941,"ideva",2311,"idieresis",239,"idieresisacute",7727,"idieresiscyrillic",1253,"idotbelow",7883,"iebrevecyrillic",1239,"iecyrillic",1077,"ieungacirclekorean",12917,"ieungaparenkorean",12821,"ieungcirclekorean",12903,"ieungkorean",12615,"ieungparenkorean",12807,"igrave",236,"igujarati",2695,"igurmukhi",2567,"ihiragana",12356,"ihookabove",7881,"iibengali",2440,"iicyrillic",1080,"iideva",2312,"iigujarati",2696,"iigurmukhi",2568,"iimatragurmukhi",2624,"iinvertedbreve",523,"iishortcyrillic",1081,"iivowelsignbengali",2496,"iivowelsigndeva",2368,"iivowelsigngujarati",2752,"ij",307,"ikatakana",12452,"ikatakanahalfwidth",65394,"ikorean",12643,"ilde",732,"iluyhebrew",1452,"imacron",299,"imacroncyrillic",1251,"imageorapproximatelyequal",8787,"imatragurmukhi",2623,"imonospace",65353,"increment",8710,"infinity",8734,"iniarmenian",1387,"integral",8747,"integralbottom",8993,"integralbt",8993,"integralex",63733,"integraltop",8992,"integraltp",8992,"intersection",8745,"intisquare",13061,"invbullet",9688,"invcircle",9689,"invsmileface",9787,"iocyrillic",1105,"iogonek",303,"iota",953,"iotadieresis",970,"iotadieresistonos",912,"iotalatin",617,"iotatonos",943,"iparen",9380,"irigurmukhi",2674,"ismallhiragana",12355,"ismallkatakana",12451,"ismallkatakanahalfwidth",65384,"issharbengali",2554,"istroke",616,"isuperior",63213,"iterationhiragana",12445,"iterationkatakana",12541,"itilde",297,"itildebelow",7725,"iubopomofo",12585,"iucyrillic",1102,"ivowelsignbengali",2495,"ivowelsigndeva",2367,"ivowelsigngujarati",2751,"izhitsacyrillic",1141,"izhitsadblgravecyrillic",1143,"j",106,"jaarmenian",1393,"jabengali",2460,"jadeva",2332,"jagujarati",2716,"jagurmukhi",2588,"jbopomofo",12560,"jcaron",496,"jcircle",9433,"jcircumflex",309,"jcrossedtail",669,"jdotlessstroke",607,"jecyrillic",1112,"jeemarabic",1580,"jeemfinalarabic",65182,"jeeminitialarabic",65183,"jeemmedialarabic",65184,"jeharabic",1688,"jehfinalarabic",64395,"jhabengali",2461,"jhadeva",2333,"jhagujarati",2717,"jhagurmukhi",2589,"jheharmenian",1403,"jis",12292,"jmonospace",65354,"jparen",9381,"jsuperior",690,"k",107,"kabashkircyrillic",1185,"kabengali",2453,"kacute",7729,"kacyrillic",1082,"kadescendercyrillic",1179,"kadeva",2325,"kaf",1499,"kafarabic",1603,"kafdagesh",64315,"kafdageshhebrew",64315,"kaffinalarabic",65242,"kafhebrew",1499,"kafinitialarabic",65243,"kafmedialarabic",65244,"kafrafehebrew",64333,"kagujarati",2709,"kagurmukhi",2581,"kahiragana",12363,"kahookcyrillic",1220,"kakatakana",12459,"kakatakanahalfwidth",65398,"kappa",954,"kappasymbolgreek",1008,"kapyeounmieumkorean",12657,"kapyeounphieuphkorean",12676,"kapyeounpieupkorean",12664,"kapyeounssangpieupkorean",12665,"karoriisquare",13069,"kashidaautoarabic",1600,"kashidaautonosidebearingarabic",1600,"kasmallkatakana",12533,"kasquare",13188,"kasraarabic",1616,"kasratanarabic",1613,"kastrokecyrillic",1183,"katahiraprolongmarkhalfwidth",65392,"kaverticalstrokecyrillic",1181,"kbopomofo",12558,"kcalsquare",13193,"kcaron",489,"kcedilla",311,"kcircle",9434,"kcommaaccent",311,"kdotbelow",7731,"keharmenian",1412,"kehiragana",12369,"kekatakana",12465,"kekatakanahalfwidth",65401,"kenarmenian",1391,"kesmallkatakana",12534,"kgreenlandic",312,"khabengali",2454,"khacyrillic",1093,"khadeva",2326,"khagujarati",2710,"khagurmukhi",2582,"khaharabic",1582,"khahfinalarabic",65190,"khahinitialarabic",65191,"khahmedialarabic",65192,"kheicoptic",999,"khhadeva",2393,"khhagurmukhi",2649,"khieukhacirclekorean",12920,"khieukhaparenkorean",12824,"khieukhcirclekorean",12906,"khieukhkorean",12619,"khieukhparenkorean",12810,"khokhaithai",3586,"khokhonthai",3589,"khokhuatthai",3587,"khokhwaithai",3588,"khomutthai",3675,"khook",409,"khorakhangthai",3590,"khzsquare",13201,"kihiragana",12365,"kikatakana",12461,"kikatakanahalfwidth",65399,"kiroguramusquare",13077,"kiromeetorusquare",13078,"kirosquare",13076,"kiyeokacirclekorean",12910,"kiyeokaparenkorean",12814,"kiyeokcirclekorean",12896,"kiyeokkorean",12593,"kiyeokparenkorean",12800,"kiyeoksioskorean",12595,"kjecyrillic",1116,"klinebelow",7733,"klsquare",13208,"kmcubedsquare",13222,"kmonospace",65355,"kmsquaredsquare",13218,"kohiragana",12371,"kohmsquare",13248,"kokaithai",3585,"kokatakana",12467,"kokatakanahalfwidth",65402,"kooposquare",13086,"koppacyrillic",1153,"koreanstandardsymbol",12927,"koroniscmb",835,"kparen",9382,"kpasquare",13226,"ksicyrillic",1135,"ktsquare",13263,"kturned",670,"kuhiragana",12367,"kukatakana",12463,"kukatakanahalfwidth",65400,"kvsquare",13240,"kwsquare",13246,"l",108,"labengali",2482,"lacute",314,"ladeva",2354,"lagujarati",2738,"lagurmukhi",2610,"lakkhangyaothai",3653,"lamaleffinalarabic",65276,"lamalefhamzaabovefinalarabic",65272,"lamalefhamzaaboveisolatedarabic",65271,"lamalefhamzabelowfinalarabic",65274,"lamalefhamzabelowisolatedarabic",65273,"lamalefisolatedarabic",65275,"lamalefmaddaabovefinalarabic",65270,"lamalefmaddaaboveisolatedarabic",65269,"lamarabic",1604,"lambda",955,"lambdastroke",411,"lamed",1500,"lameddagesh",64316,"lameddageshhebrew",64316,"lamedhebrew",1500,"lamfinalarabic",65246,"lamhahinitialarabic",64714,"laminitialarabic",65247,"lamjeeminitialarabic",64713,"lamkhahinitialarabic",64715,"lamlamhehisolatedarabic",65010,"lammedialarabic",65248,"lammeemhahinitialarabic",64904,"lammeeminitialarabic",64716,"largecircle",9711,"lbar",410,"lbelt",620,"lbopomofo",12556,"lcaron",318,"lcedilla",316,"lcircle",9435,"lcircumflexbelow",7741,"lcommaaccent",316,"ldot",320,"ldotaccent",320,"ldotbelow",7735,"ldotbelowmacron",7737,"leftangleabovecmb",794,"lefttackbelowcmb",792,"less",60,"lessequal",8804,"lessequalorgreater",8922,"lessmonospace",65308,"lessorequivalent",8818,"lessorgreater",8822,"lessoverequal",8806,"lesssmall",65124,"lezh",622,"lfblock",9612,"lhookretroflex",621,"lira",8356,"liwnarmenian",1388,"lj",457,"ljecyrillic",1113,"ll",63168,"lladeva",2355,"llagujarati",2739,"llinebelow",7739,"llladeva",2356,"llvocalicbengali",2529,"llvocalicdeva",2401,"llvocalicvowelsignbengali",2531,"llvocalicvowelsigndeva",2403,"lmiddletilde",619,"lmonospace",65356,"lmsquare",13264,"lochulathai",3628,"logicaland",8743,"logicalnot",172,"logicalnotreversed",8976,"logicalor",8744,"lolingthai",3621,"longs",383,"lowlinecenterline",65102,"lowlinecmb",818,"lowlinedashed",65101,"lozenge",9674,"lparen",9383,"lslash",322,"lsquare",8467,"lsuperior",63214,"ltshade",9617,"luthai",3622,"lvocalicbengali",2444,"lvocalicdeva",2316,"lvocalicvowelsignbengali",2530,"lvocalicvowelsigndeva",2402,"lxsquare",13267,"m",109,"mabengali",2478,"macron",175,"macronbelowcmb",817,"macroncmb",772,"macronlowmod",717,"macronmonospace",65507,"macute",7743,"madeva",2350,"magujarati",2734,"magurmukhi",2606,"mahapakhhebrew",1444,"mahapakhlefthebrew",1444,"mahiragana",12414,"maichattawalowleftthai",63637,"maichattawalowrightthai",63636,"maichattawathai",3659,"maichattawaupperleftthai",63635,"maieklowleftthai",63628,"maieklowrightthai",63627,"maiekthai",3656,"maiekupperleftthai",63626,"maihanakatleftthai",63620,"maihanakatthai",3633,"maitaikhuleftthai",63625,"maitaikhuthai",3655,"maitholowleftthai",63631,"maitholowrightthai",63630,"maithothai",3657,"maithoupperleftthai",63629,"maitrilowleftthai",63634,"maitrilowrightthai",63633,"maitrithai",3658,"maitriupperleftthai",63632,"maiyamokthai",3654,"makatakana",12510,"makatakanahalfwidth",65423,"male",9794,"mansyonsquare",13127,"maqafhebrew",1470,"mars",9794,"masoracirclehebrew",1455,"masquare",13187,"mbopomofo",12551,"mbsquare",13268,"mcircle",9436,"mcubedsquare",13221,"mdotaccent",7745,"mdotbelow",7747,"meemarabic",1605,"meemfinalarabic",65250,"meeminitialarabic",65251,"meemmedialarabic",65252,"meemmeeminitialarabic",64721,"meemmeemisolatedarabic",64584,"meetorusquare",13133,"mehiragana",12417,"meizierasquare",13182,"mekatakana",12513,"mekatakanahalfwidth",65426,"mem",1502,"memdagesh",64318,"memdageshhebrew",64318,"memhebrew",1502,"menarmenian",1396,"merkhahebrew",1445,"merkhakefulahebrew",1446,"merkhakefulalefthebrew",1446,"merkhalefthebrew",1445,"mhook",625,"mhzsquare",13202,"middledotkatakanahalfwidth",65381,"middot",183,"mieumacirclekorean",12914,"mieumaparenkorean",12818,"mieumcirclekorean",12900,"mieumkorean",12609,"mieumpansioskorean",12656,"mieumparenkorean",12804,"mieumpieupkorean",12654,"mieumsioskorean",12655,"mihiragana",12415,"mikatakana",12511,"mikatakanahalfwidth",65424,"minus",8722,"minusbelowcmb",800,"minuscircle",8854,"minusmod",727,"minusplus",8723,"minute",8242,"miribaarusquare",13130,"mirisquare",13129,"mlonglegturned",624,"mlsquare",13206,"mmcubedsquare",13219,"mmonospace",65357,"mmsquaredsquare",13215,"mohiragana",12418,"mohmsquare",13249,"mokatakana",12514,"mokatakanahalfwidth",65427,"molsquare",13270,"momathai",3617,"moverssquare",13223,"moverssquaredsquare",13224,"mparen",9384,"mpasquare",13227,"mssquare",13235,"msuperior",63215,"mturned",623,"mu",181,"mu1",181,"muasquare",13186,"muchgreater",8811,"muchless",8810,"mufsquare",13196,"mugreek",956,"mugsquare",13197,"muhiragana",12416,"mukatakana",12512,"mukatakanahalfwidth",65425,"mulsquare",13205,"multiply",215,"mumsquare",13211,"munahhebrew",1443,"munahlefthebrew",1443,"musicalnote",9834,"musicalnotedbl",9835,"musicflatsign",9837,"musicsharpsign",9839,"mussquare",13234,"muvsquare",13238,"muwsquare",13244,"mvmegasquare",13241,"mvsquare",13239,"mwmegasquare",13247,"mwsquare",13245,"n",110,"nabengali",2472,"nabla",8711,"nacute",324,"nadeva",2344,"nagujarati",2728,"nagurmukhi",2600,"nahiragana",12394,"nakatakana",12490,"nakatakanahalfwidth",65413,"napostrophe",329,"nasquare",13185,"nbopomofo",12555,"nbspace",160,"ncaron",328,"ncedilla",326,"ncircle",9437,"ncircumflexbelow",7755,"ncommaaccent",326,"ndotaccent",7749,"ndotbelow",7751,"nehiragana",12397,"nekatakana",12493,"nekatakanahalfwidth",65416,"newsheqelsign",8362,"nfsquare",13195,"ngabengali",2457,"ngadeva",2329,"ngagujarati",2713,"ngagurmukhi",2585,"ngonguthai",3591,"nhiragana",12435,"nhookleft",626,"nhookretroflex",627,"nieunacirclekorean",12911,"nieunaparenkorean",12815,"nieuncieuckorean",12597,"nieuncirclekorean",12897,"nieunhieuhkorean",12598,"nieunkorean",12596,"nieunpansioskorean",12648,"nieunparenkorean",12801,"nieunsioskorean",12647,"nieuntikeutkorean",12646,"nihiragana",12395,"nikatakana",12491,"nikatakanahalfwidth",65414,"nikhahitleftthai",63641,"nikhahitthai",3661,"nine",57,"ninearabic",1641,"ninebengali",2543,"ninecircle",9320,"ninecircleinversesansserif",10130,"ninedeva",2415,"ninegujarati",2799,"ninegurmukhi",2671,"ninehackarabic",1641,"ninehangzhou",12329,"nineideographicparen",12840,"nineinferior",8329,"ninemonospace",65305,"nineoldstyle",63289,"nineparen",9340,"nineperiod",9360,"ninepersian",1785,"nineroman",8568,"ninesuperior",8313,"nineteencircle",9330,"nineteenparen",9350,"nineteenperiod",9370,"ninethai",3673,"nj",460,"njecyrillic",1114,"nkatakana",12531,"nkatakanahalfwidth",65437,"nlegrightlong",414,"nlinebelow",7753,"nmonospace",65358,"nmsquare",13210,"nnabengali",2467,"nnadeva",2339,"nnagujarati",2723,"nnagurmukhi",2595,"nnnadeva",2345,"nohiragana",12398,"nokatakana",12494,"nokatakanahalfwidth",65417,"nonbreakingspace",160,"nonenthai",3603,"nonuthai",3609,"noonarabic",1606,"noonfinalarabic",65254,"noonghunnaarabic",1722,"noonghunnafinalarabic",64415,"nooninitialarabic",65255,"noonjeeminitialarabic",64722,"noonjeemisolatedarabic",64587,"noonmedialarabic",65256,"noonmeeminitialarabic",64725,"noonmeemisolatedarabic",64590,"noonnoonfinalarabic",64653,"notcontains",8716,"notelement",8713,"notelementof",8713,"notequal",8800,"notgreater",8815,"notgreaternorequal",8817,"notgreaternorless",8825,"notidentical",8802,"notless",8814,"notlessnorequal",8816,"notparallel",8742,"notprecedes",8832,"notsubset",8836,"notsucceeds",8833,"notsuperset",8837,"nowarmenian",1398,"nparen",9385,"nssquare",13233,"nsuperior",8319,"ntilde",241,"nu",957,"nuhiragana",12396,"nukatakana",12492,"nukatakanahalfwidth",65415,"nuktabengali",2492,"nuktadeva",2364,"nuktagujarati",2748,"nuktagurmukhi",2620,"numbersign",35,"numbersignmonospace",65283,"numbersignsmall",65119,"numeralsigngreek",884,"numeralsignlowergreek",885,"numero",8470,"nun",1504,"nundagesh",64320,"nundageshhebrew",64320,"nunhebrew",1504,"nvsquare",13237,"nwsquare",13243,"nyabengali",2462,"nyadeva",2334,"nyagujarati",2718,"nyagurmukhi",2590,"o",111,"oacute",243,"oangthai",3629,"obarred",629,"obarredcyrillic",1257,"obarreddieresiscyrillic",1259,"obengali",2451,"obopomofo",12571,"obreve",335,"ocandradeva",2321,"ocandragujarati",2705,"ocandravowelsigndeva",2377,"ocandravowelsigngujarati",2761,"ocaron",466,"ocircle",9438,"ocircumflex",244,"ocircumflexacute",7889,"ocircumflexdotbelow",7897,"ocircumflexgrave",7891,"ocircumflexhookabove",7893,"ocircumflextilde",7895,"ocyrillic",1086,"odblacute",337,"odblgrave",525,"odeva",2323,"odieresis",246,"odieresiscyrillic",1255,"odotbelow",7885,"oe",339,"oekorean",12634,"ogonek",731,"ogonekcmb",808,"ograve",242,"ogujarati",2707,"oharmenian",1413,"ohiragana",12362,"ohookabove",7887,"ohorn",417,"ohornacute",7899,"ohorndotbelow",7907,"ohorngrave",7901,"ohornhookabove",7903,"ohorntilde",7905,"ohungarumlaut",337,"oi",419,"oinvertedbreve",527,"okatakana",12458,"okatakanahalfwidth",65397,"okorean",12631,"olehebrew",1451,"omacron",333,"omacronacute",7763,"omacrongrave",7761,"omdeva",2384,"omega",969,"omega1",982,"omegacyrillic",1121,"omegalatinclosed",631,"omegaroundcyrillic",1147,"omegatitlocyrillic",1149,"omegatonos",974,"omgujarati",2768,"omicron",959,"omicrontonos",972,"omonospace",65359,"one",49,"onearabic",1633,"onebengali",2535,"onecircle",9312,"onecircleinversesansserif",10122,"onedeva",2407,"onedotenleader",8228,"oneeighth",8539,"onefitted",63196,"onegujarati",2791,"onegurmukhi",2663,"onehackarabic",1633,"onehalf",189,"onehangzhou",12321,"oneideographicparen",12832,"oneinferior",8321,"onemonospace",65297,"onenumeratorbengali",2548,"oneoldstyle",63281,"oneparen",9332,"oneperiod",9352,"onepersian",1777,"onequarter",188,"oneroman",8560,"onesuperior",185,"onethai",3665,"onethird",8531,"oogonek",491,"oogonekmacron",493,"oogurmukhi",2579,"oomatragurmukhi",2635,"oopen",596,"oparen",9386,"openbullet",9702,"option",8997,"ordfeminine",170,"ordmasculine",186,"orthogonal",8735,"oshortdeva",2322,"oshortvowelsigndeva",2378,"oslash",248,"oslashacute",511,"osmallhiragana",12361,"osmallkatakana",12457,"osmallkatakanahalfwidth",65387,"ostrokeacute",511,"osuperior",63216,"otcyrillic",1151,"otilde",245,"otildeacute",7757,"otildedieresis",7759,"oubopomofo",12577,"overline",8254,"overlinecenterline",65098,"overlinecmb",773,"overlinedashed",65097,"overlinedblwavy",65100,"overlinewavy",65099,"overscore",175,"ovowelsignbengali",2507,"ovowelsigndeva",2379,"ovowelsigngujarati",2763,"p",112,"paampssquare",13184,"paasentosquare",13099,"pabengali",2474,"pacute",7765,"padeva",2346,"pagedown",8671,"pageup",8670,"pagujarati",2730,"pagurmukhi",2602,"pahiragana",12401,"paiyannoithai",3631,"pakatakana",12497,"palatalizationcyrilliccmb",1156,"palochkacyrillic",1216,"pansioskorean",12671,"paragraph",182,"parallel",8741,"parenleft",40,"parenleftaltonearabic",64830,"parenleftbt",63725,"parenleftex",63724,"parenleftinferior",8333,"parenleftmonospace",65288,"parenleftsmall",65113,"parenleftsuperior",8317,"parenlefttp",63723,"parenleftvertical",65077,"parenright",41,"parenrightaltonearabic",64831,"parenrightbt",63736,"parenrightex",63735,"parenrightinferior",8334,"parenrightmonospace",65289,"parenrightsmall",65114,"parenrightsuperior",8318,"parenrighttp",63734,"parenrightvertical",65078,"partialdiff",8706,"paseqhebrew",1472,"pashtahebrew",1433,"pasquare",13225,"patah",1463,"patah11",1463,"patah1d",1463,"patah2a",1463,"patahhebrew",1463,"patahnarrowhebrew",1463,"patahquarterhebrew",1463,"patahwidehebrew",1463,"pazerhebrew",1441,"pbopomofo",12550,"pcircle",9439,"pdotaccent",7767,"pe",1508,"pecyrillic",1087,"pedagesh",64324,"pedageshhebrew",64324,"peezisquare",13115,"pefinaldageshhebrew",64323,"peharabic",1662,"peharmenian",1402,"pehebrew",1508,"pehfinalarabic",64343,"pehinitialarabic",64344,"pehiragana",12410,"pehmedialarabic",64345,"pekatakana",12506,"pemiddlehookcyrillic",1191,"perafehebrew",64334,"percent",37,"percentarabic",1642,"percentmonospace",65285,"percentsmall",65130,"period",46,"periodarmenian",1417,"periodcentered",183,"periodhalfwidth",65377,"periodinferior",63207,"periodmonospace",65294,"periodsmall",65106,"periodsuperior",63208,"perispomenigreekcmb",834,"perpendicular",8869,"perthousand",8240,"peseta",8359,"pfsquare",13194,"phabengali",2475,"phadeva",2347,"phagujarati",2731,"phagurmukhi",2603,"phi",966,"phi1",981,"phieuphacirclekorean",12922,"phieuphaparenkorean",12826,"phieuphcirclekorean",12908,"phieuphkorean",12621,"phieuphparenkorean",12812,"philatin",632,"phinthuthai",3642,"phisymbolgreek",981,"phook",421,"phophanthai",3614,"phophungthai",3612,"phosamphaothai",3616,"pi",960,"pieupacirclekorean",12915,"pieupaparenkorean",12819,"pieupcieuckorean",12662,"pieupcirclekorean",12901,"pieupkiyeokkorean",12658,"pieupkorean",12610,"pieupparenkorean",12805,"pieupsioskiyeokkorean",12660,"pieupsioskorean",12612,"pieupsiostikeutkorean",12661,"pieupthieuthkorean",12663,"pieuptikeutkorean",12659,"pihiragana",12404,"pikatakana",12500,"pisymbolgreek",982,"piwrarmenian",1411,"plus",43,"plusbelowcmb",799,"pluscircle",8853,"plusminus",177,"plusmod",726,"plusmonospace",65291,"plussmall",65122,"plussuperior",8314,"pmonospace",65360,"pmsquare",13272,"pohiragana",12413,"pointingindexdownwhite",9759,"pointingindexleftwhite",9756,"pointingindexrightwhite",9758,"pointingindexupwhite",9757,"pokatakana",12509,"poplathai",3611,"postalmark",12306,"postalmarkface",12320,"pparen",9387,"precedes",8826,"prescription",8478,"primemod",697,"primereversed",8245,"product",8719,"projective",8965,"prolongedkana",12540,"propellor",8984,"propersubset",8834,"propersuperset",8835,"proportion",8759,"proportional",8733,"psi",968,"psicyrillic",1137,"psilipneumatacyrilliccmb",1158,"pssquare",13232,"puhiragana",12407,"pukatakana",12503,"pvsquare",13236,"pwsquare",13242,"q",113,"qadeva",2392,"qadmahebrew",1448,"qafarabic",1602,"qaffinalarabic",65238,"qafinitialarabic",65239,"qafmedialarabic",65240,"qamats",1464,"qamats10",1464,"qamats1a",1464,"qamats1c",1464,"qamats27",1464,"qamats29",1464,"qamats33",1464,"qamatsde",1464,"qamatshebrew",1464,"qamatsnarrowhebrew",1464,"qamatsqatanhebrew",1464,"qamatsqatannarrowhebrew",1464,"qamatsqatanquarterhebrew",1464,"qamatsqatanwidehebrew",1464,"qamatsquarterhebrew",1464,"qamatswidehebrew",1464,"qarneyparahebrew",1439,"qbopomofo",12561,"qcircle",9440,"qhook",672,"qmonospace",65361,"qof",1511,"qofdagesh",64327,"qofdageshhebrew",64327,"qofhebrew",1511,"qparen",9388,"quarternote",9833,"qubuts",1467,"qubuts18",1467,"qubuts25",1467,"qubuts31",1467,"qubutshebrew",1467,"qubutsnarrowhebrew",1467,"qubutsquarterhebrew",1467,"qubutswidehebrew",1467,"question",63,"questionarabic",1567,"questionarmenian",1374,"questiondown",191,"questiondownsmall",63423,"questiongreek",894,"questionmonospace",65311,"questionsmall",63295,"quotedbl",34,"quotedblbase",8222,"quotedblleft",8220,"quotedblmonospace",65282,"quotedblprime",12318,"quotedblprimereversed",12317,"quotedblright",8221,"quoteleft",8216,"quoteleftreversed",8219,"quotereversed",8219,"quoteright",8217,"quoterightn",329,"quotesinglbase",8218,"quotesingle",39,"quotesinglemonospace",65287,"r",114,"raarmenian",1404,"rabengali",2480,"racute",341,"radeva",2352,"radical",8730,"radicalex",63717,"radoverssquare",13230,"radoverssquaredsquare",13231,"radsquare",13229,"rafe",1471,"rafehebrew",1471,"ragujarati",2736,"ragurmukhi",2608,"rahiragana",12425,"rakatakana",12521,"rakatakanahalfwidth",65431,"ralowerdiagonalbengali",2545,"ramiddlediagonalbengali",2544,"ramshorn",612,"ratio",8758,"rbopomofo",12566,"rcaron",345,"rcedilla",343,"rcircle",9441,"rcommaaccent",343,"rdblgrave",529,"rdotaccent",7769,"rdotbelow",7771,"rdotbelowmacron",7773,"referencemark",8251,"reflexsubset",8838,"reflexsuperset",8839,"registered",174,"registersans",63720,"registerserif",63194,"reharabic",1585,"reharmenian",1408,"rehfinalarabic",65198,"rehiragana",12428,"rekatakana",12524,"rekatakanahalfwidth",65434,"resh",1512,"reshdageshhebrew",64328,"reshhebrew",1512,"reversedtilde",8765,"reviahebrew",1431,"reviamugrashhebrew",1431,"revlogicalnot",8976,"rfishhook",638,"rfishhookreversed",639,"rhabengali",2525,"rhadeva",2397,"rho",961,"rhook",637,"rhookturned",635,"rhookturnedsuperior",693,"rhosymbolgreek",1009,"rhotichookmod",734,"rieulacirclekorean",12913,"rieulaparenkorean",12817,"rieulcirclekorean",12899,"rieulhieuhkorean",12608,"rieulkiyeokkorean",12602,"rieulkiyeoksioskorean",12649,"rieulkorean",12601,"rieulmieumkorean",12603,"rieulpansioskorean",12652,"rieulparenkorean",12803,"rieulphieuphkorean",12607,"rieulpieupkorean",12604,"rieulpieupsioskorean",12651,"rieulsioskorean",12605,"rieulthieuthkorean",12606,"rieultikeutkorean",12650,"rieulyeorinhieuhkorean",12653,"rightangle",8735,"righttackbelowcmb",793,"righttriangle",8895,"rihiragana",12426,"rikatakana",12522,"rikatakanahalfwidth",65432,"ring",730,"ringbelowcmb",805,"ringcmb",778,"ringhalfleft",703,"ringhalfleftarmenian",1369,"ringhalfleftbelowcmb",796,"ringhalfleftcentered",723,"ringhalfright",702,"ringhalfrightbelowcmb",825,"ringhalfrightcentered",722,"rinvertedbreve",531,"rittorusquare",13137,"rlinebelow",7775,"rlongleg",636,"rlonglegturned",634,"rmonospace",65362,"rohiragana",12429,"rokatakana",12525,"rokatakanahalfwidth",65435,"roruathai",3619,"rparen",9389,"rrabengali",2524,"rradeva",2353,"rragurmukhi",2652,"rreharabic",1681,"rrehfinalarabic",64397,"rrvocalicbengali",2528,"rrvocalicdeva",2400,"rrvocalicgujarati",2784,"rrvocalicvowelsignbengali",2500,"rrvocalicvowelsigndeva",2372,"rrvocalicvowelsigngujarati",2756,"rsuperior",63217,"rtblock",9616,"rturned",633,"rturnedsuperior",692,"ruhiragana",12427,"rukatakana",12523,"rukatakanahalfwidth",65433,"rupeemarkbengali",2546,"rupeesignbengali",2547,"rupiah",63197,"ruthai",3620,"rvocalicbengali",2443,"rvocalicdeva",2315,"rvocalicgujarati",2699,"rvocalicvowelsignbengali",2499,"rvocalicvowelsigndeva",2371,"rvocalicvowelsigngujarati",2755,"s",115,"sabengali",2488,"sacute",347,"sacutedotaccent",7781,"sadarabic",1589,"sadeva",2360,"sadfinalarabic",65210,"sadinitialarabic",65211,"sadmedialarabic",65212,"sagujarati",2744,"sagurmukhi",2616,"sahiragana",12373,"sakatakana",12469,"sakatakanahalfwidth",65403,"sallallahoualayhewasallamarabic",65018,"samekh",1505,"samekhdagesh",64321,"samekhdageshhebrew",64321,"samekhhebrew",1505,"saraaathai",3634,"saraaethai",3649,"saraaimaimalaithai",3652,"saraaimaimuanthai",3651,"saraamthai",3635,"saraathai",3632,"saraethai",3648,"saraiileftthai",63622,"saraiithai",3637,"saraileftthai",63621,"saraithai",3636,"saraothai",3650,"saraueeleftthai",63624,"saraueethai",3639,"saraueleftthai",63623,"sarauethai",3638,"sarauthai",3640,"sarauuthai",3641,"sbopomofo",12569,"scaron",353,"scarondotaccent",7783,"scedilla",351,"schwa",601,"schwacyrillic",1241,"schwadieresiscyrillic",1243,"schwahook",602,"scircle",9442,"scircumflex",349,"scommaaccent",537,"sdotaccent",7777,"sdotbelow",7779,"sdotbelowdotaccent",7785,"seagullbelowcmb",828,"second",8243,"secondtonechinese",714,"section",167,"seenarabic",1587,"seenfinalarabic",65202,"seeninitialarabic",65203,"seenmedialarabic",65204,"segol",1462,"segol13",1462,"segol1f",1462,"segol2c",1462,"segolhebrew",1462,"segolnarrowhebrew",1462,"segolquarterhebrew",1462,"segoltahebrew",1426,"segolwidehebrew",1462,"seharmenian",1405,"sehiragana",12379,"sekatakana",12475,"sekatakanahalfwidth",65406,"semicolon",59,"semicolonarabic",1563,"semicolonmonospace",65307,"semicolonsmall",65108,"semivoicedmarkkana",12444,"semivoicedmarkkanahalfwidth",65439,"sentisquare",13090,"sentosquare",13091,"seven",55,"sevenarabic",1639,"sevenbengali",2541,"sevencircle",9318,"sevencircleinversesansserif",10128,"sevendeva",2413,"seveneighths",8542,"sevengujarati",2797,"sevengurmukhi",2669,"sevenhackarabic",1639,"sevenhangzhou",12327,"sevenideographicparen",12838,"seveninferior",8327,"sevenmonospace",65303,"sevenoldstyle",63287,"sevenparen",9338,"sevenperiod",9358,"sevenpersian",1783,"sevenroman",8566,"sevensuperior",8311,"seventeencircle",9328,"seventeenparen",9348,"seventeenperiod",9368,"seventhai",3671,"sfthyphen",173,"shaarmenian",1399,"shabengali",2486,"shacyrillic",1096,"shaddaarabic",1617,"shaddadammaarabic",64609,"shaddadammatanarabic",64606,"shaddafathaarabic",64608,"shaddakasraarabic",64610,"shaddakasratanarabic",64607,"shade",9618,"shadedark",9619,"shadelight",9617,"shademedium",9618,"shadeva",2358,"shagujarati",2742,"shagurmukhi",2614,"shalshelethebrew",1427,"shbopomofo",12565,"shchacyrillic",1097,"sheenarabic",1588,"sheenfinalarabic",65206,"sheeninitialarabic",65207,"sheenmedialarabic",65208,"sheicoptic",995,"sheqel",8362,"sheqelhebrew",8362,"sheva",1456,"sheva115",1456,"sheva15",1456,"sheva22",1456,"sheva2e",1456,"shevahebrew",1456,"shevanarrowhebrew",1456,"shevaquarterhebrew",1456,"shevawidehebrew",1456,"shhacyrillic",1211,"shimacoptic",1005,"shin",1513,"shindagesh",64329,"shindageshhebrew",64329,"shindageshshindot",64300,"shindageshshindothebrew",64300,"shindageshsindot",64301,"shindageshsindothebrew",64301,"shindothebrew",1473,"shinhebrew",1513,"shinshindot",64298,"shinshindothebrew",64298,"shinsindot",64299,"shinsindothebrew",64299,"shook",642,"sigma",963,"sigma1",962,"sigmafinal",962,"sigmalunatesymbolgreek",1010,"sihiragana",12375,"sikatakana",12471,"sikatakanahalfwidth",65404,"siluqhebrew",1469,"siluqlefthebrew",1469,"similar",8764,"sindothebrew",1474,"siosacirclekorean",12916,"siosaparenkorean",12820,"sioscieuckorean",12670,"sioscirclekorean",12902,"sioskiyeokkorean",12666,"sioskorean",12613,"siosnieunkorean",12667,"siosparenkorean",12806,"siospieupkorean",12669,"siostikeutkorean",12668,"six",54,"sixarabic",1638,"sixbengali",2540,"sixcircle",9317,"sixcircleinversesansserif",10127,"sixdeva",2412,"sixgujarati",2796,"sixgurmukhi",2668,"sixhackarabic",1638,"sixhangzhou",12326,"sixideographicparen",12837,"sixinferior",8326,"sixmonospace",65302,"sixoldstyle",63286,"sixparen",9337,"sixperiod",9357,"sixpersian",1782,"sixroman",8565,"sixsuperior",8310,"sixteencircle",9327,"sixteencurrencydenominatorbengali",2553,"sixteenparen",9347,"sixteenperiod",9367,"sixthai",3670,"slash",47,"slashmonospace",65295,"slong",383,"slongdotaccent",7835,"smileface",9786,"smonospace",65363,"sofpasuqhebrew",1475,"softhyphen",173,"softsigncyrillic",1100,"sohiragana",12381,"sokatakana",12477,"sokatakanahalfwidth",65407,"soliduslongoverlaycmb",824,"solidusshortoverlaycmb",823,"sorusithai",3625,"sosalathai",3624,"sosothai",3595,"sosuathai",3626,"space",32,"spacehackarabic",32,"spade",9824,"spadesuitblack",9824,"spadesuitwhite",9828,"sparen",9390,"squarebelowcmb",827,"squarecc",13252,"squarecm",13213,"squarediagonalcrosshatchfill",9641,"squarehorizontalfill",9636,"squarekg",13199,"squarekm",13214,"squarekmcapital",13262,"squareln",13265,"squarelog",13266,"squaremg",13198,"squaremil",13269,"squaremm",13212,"squaremsquared",13217,"squareorthogonalcrosshatchfill",9638,"squareupperlefttolowerrightfill",9639,"squareupperrighttolowerleftfill",9640,"squareverticalfill",9637,"squarewhitewithsmallblack",9635,"srsquare",13275,"ssabengali",2487,"ssadeva",2359,"ssagujarati",2743,"ssangcieuckorean",12617,"ssanghieuhkorean",12677,"ssangieungkorean",12672,"ssangkiyeokkorean",12594,"ssangnieunkorean",12645,"ssangpieupkorean",12611,"ssangsioskorean",12614,"ssangtikeutkorean",12600,"ssuperior",63218,"sterling",163,"sterlingmonospace",65505,"strokelongoverlaycmb",822,"strokeshortoverlaycmb",821,"subset",8834,"subsetnotequal",8842,"subsetorequal",8838,"succeeds",8827,"suchthat",8715,"suhiragana",12377,"sukatakana",12473,"sukatakanahalfwidth",65405,"sukunarabic",1618,"summation",8721,"sun",9788,"superset",8835,"supersetnotequal",8843,"supersetorequal",8839,"svsquare",13276,"syouwaerasquare",13180,"t",116,"tabengali",2468,"tackdown",8868,"tackleft",8867,"tadeva",2340,"tagujarati",2724,"tagurmukhi",2596,"taharabic",1591,"tahfinalarabic",65218,"tahinitialarabic",65219,"tahiragana",12383,"tahmedialarabic",65220,"taisyouerasquare",13181,"takatakana",12479,"takatakanahalfwidth",65408,"tatweelarabic",1600,"tau",964,"tav",1514,"tavdages",64330,"tavdagesh",64330,"tavdageshhebrew",64330,"tavhebrew",1514,"tbar",359,"tbopomofo",12554,"tcaron",357,"tccurl",680,"tcedilla",355,"tcheharabic",1670,"tchehfinalarabic",64379,"tchehinitialarabic",64380,"tchehmedialarabic",64381,"tcircle",9443,"tcircumflexbelow",7793,"tcommaaccent",355,"tdieresis",7831,"tdotaccent",7787,"tdotbelow",7789,"tecyrillic",1090,"tedescendercyrillic",1197,"teharabic",1578,"tehfinalarabic",65174,"tehhahinitialarabic",64674,"tehhahisolatedarabic",64524,"tehinitialarabic",65175,"tehiragana",12390,"tehjeeminitialarabic",64673,"tehjeemisolatedarabic",64523,"tehmarbutaarabic",1577,"tehmarbutafinalarabic",65172,"tehmedialarabic",65176,"tehmeeminitialarabic",64676,"tehmeemisolatedarabic",64526,"tehnoonfinalarabic",64627,"tekatakana",12486,"tekatakanahalfwidth",65411,"telephone",8481,"telephoneblack",9742,"telishagedolahebrew",1440,"telishaqetanahebrew",1449,"tencircle",9321,"tenideographicparen",12841,"tenparen",9341,"tenperiod",9361,"tenroman",8569,"tesh",679,"tet",1496,"tetdagesh",64312,"tetdageshhebrew",64312,"tethebrew",1496,"tetsecyrillic",1205,"tevirhebrew",1435,"tevirlefthebrew",1435,"thabengali",2469,"thadeva",2341,"thagujarati",2725,"thagurmukhi",2597,"thalarabic",1584,"thalfinalarabic",65196,"thanthakhatlowleftthai",63640,"thanthakhatlowrightthai",63639,"thanthakhatthai",3660,"thanthakhatupperleftthai",63638,"theharabic",1579,"thehfinalarabic",65178,"thehinitialarabic",65179,"thehmedialarabic",65180,"thereexists",8707,"therefore",8756,"theta",952,"theta1",977,"thetasymbolgreek",977,"thieuthacirclekorean",12921,"thieuthaparenkorean",12825,"thieuthcirclekorean",12907,"thieuthkorean",12620,"thieuthparenkorean",12811,"thirteencircle",9324,"thirteenparen",9344,"thirteenperiod",9364,"thonangmonthothai",3601,"thook",429,"thophuthaothai",3602,"thorn",254,"thothahanthai",3607,"thothanthai",3600,"thothongthai",3608,"thothungthai",3606,"thousandcyrillic",1154,"thousandsseparatorarabic",1644,"thousandsseparatorpersian",1644,"three",51,"threearabic",1635,"threebengali",2537,"threecircle",9314,"threecircleinversesansserif",10124,"threedeva",2409,"threeeighths",8540,"threegujarati",2793,"threegurmukhi",2665,"threehackarabic",1635,"threehangzhou",12323,"threeideographicparen",12834,"threeinferior",8323,"threemonospace",65299,"threenumeratorbengali",2550,"threeoldstyle",63283,"threeparen",9334,"threeperiod",9354,"threepersian",1779,"threequarters",190,"threequartersemdash",63198,"threeroman",8562,"threesuperior",179,"threethai",3667,"thzsquare",13204,"tihiragana",12385,"tikatakana",12481,"tikatakanahalfwidth",65409,"tikeutacirclekorean",12912,"tikeutaparenkorean",12816,"tikeutcirclekorean",12898,"tikeutkorean",12599,"tikeutparenkorean",12802,"tilde",732,"tildebelowcmb",816,"tildecmb",771,"tildecomb",771,"tildedoublecmb",864,"tildeoperator",8764,"tildeoverlaycmb",820,"tildeverticalcmb",830,"timescircle",8855,"tipehahebrew",1430,"tipehalefthebrew",1430,"tippigurmukhi",2672,"titlocyrilliccmb",1155,"tiwnarmenian",1407,"tlinebelow",7791,"tmonospace",65364,"toarmenian",1385,"tohiragana",12392,"tokatakana",12488,"tokatakanahalfwidth",65412,"tonebarextrahighmod",741,"tonebarextralowmod",745,"tonebarhighmod",742,"tonebarlowmod",744,"tonebarmidmod",743,"tonefive",445,"tonesix",389,"tonetwo",424,"tonos",900,"tonsquare",13095,"topatakthai",3599,"tortoiseshellbracketleft",12308,"tortoiseshellbracketleftsmall",65117,"tortoiseshellbracketleftvertical",65081,"tortoiseshellbracketright",12309,"tortoiseshellbracketrightsmall",65118,"tortoiseshellbracketrightvertical",65082,"totaothai",3605,"tpalatalhook",427,"tparen",9391,"trademark",8482,"trademarksans",63722,"trademarkserif",63195,"tretroflexhook",648,"triagdn",9660,"triaglf",9668,"triagrt",9658,"triagup",9650,"ts",678,"tsadi",1510,"tsadidagesh",64326,"tsadidageshhebrew",64326,"tsadihebrew",1510,"tsecyrillic",1094,"tsere",1461,"tsere12",1461,"tsere1e",1461,"tsere2b",1461,"tserehebrew",1461,"tserenarrowhebrew",1461,"tserequarterhebrew",1461,"tserewidehebrew",1461,"tshecyrillic",1115,"tsuperior",63219,"ttabengali",2463,"ttadeva",2335,"ttagujarati",2719,"ttagurmukhi",2591,"tteharabic",1657,"ttehfinalarabic",64359,"ttehinitialarabic",64360,"ttehmedialarabic",64361,"tthabengali",2464,"tthadeva",2336,"tthagujarati",2720,"tthagurmukhi",2592,"tturned",647,"tuhiragana",12388,"tukatakana",12484,"tukatakanahalfwidth",65410,"tusmallhiragana",12387,"tusmallkatakana",12483,"tusmallkatakanahalfwidth",65391,"twelvecircle",9323,"twelveparen",9343,"twelveperiod",9363,"twelveroman",8571,"twentycircle",9331,"twentyhangzhou",21316,"twentyparen",9351,"twentyperiod",9371,"two",50,"twoarabic",1634,"twobengali",2536,"twocircle",9313,"twocircleinversesansserif",10123,"twodeva",2408,"twodotenleader",8229,"twodotleader",8229,"twodotleadervertical",65072,"twogujarati",2792,"twogurmukhi",2664,"twohackarabic",1634,"twohangzhou",12322,"twoideographicparen",12833,"twoinferior",8322,"twomonospace",65298,"twonumeratorbengali",2549,"twooldstyle",63282,"twoparen",9333,"twoperiod",9353,"twopersian",1778,"tworoman",8561,"twostroke",443,"twosuperior",178,"twothai",3666,"twothirds",8532,"u",117,"uacute",250,"ubar",649,"ubengali",2441,"ubopomofo",12584,"ubreve",365,"ucaron",468,"ucircle",9444,"ucircumflex",251,"ucircumflexbelow",7799,"ucyrillic",1091,"udattadeva",2385,"udblacute",369,"udblgrave",533,"udeva",2313,"udieresis",252,"udieresisacute",472,"udieresisbelow",7795,"udieresiscaron",474,"udieresiscyrillic",1265,"udieresisgrave",476,"udieresismacron",470,"udotbelow",7909,"ugrave",249,"ugujarati",2697,"ugurmukhi",2569,"uhiragana",12358,"uhookabove",7911,"uhorn",432,"uhornacute",7913,"uhorndotbelow",7921,"uhorngrave",7915,"uhornhookabove",7917,"uhorntilde",7919,"uhungarumlaut",369,"uhungarumlautcyrillic",1267,"uinvertedbreve",535,"ukatakana",12454,"ukatakanahalfwidth",65395,"ukcyrillic",1145,"ukorean",12636,"umacron",363,"umacroncyrillic",1263,"umacrondieresis",7803,"umatragurmukhi",2625,"umonospace",65365,"underscore",95,"underscoredbl",8215,"underscoremonospace",65343,"underscorevertical",65075,"underscorewavy",65103,"union",8746,"universal",8704,"uogonek",371,"uparen",9392,"upblock",9600,"upperdothebrew",1476,"upsilon",965,"upsilondieresis",971,"upsilondieresistonos",944,"upsilonlatin",650,"upsilontonos",973,"uptackbelowcmb",797,"uptackmod",724,"uragurmukhi",2675,"uring",367,"ushortcyrillic",1118,"usmallhiragana",12357,"usmallkatakana",12453,"usmallkatakanahalfwidth",65385,"ustraightcyrillic",1199,"ustraightstrokecyrillic",1201,"utilde",361,"utildeacute",7801,"utildebelow",7797,"uubengali",2442,"uudeva",2314,"uugujarati",2698,"uugurmukhi",2570,"uumatragurmukhi",2626,"uuvowelsignbengali",2498,"uuvowelsigndeva",2370,"uuvowelsigngujarati",2754,"uvowelsignbengali",2497,"uvowelsigndeva",2369,"uvowelsigngujarati",2753,"v",118,"vadeva",2357,"vagujarati",2741,"vagurmukhi",2613,"vakatakana",12535,"vav",1493,"vavdagesh",64309,"vavdagesh65",64309,"vavdageshhebrew",64309,"vavhebrew",1493,"vavholam",64331,"vavholamhebrew",64331,"vavvavhebrew",1520,"vavyodhebrew",1521,"vcircle",9445,"vdotbelow",7807,"vecyrillic",1074,"veharabic",1700,"vehfinalarabic",64363,"vehinitialarabic",64364,"vehmedialarabic",64365,"vekatakana",12537,"venus",9792,"verticalbar",124,"verticallineabovecmb",781,"verticallinebelowcmb",809,"verticallinelowmod",716,"verticallinemod",712,"vewarmenian",1406,"vhook",651,"vikatakana",12536,"viramabengali",2509,"viramadeva",2381,"viramagujarati",2765,"visargabengali",2435,"visargadeva",2307,"visargagujarati",2691,"vmonospace",65366,"voarmenian",1400,"voicediterationhiragana",12446,"voicediterationkatakana",12542,"voicedmarkkana",12443,"voicedmarkkanahalfwidth",65438,"vokatakana",12538,"vparen",9393,"vtilde",7805,"vturned",652,"vuhiragana",12436,"vukatakana",12532,"w",119,"wacute",7811,"waekorean",12633,"wahiragana",12431,"wakatakana",12527,"wakatakanahalfwidth",65436,"wakorean",12632,"wasmallhiragana",12430,"wasmallkatakana",12526,"wattosquare",13143,"wavedash",12316,"wavyunderscorevertical",65076,"wawarabic",1608,"wawfinalarabic",65262,"wawhamzaabovearabic",1572,"wawhamzaabovefinalarabic",65158,"wbsquare",13277,"wcircle",9446,"wcircumflex",373,"wdieresis",7813,"wdotaccent",7815,"wdotbelow",7817,"wehiragana",12433,"weierstrass",8472,"wekatakana",12529,"wekorean",12638,"weokorean",12637,"wgrave",7809,"whitebullet",9702,"whitecircle",9675,"whitecircleinverse",9689,"whitecornerbracketleft",12302,"whitecornerbracketleftvertical",65091,"whitecornerbracketright",12303,"whitecornerbracketrightvertical",65092,"whitediamond",9671,"whitediamondcontainingblacksmalldiamond",9672,"whitedownpointingsmalltriangle",9663,"whitedownpointingtriangle",9661,"whiteleftpointingsmalltriangle",9667,"whiteleftpointingtriangle",9665,"whitelenticularbracketleft",12310,"whitelenticularbracketright",12311,"whiterightpointingsmalltriangle",9657,"whiterightpointingtriangle",9655,"whitesmallsquare",9643,"whitesmilingface",9786,"whitesquare",9633,"whitestar",9734,"whitetelephone",9743,"whitetortoiseshellbracketleft",12312,"whitetortoiseshellbracketright",12313,"whiteuppointingsmalltriangle",9653,"whiteuppointingtriangle",9651,"wihiragana",12432,"wikatakana",12528,"wikorean",12639,"wmonospace",65367,"wohiragana",12434,"wokatakana",12530,"wokatakanahalfwidth",65382,"won",8361,"wonmonospace",65510,"wowaenthai",3623,"wparen",9394,"wring",7832,"wsuperior",695,"wturned",653,"wynn",447,"x",120,"xabovecmb",829,"xbopomofo",12562,"xcircle",9447,"xdieresis",7821,"xdotaccent",7819,"xeharmenian",1389,"xi",958,"xmonospace",65368,"xparen",9395,"xsuperior",739,"y",121,"yaadosquare",13134,"yabengali",2479,"yacute",253,"yadeva",2351,"yaekorean",12626,"yagujarati",2735,"yagurmukhi",2607,"yahiragana",12420,"yakatakana",12516,"yakatakanahalfwidth",65428,"yakorean",12625,"yamakkanthai",3662,"yasmallhiragana",12419,"yasmallkatakana",12515,"yasmallkatakanahalfwidth",65388,"yatcyrillic",1123,"ycircle",9448,"ycircumflex",375,"ydieresis",255,"ydotaccent",7823,"ydotbelow",7925,"yeharabic",1610,"yehbarreearabic",1746,"yehbarreefinalarabic",64431,"yehfinalarabic",65266,"yehhamzaabovearabic",1574,"yehhamzaabovefinalarabic",65162,"yehhamzaaboveinitialarabic",65163,"yehhamzaabovemedialarabic",65164,"yehinitialarabic",65267,"yehmedialarabic",65268,"yehmeeminitialarabic",64733,"yehmeemisolatedarabic",64600,"yehnoonfinalarabic",64660,"yehthreedotsbelowarabic",1745,"yekorean",12630,"yen",165,"yenmonospace",65509,"yeokorean",12629,"yeorinhieuhkorean",12678,"yerahbenyomohebrew",1450,"yerahbenyomolefthebrew",1450,"yericyrillic",1099,"yerudieresiscyrillic",1273,"yesieungkorean",12673,"yesieungpansioskorean",12675,"yesieungsioskorean",12674,"yetivhebrew",1434,"ygrave",7923,"yhook",436,"yhookabove",7927,"yiarmenian",1397,"yicyrillic",1111,"yikorean",12642,"yinyang",9775,"yiwnarmenian",1410,"ymonospace",65369,"yod",1497,"yoddagesh",64313,"yoddageshhebrew",64313,"yodhebrew",1497,"yodyodhebrew",1522,"yodyodpatahhebrew",64287,"yohiragana",12424,"yoikorean",12681,"yokatakana",12520,"yokatakanahalfwidth",65430,"yokorean",12635,"yosmallhiragana",12423,"yosmallkatakana",12519,"yosmallkatakanahalfwidth",65390,"yotgreek",1011,"yoyaekorean",12680,"yoyakorean",12679,"yoyakthai",3618,"yoyingthai",3597,"yparen",9396,"ypogegrammeni",890,"ypogegrammenigreekcmb",837,"yr",422,"yring",7833,"ysuperior",696,"ytilde",7929,"yturned",654,"yuhiragana",12422,"yuikorean",12684,"yukatakana",12518,"yukatakanahalfwidth",65429,"yukorean",12640,"yusbigcyrillic",1131,"yusbigiotifiedcyrillic",1133,"yuslittlecyrillic",1127,"yuslittleiotifiedcyrillic",1129,"yusmallhiragana",12421,"yusmallkatakana",12517,"yusmallkatakanahalfwidth",65389,"yuyekorean",12683,"yuyeokorean",12682,"yyabengali",2527,"yyadeva",2399,"z",122,"zaarmenian",1382,"zacute",378,"zadeva",2395,"zagurmukhi",2651,"zaharabic",1592,"zahfinalarabic",65222,"zahinitialarabic",65223,"zahiragana",12374,"zahmedialarabic",65224,"zainarabic",1586,"zainfinalarabic",65200,"zakatakana",12470,"zaqefgadolhebrew",1429,"zaqefqatanhebrew",1428,"zarqahebrew",1432,"zayin",1494,"zayindagesh",64310,"zayindageshhebrew",64310,"zayinhebrew",1494,"zbopomofo",12567,"zcaron",382,"zcircle",9449,"zcircumflex",7825,"zcurl",657,"zdot",380,"zdotaccent",380,"zdotbelow",7827,"zecyrillic",1079,"zedescendercyrillic",1177,"zedieresiscyrillic",1247,"zehiragana",12380,"zekatakana",12476,"zero",48,"zeroarabic",1632,"zerobengali",2534,"zerodeva",2406,"zerogujarati",2790,"zerogurmukhi",2662,"zerohackarabic",1632,"zeroinferior",8320,"zeromonospace",65296,"zerooldstyle",63280,"zeropersian",1776,"zerosuperior",8304,"zerothai",3664,"zerowidthjoiner",65279,"zerowidthnonjoiner",8204,"zerowidthspace",8203,"zeta",950,"zhbopomofo",12563,"zhearmenian",1386,"zhebrevecyrillic",1218,"zhecyrillic",1078,"zhedescendercyrillic",1175,"zhedieresiscyrillic",1245,"zihiragana",12376,"zikatakana",12472,"zinorhebrew",1454,"zlinebelow",7829,"zmonospace",65370,"zohiragana",12382,"zokatakana",12478,"zparen",9397,"zretroflexhook",656,"zstroke",438,"zuhiragana",12378,"zukatakana",12474,".notdef",0,"angbracketleftbig",9001,"angbracketleftBig",9001,"angbracketleftbigg",9001,"angbracketleftBigg",9001,"angbracketrightBig",9002,"angbracketrightbig",9002,"angbracketrightBigg",9002,"angbracketrightbigg",9002,"arrowhookleft",8618,"arrowhookright",8617,"arrowlefttophalf",8636,"arrowleftbothalf",8637,"arrownortheast",8599,"arrownorthwest",8598,"arrowrighttophalf",8640,"arrowrightbothalf",8641,"arrowsoutheast",8600,"arrowsouthwest",8601,"backslashbig",8726,"backslashBig",8726,"backslashBigg",8726,"backslashbigg",8726,"bardbl",8214,"bracehtipdownleft",65079,"bracehtipdownright",65079,"bracehtipupleft",65080,"bracehtipupright",65080,"braceleftBig",123,"braceleftbig",123,"braceleftbigg",123,"braceleftBigg",123,"bracerightBig",125,"bracerightbig",125,"bracerightbigg",125,"bracerightBigg",125,"bracketleftbig",91,"bracketleftBig",91,"bracketleftbigg",91,"bracketleftBigg",91,"bracketrightBig",93,"bracketrightbig",93,"bracketrightbigg",93,"bracketrightBigg",93,"ceilingleftbig",8968,"ceilingleftBig",8968,"ceilingleftBigg",8968,"ceilingleftbigg",8968,"ceilingrightbig",8969,"ceilingrightBig",8969,"ceilingrightbigg",8969,"ceilingrightBigg",8969,"circledotdisplay",8857,"circledottext",8857,"circlemultiplydisplay",8855,"circlemultiplytext",8855,"circleplusdisplay",8853,"circleplustext",8853,"contintegraldisplay",8750,"contintegraltext",8750,"coproductdisplay",8720,"coproducttext",8720,"floorleftBig",8970,"floorleftbig",8970,"floorleftbigg",8970,"floorleftBigg",8970,"floorrightbig",8971,"floorrightBig",8971,"floorrightBigg",8971,"floorrightbigg",8971,"hatwide",770,"hatwider",770,"hatwidest",770,"intercal",7488,"integraldisplay",8747,"integraltext",8747,"intersectiondisplay",8898,"intersectiontext",8898,"logicalanddisplay",8743,"logicalandtext",8743,"logicalordisplay",8744,"logicalortext",8744,"parenleftBig",40,"parenleftbig",40,"parenleftBigg",40,"parenleftbigg",40,"parenrightBig",41,"parenrightbig",41,"parenrightBigg",41,"parenrightbigg",41,"prime",8242,"productdisplay",8719,"producttext",8719,"radicalbig",8730,"radicalBig",8730,"radicalBigg",8730,"radicalbigg",8730,"radicalbt",8730,"radicaltp",8730,"radicalvertex",8730,"slashbig",47,"slashBig",47,"slashBigg",47,"slashbigg",47,"summationdisplay",8721,"summationtext",8721,"tildewide",732,"tildewider",732,"tildewidest",732,"uniondisplay",8899,"unionmultidisplay",8846,"unionmultitext",8846,"unionsqdisplay",8852,"unionsqtext",8852,"uniontext",8899,"vextenddouble",8741,"vextendsingle",8739]})),i=(0,r.getArrayLookupTableFactory)((function(){return["space",32,"a1",9985,"a2",9986,"a202",9987,"a3",9988,"a4",9742,"a5",9990,"a119",9991,"a118",9992,"a117",9993,"a11",9755,"a12",9758,"a13",9996,"a14",9997,"a15",9998,"a16",9999,"a105",1e4,"a17",10001,"a18",10002,"a19",10003,"a20",10004,"a21",10005,"a22",10006,"a23",10007,"a24",10008,"a25",10009,"a26",10010,"a27",10011,"a28",10012,"a6",10013,"a7",10014,"a8",10015,"a9",10016,"a10",10017,"a29",10018,"a30",10019,"a31",10020,"a32",10021,"a33",10022,"a34",10023,"a35",9733,"a36",10025,"a37",10026,"a38",10027,"a39",10028,"a40",10029,"a41",10030,"a42",10031,"a43",10032,"a44",10033,"a45",10034,"a46",10035,"a47",10036,"a48",10037,"a49",10038,"a50",10039,"a51",10040,"a52",10041,"a53",10042,"a54",10043,"a55",10044,"a56",10045,"a57",10046,"a58",10047,"a59",10048,"a60",10049,"a61",10050,"a62",10051,"a63",10052,"a64",10053,"a65",10054,"a66",10055,"a67",10056,"a68",10057,"a69",10058,"a70",10059,"a71",9679,"a72",10061,"a73",9632,"a74",10063,"a203",10064,"a75",10065,"a204",10066,"a76",9650,"a77",9660,"a78",9670,"a79",10070,"a81",9687,"a82",10072,"a83",10073,"a84",10074,"a97",10075,"a98",10076,"a99",10077,"a100",10078,"a101",10081,"a102",10082,"a103",10083,"a104",10084,"a106",10085,"a107",10086,"a108",10087,"a112",9827,"a111",9830,"a110",9829,"a109",9824,"a120",9312,"a121",9313,"a122",9314,"a123",9315,"a124",9316,"a125",9317,"a126",9318,"a127",9319,"a128",9320,"a129",9321,"a130",10102,"a131",10103,"a132",10104,"a133",10105,"a134",10106,"a135",10107,"a136",10108,"a137",10109,"a138",10110,"a139",10111,"a140",10112,"a141",10113,"a142",10114,"a143",10115,"a144",10116,"a145",10117,"a146",10118,"a147",10119,"a148",10120,"a149",10121,"a150",10122,"a151",10123,"a152",10124,"a153",10125,"a154",10126,"a155",10127,"a156",10128,"a157",10129,"a158",10130,"a159",10131,"a160",10132,"a161",8594,"a163",8596,"a164",8597,"a196",10136,"a165",10137,"a192",10138,"a166",10139,"a167",10140,"a168",10141,"a169",10142,"a170",10143,"a171",10144,"a172",10145,"a173",10146,"a162",10147,"a174",10148,"a175",10149,"a176",10150,"a177",10151,"a178",10152,"a179",10153,"a193",10154,"a180",10155,"a199",10156,"a181",10157,"a200",10158,"a182",10159,"a201",10161,"a183",10162,"a184",10163,"a197",10164,"a185",10165,"a194",10166,"a198",10167,"a186",10168,"a195",10169,"a187",10170,"a188",10171,"a189",10172,"a190",10173,"a191",10174,"a89",10088,"a90",10089,"a93",10090,"a94",10091,"a91",10092,"a92",10093,"a205",10094,"a85",10095,"a206",10096,"a86",10097,"a87",10098,"a88",10099,"a95",10100,"a96",10101,".notdef",0]}))},(e,t,a)=>{a.r(t);a.d(t,{clearUnicodeCaches:()=>clearUnicodeCaches,getCharUnicodeCategory:()=>getCharUnicodeCategory,getNormalizedUnicodes:()=>s,getUnicodeForGlyph:()=>getUnicodeForGlyph,getUnicodeRangeFor:()=>getUnicodeRangeFor,mapSpecialUnicodeValues:()=>mapSpecialUnicodeValues,reverseIfRtl:()=>reverseIfRtl});var r=a(6);const n=(0,r.getLookupTableFactory)((function(e){e[63721]=169;e[63193]=169;e[63720]=174;e[63194]=174;e[63722]=8482;e[63195]=8482;e[63729]=9127;e[63730]=9128;e[63731]=9129;e[63740]=9131;e[63741]=9132;e[63742]=9133;e[63726]=9121;e[63727]=9122;e[63728]=9123;e[63737]=9124;e[63738]=9125;e[63739]=9126;e[63723]=9115;e[63724]=9116;e[63725]=9117;e[63734]=9118;e[63735]=9119;e[63736]=9120}));function mapSpecialUnicodeValues(e){return e>=65520&&e<=65535?0:e>=62976&&e<=63743?n()[e]||e:173===e?45:e}function getUnicodeForGlyph(e,t){let a=t[e];if(void 0!==a)return a;if(!e)return-1;if("u"===e[0]){const t=e.length;let r;if(7===t&&"n"===e[1]&&"i"===e[2])r=e.substring(3);else{if(!(t>=5&&t<=7))return-1;r=e.substring(1)}if(r===r.toUpperCase()){a=parseInt(r,16);if(a>=0)return a}}return-1}const i=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];function getUnicodeRangeFor(e){for(let t=0,a=i.length;t=a.begin&&e=t.begin&&e=t.begin&&e=0;r--)a.push(e[r]);return a.join("")}const o=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),c=new Map;function getCharUnicodeCategory(e){const t=c.get(e);if(t)return t;const a=e.match(o),r={isWhitespace:!(!a||!a[1]),isZeroWidthDiacritic:!(!a||!a[2]),isInvisibleFormatMark:!(!a||!a[3])};c.set(e,r);return r}function clearUnicodeCaches(){c.clear()}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.getSerifFonts=t.getNonStdFontMap=t.getGlyphMapForStandardFonts=t.getFontNameToFileMap=void 0;t.getStandardFontName=function getStandardFontName(e){const t=(0,n.normalizeFontName)(e);return i()[t]};t.getSymbolsFonts=t.getSupplementalGlyphMapForCalibri=t.getSupplementalGlyphMapForArialBlack=t.getStdFontMap=void 0;var r=a(6),n=a(38);const i=(0,r.getLookupTableFactory)((function(e){e["Times-Roman"]="Times-Roman";e.Helvetica="Helvetica";e.Courier="Courier";e.Symbol="Symbol";e["Times-Bold"]="Times-Bold";e["Helvetica-Bold"]="Helvetica-Bold";e["Courier-Bold"]="Courier-Bold";e.ZapfDingbats="ZapfDingbats";e["Times-Italic"]="Times-Italic";e["Helvetica-Oblique"]="Helvetica-Oblique";e["Courier-Oblique"]="Courier-Oblique";e["Times-BoldItalic"]="Times-BoldItalic";e["Helvetica-BoldOblique"]="Helvetica-BoldOblique";e["Courier-BoldOblique"]="Courier-BoldOblique";e.ArialNarrow="Helvetica";e["ArialNarrow-Bold"]="Helvetica-Bold";e["ArialNarrow-BoldItalic"]="Helvetica-BoldOblique";e["ArialNarrow-Italic"]="Helvetica-Oblique";e.ArialBlack="Helvetica";e["ArialBlack-Bold"]="Helvetica-Bold";e["ArialBlack-BoldItalic"]="Helvetica-BoldOblique";e["ArialBlack-Italic"]="Helvetica-Oblique";e["Arial-Black"]="Helvetica";e["Arial-Black-Bold"]="Helvetica-Bold";e["Arial-Black-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Black-Italic"]="Helvetica-Oblique";e.Arial="Helvetica";e["Arial-Bold"]="Helvetica-Bold";e["Arial-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Italic"]="Helvetica-Oblique";e.ArialMT="Helvetica";e["Arial-BoldItalicMT"]="Helvetica-BoldOblique";e["Arial-BoldMT"]="Helvetica-Bold";e["Arial-ItalicMT"]="Helvetica-Oblique";e.ArialUnicodeMS="Helvetica";e["ArialUnicodeMS-Bold"]="Helvetica-Bold";e["ArialUnicodeMS-BoldItalic"]="Helvetica-BoldOblique";e["ArialUnicodeMS-Italic"]="Helvetica-Oblique";e["Courier-BoldItalic"]="Courier-BoldOblique";e["Courier-Italic"]="Courier-Oblique";e.CourierNew="Courier";e["CourierNew-Bold"]="Courier-Bold";e["CourierNew-BoldItalic"]="Courier-BoldOblique";e["CourierNew-Italic"]="Courier-Oblique";e["CourierNewPS-BoldItalicMT"]="Courier-BoldOblique";e["CourierNewPS-BoldMT"]="Courier-Bold";e["CourierNewPS-ItalicMT"]="Courier-Oblique";e.CourierNewPSMT="Courier";e["Helvetica-BoldItalic"]="Helvetica-BoldOblique";e["Helvetica-Italic"]="Helvetica-Oblique";e["Symbol-Bold"]="Symbol";e["Symbol-BoldItalic"]="Symbol";e["Symbol-Italic"]="Symbol";e.TimesNewRoman="Times-Roman";e["TimesNewRoman-Bold"]="Times-Bold";e["TimesNewRoman-BoldItalic"]="Times-BoldItalic";e["TimesNewRoman-Italic"]="Times-Italic";e.TimesNewRomanPS="Times-Roman";e["TimesNewRomanPS-Bold"]="Times-Bold";e["TimesNewRomanPS-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPS-BoldItalicMT"]="Times-BoldItalic";e["TimesNewRomanPS-BoldMT"]="Times-Bold";e["TimesNewRomanPS-Italic"]="Times-Italic";e["TimesNewRomanPS-ItalicMT"]="Times-Italic";e.TimesNewRomanPSMT="Times-Roman";e["TimesNewRomanPSMT-Bold"]="Times-Bold";e["TimesNewRomanPSMT-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPSMT-Italic"]="Times-Italic"}));t.getStdFontMap=i;const s=(0,r.getLookupTableFactory)((function(e){e.Courier="FoxitFixed.pfb";e["Courier-Bold"]="FoxitFixedBold.pfb";e["Courier-BoldOblique"]="FoxitFixedBoldItalic.pfb";e["Courier-Oblique"]="FoxitFixedItalic.pfb";e.Helvetica="FoxitSans.pfb";e["Helvetica-Bold"]="FoxitSansBold.pfb";e["Helvetica-BoldOblique"]="FoxitSansBoldItalic.pfb";e["Helvetica-Oblique"]="FoxitSansItalic.pfb";e["Times-Roman"]="FoxitSerif.pfb";e["Times-Bold"]="FoxitSerifBold.pfb";e["Times-BoldItalic"]="FoxitSerifBoldItalic.pfb";e["Times-Italic"]="FoxitSerifItalic.pfb";e.Symbol="FoxitSymbol.pfb";e.ZapfDingbats="FoxitDingbats.pfb";e["LiberationSans-Regular"]="LiberationSans-Regular.ttf";e["LiberationSans-Bold"]="LiberationSans-Bold.ttf";e["LiberationSans-Italic"]="LiberationSans-Italic.ttf";e["LiberationSans-BoldItalic"]="LiberationSans-BoldItalic.ttf"}));t.getFontNameToFileMap=s;const o=(0,r.getLookupTableFactory)((function(e){e.Calibri="Helvetica";e["Calibri-Bold"]="Helvetica-Bold";e["Calibri-BoldItalic"]="Helvetica-BoldOblique";e["Calibri-Italic"]="Helvetica-Oblique";e.CenturyGothic="Helvetica";e["CenturyGothic-Bold"]="Helvetica-Bold";e["CenturyGothic-BoldItalic"]="Helvetica-BoldOblique";e["CenturyGothic-Italic"]="Helvetica-Oblique";e.ComicSansMS="Comic Sans MS";e["ComicSansMS-Bold"]="Comic Sans MS-Bold";e["ComicSansMS-BoldItalic"]="Comic Sans MS-BoldItalic";e["ComicSansMS-Italic"]="Comic Sans MS-Italic";e["ItcSymbol-Bold"]="Helvetica-Bold";e["ItcSymbol-BoldItalic"]="Helvetica-BoldOblique";e["ItcSymbol-Book"]="Helvetica";e["ItcSymbol-BookItalic"]="Helvetica-Oblique";e["ItcSymbol-Medium"]="Helvetica";e["ItcSymbol-MediumItalic"]="Helvetica-Oblique";e.LucidaConsole="Courier";e["LucidaConsole-Bold"]="Courier-Bold";e["LucidaConsole-BoldItalic"]="Courier-BoldOblique";e["LucidaConsole-Italic"]="Courier-Oblique";e["LucidaSans-Demi"]="Helvetica-Bold";e["MS-Gothic"]="MS Gothic";e["MS-Gothic-Bold"]="MS Gothic-Bold";e["MS-Gothic-BoldItalic"]="MS Gothic-BoldItalic";e["MS-Gothic-Italic"]="MS Gothic-Italic";e["MS-Mincho"]="MS Mincho";e["MS-Mincho-Bold"]="MS Mincho-Bold";e["MS-Mincho-BoldItalic"]="MS Mincho-BoldItalic";e["MS-Mincho-Italic"]="MS Mincho-Italic";e["MS-PGothic"]="MS PGothic";e["MS-PGothic-Bold"]="MS PGothic-Bold";e["MS-PGothic-BoldItalic"]="MS PGothic-BoldItalic";e["MS-PGothic-Italic"]="MS PGothic-Italic";e["MS-PMincho"]="MS PMincho";e["MS-PMincho-Bold"]="MS PMincho-Bold";e["MS-PMincho-BoldItalic"]="MS PMincho-BoldItalic";e["MS-PMincho-Italic"]="MS PMincho-Italic";e.NuptialScript="Times-Italic";e.SegoeUISymbol="Helvetica";e.Wingdings="ZapfDingbats";e["Wingdings-Regular"]="ZapfDingbats"}));t.getNonStdFontMap=o;const c=(0,r.getLookupTableFactory)((function(e){e["Adobe Jenson"]=!0;e["Adobe Text"]=!0;e.Albertus=!0;e.Aldus=!0;e.Alexandria=!0;e.Algerian=!0;e["American Typewriter"]=!0;e.Antiqua=!0;e.Apex=!0;e.Arno=!0;e.Aster=!0;e.Aurora=!0;e.Baskerville=!0;e.Bell=!0;e.Bembo=!0;e["Bembo Schoolbook"]=!0;e.Benguiat=!0;e["Berkeley Old Style"]=!0;e["Bernhard Modern"]=!0;e["Berthold City"]=!0;e.Bodoni=!0;e["Bauer Bodoni"]=!0;e["Book Antiqua"]=!0;e.Bookman=!0;e["Bordeaux Roman"]=!0;e["Californian FB"]=!0;e.Calisto=!0;e.Calvert=!0;e.Capitals=!0;e.Cambria=!0;e.Cartier=!0;e.Caslon=!0;e.Catull=!0;e.Centaur=!0;e["Century Old Style"]=!0;e["Century Schoolbook"]=!0;e.Chaparral=!0;e["Charis SIL"]=!0;e.Cheltenham=!0;e["Cholla Slab"]=!0;e.Clarendon=!0;e.Clearface=!0;e.Cochin=!0;e.Colonna=!0;e["Computer Modern"]=!0;e["Concrete Roman"]=!0;e.Constantia=!0;e["Cooper Black"]=!0;e.Corona=!0;e.Ecotype=!0;e.Egyptienne=!0;e.Elephant=!0;e.Excelsior=!0;e.Fairfield=!0;e["FF Scala"]=!0;e.Folkard=!0;e.Footlight=!0;e.FreeSerif=!0;e["Friz Quadrata"]=!0;e.Garamond=!0;e.Gentium=!0;e.Georgia=!0;e.Gloucester=!0;e["Goudy Old Style"]=!0;e["Goudy Schoolbook"]=!0;e["Goudy Pro Font"]=!0;e.Granjon=!0;e["Guardian Egyptian"]=!0;e.Heather=!0;e.Hercules=!0;e["High Tower Text"]=!0;e.Hiroshige=!0;e["Hoefler Text"]=!0;e["Humana Serif"]=!0;e.Imprint=!0;e["Ionic No. 5"]=!0;e.Janson=!0;e.Joanna=!0;e.Korinna=!0;e.Lexicon=!0;e.LiberationSerif=!0;e["Liberation Serif"]=!0;e["Linux Libertine"]=!0;e.Literaturnaya=!0;e.Lucida=!0;e["Lucida Bright"]=!0;e.Melior=!0;e.Memphis=!0;e.Miller=!0;e.Minion=!0;e.Modern=!0;e["Mona Lisa"]=!0;e["Mrs Eaves"]=!0;e["MS Serif"]=!0;e["Museo Slab"]=!0;e["New York"]=!0;e["Nimbus Roman"]=!0;e["NPS Rawlinson Roadway"]=!0;e.NuptialScript=!0;e.Palatino=!0;e.Perpetua=!0;e.Plantin=!0;e["Plantin Schoolbook"]=!0;e.Playbill=!0;e["Poor Richard"]=!0;e["Rawlinson Roadway"]=!0;e.Renault=!0;e.Requiem=!0;e.Rockwell=!0;e.Roman=!0;e["Rotis Serif"]=!0;e.Sabon=!0;e.Scala=!0;e.Seagull=!0;e.Sistina=!0;e.Souvenir=!0;e.STIX=!0;e["Stone Informal"]=!0;e["Stone Serif"]=!0;e.Sylfaen=!0;e.Times=!0;e.Trajan=!0;e["Trinité"]=!0;e["Trump Mediaeval"]=!0;e.Utopia=!0;e["Vale Type"]=!0;e["Bitstream Vera"]=!0;e["Vera Serif"]=!0;e.Versailles=!0;e.Wanted=!0;e.Weiss=!0;e["Wide Latin"]=!0;e.Windsor=!0;e.XITS=!0}));t.getSerifFonts=c;const l=(0,r.getLookupTableFactory)((function(e){e.Dingbats=!0;e.Symbol=!0;e.ZapfDingbats=!0}));t.getSymbolsFonts=l;const h=(0,r.getLookupTableFactory)((function(e){e[2]=10;e[3]=32;e[4]=33;e[5]=34;e[6]=35;e[7]=36;e[8]=37;e[9]=38;e[10]=39;e[11]=40;e[12]=41;e[13]=42;e[14]=43;e[15]=44;e[16]=45;e[17]=46;e[18]=47;e[19]=48;e[20]=49;e[21]=50;e[22]=51;e[23]=52;e[24]=53;e[25]=54;e[26]=55;e[27]=56;e[28]=57;e[29]=58;e[30]=894;e[31]=60;e[32]=61;e[33]=62;e[34]=63;e[35]=64;e[36]=65;e[37]=66;e[38]=67;e[39]=68;e[40]=69;e[41]=70;e[42]=71;e[43]=72;e[44]=73;e[45]=74;e[46]=75;e[47]=76;e[48]=77;e[49]=78;e[50]=79;e[51]=80;e[52]=81;e[53]=82;e[54]=83;e[55]=84;e[56]=85;e[57]=86;e[58]=87;e[59]=88;e[60]=89;e[61]=90;e[62]=91;e[63]=92;e[64]=93;e[65]=94;e[66]=95;e[67]=96;e[68]=97;e[69]=98;e[70]=99;e[71]=100;e[72]=101;e[73]=102;e[74]=103;e[75]=104;e[76]=105;e[77]=106;e[78]=107;e[79]=108;e[80]=109;e[81]=110;e[82]=111;e[83]=112;e[84]=113;e[85]=114;e[86]=115;e[87]=116;e[88]=117;e[89]=118;e[90]=119;e[91]=120;e[92]=121;e[93]=122;e[94]=123;e[95]=124;e[96]=125;e[97]=126;e[98]=196;e[99]=197;e[100]=199;e[101]=201;e[102]=209;e[103]=214;e[104]=220;e[105]=225;e[106]=224;e[107]=226;e[108]=228;e[109]=227;e[110]=229;e[111]=231;e[112]=233;e[113]=232;e[114]=234;e[115]=235;e[116]=237;e[117]=236;e[118]=238;e[119]=239;e[120]=241;e[121]=243;e[122]=242;e[123]=244;e[124]=246;e[125]=245;e[126]=250;e[127]=249;e[128]=251;e[129]=252;e[130]=8224;e[131]=176;e[132]=162;e[133]=163;e[134]=167;e[135]=8226;e[136]=182;e[137]=223;e[138]=174;e[139]=169;e[140]=8482;e[141]=180;e[142]=168;e[143]=8800;e[144]=198;e[145]=216;e[146]=8734;e[147]=177;e[148]=8804;e[149]=8805;e[150]=165;e[151]=181;e[152]=8706;e[153]=8721;e[154]=8719;e[156]=8747;e[157]=170;e[158]=186;e[159]=8486;e[160]=230;e[161]=248;e[162]=191;e[163]=161;e[164]=172;e[165]=8730;e[166]=402;e[167]=8776;e[168]=8710;e[169]=171;e[170]=187;e[171]=8230;e[200]=193;e[203]=205;e[210]=218;e[223]=711;e[224]=321;e[225]=322;e[226]=352;e[227]=353;e[228]=381;e[229]=382;e[233]=221;e[234]=253;e[252]=263;e[253]=268;e[254]=269;e[258]=258;e[260]=260;e[261]=261;e[265]=280;e[266]=281;e[267]=282;e[268]=283;e[269]=313;e[275]=323;e[276]=324;e[278]=328;e[283]=344;e[284]=345;e[285]=346;e[286]=347;e[292]=367;e[295]=377;e[296]=378;e[298]=380;e[305]=963;e[306]=964;e[307]=966;e[308]=8215;e[309]=8252;e[310]=8319;e[311]=8359;e[312]=8592;e[313]=8593;e[337]=9552;e[493]=1039;e[494]=1040;e[672]=1488;e[673]=1489;e[674]=1490;e[675]=1491;e[676]=1492;e[677]=1493;e[678]=1494;e[679]=1495;e[680]=1496;e[681]=1497;e[682]=1498;e[683]=1499;e[684]=1500;e[685]=1501;e[686]=1502;e[687]=1503;e[688]=1504;e[689]=1505;e[690]=1506;e[691]=1507;e[692]=1508;e[693]=1509;e[694]=1510;e[695]=1511;e[696]=1512;e[697]=1513;e[698]=1514;e[705]=1524;e[706]=8362;e[710]=64288;e[711]=64298;e[759]=1617;e[761]=1776;e[763]=1778;e[775]=1652;e[777]=1764;e[778]=1780;e[779]=1781;e[780]=1782;e[782]=771;e[783]=64726;e[786]=8363;e[788]=8532;e[790]=768;e[791]=769;e[792]=768;e[795]=803;e[797]=64336;e[798]=64337;e[799]=64342;e[800]=64343;e[801]=64344;e[802]=64345;e[803]=64362;e[804]=64363;e[805]=64364;e[2424]=7821;e[2425]=7822;e[2426]=7823;e[2427]=7824;e[2428]=7825;e[2429]=7826;e[2430]=7827;e[2433]=7682;e[2678]=8045;e[2679]=8046;e[2830]=1552;e[2838]=686;e[2840]=751;e[2842]=753;e[2843]=754;e[2844]=755;e[2846]=757;e[2856]=767;e[2857]=848;e[2858]=849;e[2862]=853;e[2863]=854;e[2864]=855;e[2865]=861;e[2866]=862;e[2906]=7460;e[2908]=7462;e[2909]=7463;e[2910]=7464;e[2912]=7466;e[2913]=7467;e[2914]=7468;e[2916]=7470;e[2917]=7471;e[2918]=7472;e[2920]=7474;e[2921]=7475;e[2922]=7476;e[2924]=7478;e[2925]=7479;e[2926]=7480;e[2928]=7482;e[2929]=7483;e[2930]=7484;e[2932]=7486;e[2933]=7487;e[2934]=7488;e[2936]=7490;e[2937]=7491;e[2938]=7492;e[2940]=7494;e[2941]=7495;e[2942]=7496;e[2944]=7498;e[2946]=7500;e[2948]=7502;e[2950]=7504;e[2951]=7505;e[2952]=7506;e[2954]=7508;e[2955]=7509;e[2956]=7510;e[2958]=7512;e[2959]=7513;e[2960]=7514;e[2962]=7516;e[2963]=7517;e[2964]=7518;e[2966]=7520;e[2967]=7521;e[2968]=7522;e[2970]=7524;e[2971]=7525;e[2972]=7526;e[2974]=7528;e[2975]=7529;e[2976]=7530;e[2978]=1537;e[2979]=1538;e[2980]=1539;e[2982]=1549;e[2983]=1551;e[2984]=1552;e[2986]=1554;e[2987]=1555;e[2988]=1556;e[2990]=1623;e[2991]=1624;e[2995]=1775;e[2999]=1791;e[3002]=64290;e[3003]=64291;e[3004]=64292;e[3006]=64294;e[3007]=64295;e[3008]=64296;e[3011]=1900;e[3014]=8223;e[3015]=8244;e[3017]=7532;e[3018]=7533;e[3019]=7534;e[3075]=7590;e[3076]=7591;e[3079]=7594;e[3080]=7595;e[3083]=7598;e[3084]=7599;e[3087]=7602;e[3088]=7603;e[3091]=7606;e[3092]=7607;e[3095]=7610;e[3096]=7611;e[3099]=7614;e[3100]=7615;e[3103]=7618;e[3104]=7619;e[3107]=8337;e[3108]=8338;e[3116]=1884;e[3119]=1885;e[3120]=1885;e[3123]=1886;e[3124]=1886;e[3127]=1887;e[3128]=1887;e[3131]=1888;e[3132]=1888;e[3135]=1889;e[3136]=1889;e[3139]=1890;e[3140]=1890;e[3143]=1891;e[3144]=1891;e[3147]=1892;e[3148]=1892;e[3153]=580;e[3154]=581;e[3157]=584;e[3158]=585;e[3161]=588;e[3162]=589;e[3165]=891;e[3166]=892;e[3169]=1274;e[3170]=1275;e[3173]=1278;e[3174]=1279;e[3181]=7622;e[3182]=7623;e[3282]=11799;e[3316]=578;e[3379]=42785;e[3393]=1159;e[3416]=8377}));t.getGlyphMapForStandardFonts=h;const u=(0,r.getLookupTableFactory)((function(e){e[227]=322;e[264]=261;e[291]=346}));t.getSupplementalGlyphMapForArialBlack=u;const d=(0,r.getLookupTableFactory)((function(e){e[1]=32;e[4]=65;e[6]=193;e[17]=66;e[18]=67;e[21]=268;e[24]=68;e[28]=69;e[30]=201;e[32]=282;e[38]=70;e[39]=71;e[44]=72;e[47]=73;e[49]=205;e[58]=74;e[60]=75;e[62]=76;e[68]=77;e[69]=78;e[75]=79;e[87]=80;e[89]=81;e[90]=82;e[92]=344;e[94]=83;e[97]=352;e[100]=84;e[104]=85;e[115]=86;e[116]=87;e[121]=88;e[122]=89;e[124]=221;e[127]=90;e[129]=381;e[258]=97;e[260]=225;e[268]=261;e[271]=98;e[272]=99;e[273]=263;e[275]=269;e[282]=100;e[286]=101;e[288]=233;e[290]=283;e[295]=281;e[296]=102;e[336]=103;e[346]=104;e[349]=105;e[351]=237;e[361]=106;e[364]=107;e[367]=108;e[371]=322;e[373]=109;e[374]=110;e[381]=111;e[383]=243;e[393]=112;e[395]=113;e[396]=114;e[398]=345;e[400]=115;e[401]=347;e[403]=353;e[410]=116;e[437]=117;e[448]=118;e[449]=119;e[454]=120;e[455]=121;e[457]=253;e[460]=122;e[462]=382;e[463]=380;e[853]=44;e[855]=58;e[856]=46;e[876]=47;e[878]=45;e[882]=45;e[894]=40;e[895]=41;e[896]=91;e[897]=93;e[923]=64;e[1004]=48;e[1005]=49;e[1006]=50;e[1007]=51;e[1008]=52;e[1009]=53;e[1010]=54;e[1011]=55;e[1012]=56;e[1013]=57;e[1081]=37;e[1085]=43;e[1086]=45}));t.getSupplementalGlyphMapForCalibri=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ToUnicodeMap=t.IdentityToUnicodeMap=void 0;var r=a(2);t.ToUnicodeMap=class ToUnicodeMap{constructor(e=[]){this._map=e}get length(){return this._map.length}forEach(e){for(const t in this._map)e(t,this._map[t].charCodeAt(0))}has(e){return void 0!==this._map[e]}get(e){return this._map[e]}charCodeOf(e){const t=this._map;if(t.length<=65536)return t.indexOf(e);for(const a in t)if(t[a]===e)return 0|a;return-1}amend(e){for(const t in e)this._map[t]=e[t]}};t.IdentityToUnicodeMap=class IdentityToUnicodeMap{constructor(e,t){this.firstChar=e;this.lastChar=t}get length(){return this.lastChar+1-this.firstChar}forEach(e){for(let t=this.firstChar,a=this.lastChar;t<=a;t++)e(t,t)}has(e){return this.firstChar<=e&&e<=this.lastChar}get(e){if(this.firstChar<=e&&e<=this.lastChar)return String.fromCharCode(e)}charCodeOf(e){return Number.isInteger(e)&&e>=this.firstChar&&e<=this.lastChar?e:-1}amend(e){(0,r.unreachable)("Should not call amend()")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CFFFont=void 0;var r=a(35),n=a(38),i=a(2);t.CFFFont=class CFFFont{constructor(e,t){this.properties=t;const a=new r.CFFParser(e,t,n.SEAC_ANALYSIS_ENABLED);this.cff=a.parse();this.cff.duplicateFirstGlyph();const s=new r.CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=s.compile()}catch(a){(0,i.warn)("Failed to compile font "+t.loadedName);this.data=e}this._createBuiltInEncoding()}get numGlyphs(){return this.cff.charStrings.count}getCharset(){return this.cff.charset.charset}getGlyphMapping(){const e=this.cff,t=this.properties,a=e.charset.charset;let r,i;if(t.composite){r=Object.create(null);let n;if(e.isCIDFont)for(i=0;i=0){const r=a[t];r&&(n[e]=r)}}n.length>0&&(this.properties.builtInEncoding=n)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FontRendererFactory=void 0;var r=a(2),n=a(35),i=a(39),s=a(37),o=a(10);function getUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function getUint16(e,t){return e[t]<<8|e[t+1]}function getInt16(e,t){return(e[t]<<24|e[t+1]<<16)>>16}function getInt8(e,t){return e[t]<<24>>24}function getFloat214(e,t){return getInt16(e,t)/16384}function getSubroutineBias(e){const t=e.length;let a=32768;t<1240?a=107:t<33900&&(a=1131);return a}function parseCmap(e,t,a){const n=1===getUint16(e,t+2)?getUint32(e,t+8):getUint32(e,t+16),i=getUint16(e,t+n);let s,o,c;if(4===i){getUint16(e,t+n+2);const a=getUint16(e,t+n+6)>>1;o=t+n+14;s=[];for(c=0;c>1;a0;)h.push({flags:i})}for(a=0;a>1;S=!0;break;case 4:c+=i.pop();moveTo(o,c);S=!0;break;case 5:for(;i.length>0;){o+=i.shift();c+=i.shift();lineTo(o,c)}break;case 6:for(;i.length>0;){o+=i.shift();lineTo(o,c);if(0===i.length)break;c+=i.shift();lineTo(o,c)}break;case 7:for(;i.length>0;){c+=i.shift();lineTo(o,c);if(0===i.length)break;o+=i.shift();lineTo(o,c)}break;case 8:for(;i.length>0;){u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 10:y=i.pop();w=null;if(a.isCFFCIDFont){const e=a.fdSelect.getFDIndex(n);if(e>=0&&eMath.abs(c-t)?o+=i.shift():c+=i.shift();bezierCurveTo(u,f,d,g,o,c);break;default:throw new r.FormatError(`unknown operator: 12 ${x}`)}break;case 14:if(i.length>=4){const e=i.pop(),r=i.pop();c=i.pop();o=i.pop();t.push({cmd:"save"},{cmd:"translate",args:[o,c]});let n=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[e]]));compileCharString(a.glyphs[n.glyphId],t,a,n.glyphId);t.push({cmd:"restore"});n=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[r]]));compileCharString(a.glyphs[n.glyphId],t,a,n.glyphId)}return;case 19:case 20:l+=i.length>>1;h+=l+7>>3;S=!0;break;case 21:c+=i.pop();o+=i.pop();moveTo(o,c);S=!0;break;case 22:o+=i.pop();moveTo(o,c);S=!0;break;case 24:for(;i.length>2;){u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}o+=i.shift();c+=i.shift();lineTo(o,c);break;case 25:for(;i.length>6;){o+=i.shift();c+=i.shift();lineTo(o,c)}u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c);break;case 26:i.length%2&&(o+=i.shift());for(;i.length>0;){u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d;c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 27:i.length%2&&(c+=i.shift());for(;i.length>0;){u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g;bezierCurveTo(u,f,d,g,o,c)}break;case 28:i.push((e[h]<<24|e[h+1]<<16)>>16);h+=2;break;case 29:y=i.pop()+a.gsubrsBias;w=a.gsubrs[y];w&&parse(w);break;case 30:for(;i.length>0;){u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===i.length)break;u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();c=g+i.shift();o=d+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;case 31:for(;i.length>0;){u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();c=g+i.shift();o=d+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===i.length)break;u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;default:if(x<32)throw new r.FormatError(`unknown operator: ${x}`);if(x<247)i.push(x-139);else if(x<251)i.push(256*(x-247)+e[h++]+108);else if(x<255)i.push(256*-(x-251)-e[h++]-108);else{i.push((e[h]<<24|e[h+1]<<16|e[h+2]<<8|e[h+3])/65536);h+=4}}S&&(i.length=0)}}(e)}const c=[];class CompiledFont{constructor(e){this.constructor===CompiledFont&&(0,r.unreachable)("Cannot initialize CompiledFont.");this.fontMatrix=e;this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null)}getPathJs(e){const{charCode:t,glyphId:a}=lookupCmap(this.cmap,e);let r=this.compiledGlyphs[a];if(!r)try{r=this.compileGlyph(this.glyphs[a],a);this.compiledGlyphs[a]=r}catch(e){this.compiledGlyphs[a]=c;void 0===this.compiledCharCodeToGlyphId[t]&&(this.compiledCharCodeToGlyphId[t]=a);throw e}void 0===this.compiledCharCodeToGlyphId[t]&&(this.compiledCharCodeToGlyphId[t]=a);return r}compileGlyph(e,t){if(!e||0===e.length||14===e[0])return c;let a=this.fontMatrix;if(this.isCFFCIDFont){const e=this.fdSelect.getFDIndex(t);if(e>=0&&e2*getUint16(e,t)}const i=[];let s=n(t,0);for(let a=r;a{Object.defineProperty(t,"__esModule",{value:!0});t.getMetrics=t.getFontBasicMetrics=void 0;var r=a(6);const n=(0,r.getLookupTableFactory)((function(e){e.Courier=600;e["Courier-Bold"]=600;e["Courier-BoldOblique"]=600;e["Courier-Oblique"]=600;e.Helvetica=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Bold"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-BoldOblique"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Oblique"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e.Symbol=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.universal=713;e.numbersign=500;e.existential=549;e.percent=833;e.ampersand=778;e.suchthat=439;e.parenleft=333;e.parenright=333;e.asteriskmath=500;e.plus=549;e.comma=250;e.minus=549;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=549;e.equal=549;e.greater=549;e.question=444;e.congruent=549;e.Alpha=722;e.Beta=667;e.Chi=722;e.Delta=612;e.Epsilon=611;e.Phi=763;e.Gamma=603;e.Eta=722;e.Iota=333;e.theta1=631;e.Kappa=722;e.Lambda=686;e.Mu=889;e.Nu=722;e.Omicron=722;e.Pi=768;e.Theta=741;e.Rho=556;e.Sigma=592;e.Tau=611;e.Upsilon=690;e.sigma1=439;e.Omega=768;e.Xi=645;e.Psi=795;e.Zeta=611;e.bracketleft=333;e.therefore=863;e.bracketright=333;e.perpendicular=658;e.underscore=500;e.radicalex=500;e.alpha=631;e.beta=549;e.chi=549;e.delta=494;e.epsilon=439;e.phi=521;e.gamma=411;e.eta=603;e.iota=329;e.phi1=603;e.kappa=549;e.lambda=549;e.mu=576;e.nu=521;e.omicron=549;e.pi=549;e.theta=521;e.rho=549;e.sigma=603;e.tau=439;e.upsilon=576;e.omega1=713;e.omega=686;e.xi=493;e.psi=686;e.zeta=494;e.braceleft=480;e.bar=200;e.braceright=480;e.similar=549;e.Euro=750;e.Upsilon1=620;e.minute=247;e.lessequal=549;e.fraction=167;e.infinity=713;e.florin=500;e.club=753;e.diamond=753;e.heart=753;e.spade=753;e.arrowboth=1042;e.arrowleft=987;e.arrowup=603;e.arrowright=987;e.arrowdown=603;e.degree=400;e.plusminus=549;e.second=411;e.greaterequal=549;e.multiply=549;e.proportional=713;e.partialdiff=494;e.bullet=460;e.divide=549;e.notequal=549;e.equivalence=549;e.approxequal=549;e.ellipsis=1e3;e.arrowvertex=603;e.arrowhorizex=1e3;e.carriagereturn=658;e.aleph=823;e.Ifraktur=686;e.Rfraktur=795;e.weierstrass=987;e.circlemultiply=768;e.circleplus=768;e.emptyset=823;e.intersection=768;e.union=768;e.propersuperset=713;e.reflexsuperset=713;e.notsubset=713;e.propersubset=713;e.reflexsubset=713;e.element=713;e.notelement=713;e.angle=768;e.gradient=713;e.registerserif=790;e.copyrightserif=790;e.trademarkserif=890;e.product=823;e.radical=549;e.dotmath=250;e.logicalnot=713;e.logicaland=603;e.logicalor=603;e.arrowdblboth=1042;e.arrowdblleft=987;e.arrowdblup=603;e.arrowdblright=987;e.arrowdbldown=603;e.lozenge=494;e.angleleft=329;e.registersans=790;e.copyrightsans=790;e.trademarksans=786;e.summation=713;e.parenlefttp=384;e.parenleftex=384;e.parenleftbt=384;e.bracketlefttp=384;e.bracketleftex=384;e.bracketleftbt=384;e.bracelefttp=494;e.braceleftmid=494;e.braceleftbt=494;e.braceex=494;e.angleright=329;e.integral=274;e.integraltp=686;e.integralex=686;e.integralbt=686;e.parenrighttp=384;e.parenrightex=384;e.parenrightbt=384;e.bracketrighttp=384;e.bracketrightex=384;e.bracketrightbt=384;e.bracerighttp=494;e.bracerightmid=494;e.bracerightbt=494;e.apple=790}));e["Times-Roman"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=408;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=564;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=564;e.equal=564;e.greater=564;e.question=444;e.at=921;e.A=722;e.B=667;e.C=667;e.D=722;e.E=611;e.F=556;e.G=722;e.H=722;e.I=333;e.J=389;e.K=722;e.L=611;e.M=889;e.N=722;e.O=722;e.P=556;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=722;e.W=944;e.X=722;e.Y=722;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=469;e.underscore=500;e.quoteleft=333;e.a=444;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=500;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=500;e.o=500;e.p=500;e.q=500;e.r=333;e.s=389;e.t=278;e.u=500;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=480;e.bar=200;e.braceright=480;e.asciitilde=541;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=180;e.quotedblleft=444;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=453;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=444;e.quotedblright=444;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=444;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=889;e.ordfeminine=276;e.Lslash=611;e.Oslash=722;e.OE=889;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=444;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=722;e.divide=564;e.Yacute=722;e.Acircumflex=722;e.aacute=444;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=444;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=444;e.Ncommaaccent=722;e.lacute=278;e.agrave=444;e.Tcommaaccent=611;e.Cacute=667;e.atilde=444;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=444;e.Amacron=722;e.rcaron=333;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=556;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=588;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=722;e.Abreve=722;e.multiply=564;e.uacute=500;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=444;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=722;e.Iacute=333;e.plusminus=564;e.brokenbar=200;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=333;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=326;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=444;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=344;e.Kcommaaccent=722;e.Lacute=611;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=722;e.zdotaccent=444;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=500;e.minus=564;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=564;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Bold"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=1e3;e.ampersand=833;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=930;e.A=722;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=778;e.I=389;e.J=500;e.K=778;e.L=667;e.M=944;e.N=722;e.O=778;e.P=611;e.Q=778;e.R=722;e.S=556;e.T=667;e.U=722;e.V=722;e.W=1e3;e.X=722;e.Y=722;e.Z=667;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=581;e.underscore=500;e.quoteleft=333;e.a=500;e.b=556;e.c=444;e.d=556;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=333;e.k=556;e.l=278;e.m=833;e.n=556;e.o=500;e.p=556;e.q=556;e.r=444;e.s=389;e.t=333;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=394;e.bar=220;e.braceright=394;e.asciitilde=520;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=540;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=300;e.Lslash=667;e.Oslash=778;e.OE=1e3;e.ordmasculine=330;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=556;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=722;e.divide=570;e.Yacute=722;e.Acircumflex=722;e.aacute=500;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=667;e.Cacute=722;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=500;e.Amacron=722;e.rcaron=444;e.ccedilla=444;e.Zdotaccent=667;e.Thorn=611;e.Omacron=778;e.Racute=722;e.Sacute=556;e.dcaron=672;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=570;e.uacute=556;e.Tcaron=667;e.partialdiff=494;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=778;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=444;e.omacron=500;e.Zacute=667;e.Zcaron=667;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=416;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=778;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=300;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=556;e.threequarters=750;e.Scedilla=556;e.lcaron=394;e.Kcommaaccent=778;e.Lacute=667;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=667;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=778;e.degree=400;e.ograve=500;e.Ccaron=722;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=444;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=722;e.Lcommaaccent=667;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=444;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=556;e.minus=570;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=333;e.logicalnot=570;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-BoldItalic"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=389;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=832;e.A=667;e.B=667;e.C=667;e.D=722;e.E=667;e.F=667;e.G=722;e.H=778;e.I=389;e.J=500;e.K=667;e.L=611;e.M=889;e.N=722;e.O=722;e.P=611;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=667;e.W=889;e.X=667;e.Y=611;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=570;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=556;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=556;e.v=444;e.w=667;e.x=500;e.y=444;e.z=389;e.braceleft=348;e.bar=220;e.braceright=348;e.asciitilde=570;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=500;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=944;e.ordfeminine=266;e.Lslash=611;e.Oslash=722;e.OE=944;e.ordmasculine=300;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=611;e.divide=570;e.Yacute=611;e.Acircumflex=667;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=611;e.Cacute=667;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=556;e.acircumflex=500;e.Amacron=667;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=611;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=608;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=722;e.Agrave=667;e.Abreve=667;e.multiply=570;e.uacute=556;e.Tcaron=611;e.partialdiff=494;e.ydieresis=444;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=722;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=366;e.eogonek=444;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=576;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=382;e.Kcommaaccent=667;e.Lacute=611;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=722;e.zdotaccent=389;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=500;e.minus=606;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=606;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Italic"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=420;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=675;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=675;e.equal=675;e.greater=675;e.question=500;e.at=920;e.A=611;e.B=611;e.C=667;e.D=722;e.E=611;e.F=611;e.G=722;e.H=722;e.I=333;e.J=444;e.K=667;e.L=556;e.M=833;e.N=667;e.O=722;e.P=611;e.Q=722;e.R=611;e.S=500;e.T=556;e.U=722;e.V=611;e.W=833;e.X=611;e.Y=556;e.Z=556;e.bracketleft=389;e.backslash=278;e.bracketright=389;e.asciicircum=422;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=278;e.g=500;e.h=500;e.i=278;e.j=278;e.k=444;e.l=278;e.m=722;e.n=500;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=500;e.v=444;e.w=667;e.x=444;e.y=444;e.z=389;e.braceleft=400;e.bar=275;e.braceright=400;e.asciitilde=541;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=214;e.quotedblleft=556;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=523;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=556;e.quotedblright=556;e.guillemotright=500;e.ellipsis=889;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=889;e.AE=889;e.ordfeminine=276;e.Lslash=556;e.Oslash=722;e.OE=944;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=667;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=500;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=556;e.divide=675;e.Yacute=556;e.Acircumflex=611;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=500;e.Ncommaaccent=667;e.lacute=278;e.agrave=500;e.Tcommaaccent=556;e.Cacute=667;e.atilde=500;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=611;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=500;e.Amacron=611;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=556;e.Thorn=611;e.Omacron=722;e.Racute=611;e.Sacute=500;e.dcaron=544;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=611;e.Abreve=611;e.multiply=675;e.uacute=500;e.Tcaron=556;e.partialdiff=476;e.ydieresis=444;e.Nacute=667;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=667;e.Iacute=333;e.plusminus=675;e.brokenbar=275;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=389;e.omacron=500;e.Zacute=556;e.Zcaron=556;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=300;e.eogonek=444;e.Uogonek=722;e.Aacute=611;e.Adieresis=611;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=500;e.lcaron=300;e.Kcommaaccent=667;e.Lacute=556;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=500;e.Scommaaccent=500;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=667;e.otilde=500;e.Rcommaaccent=611;e.Lcommaaccent=556;e.Atilde=611;e.Aogonek=611;e.Aring=611;e.Otilde=722;e.zdotaccent=389;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=444;e.minus=675;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=675;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e.ZapfDingbats=(0,r.getLookupTableFactory)((function(e){e.space=278;e.a1=974;e.a2=961;e.a202=974;e.a3=980;e.a4=719;e.a5=789;e.a119=790;e.a118=791;e.a117=690;e.a11=960;e.a12=939;e.a13=549;e.a14=855;e.a15=911;e.a16=933;e.a105=911;e.a17=945;e.a18=974;e.a19=755;e.a20=846;e.a21=762;e.a22=761;e.a23=571;e.a24=677;e.a25=763;e.a26=760;e.a27=759;e.a28=754;e.a6=494;e.a7=552;e.a8=537;e.a9=577;e.a10=692;e.a29=786;e.a30=788;e.a31=788;e.a32=790;e.a33=793;e.a34=794;e.a35=816;e.a36=823;e.a37=789;e.a38=841;e.a39=823;e.a40=833;e.a41=816;e.a42=831;e.a43=923;e.a44=744;e.a45=723;e.a46=749;e.a47=790;e.a48=792;e.a49=695;e.a50=776;e.a51=768;e.a52=792;e.a53=759;e.a54=707;e.a55=708;e.a56=682;e.a57=701;e.a58=826;e.a59=815;e.a60=789;e.a61=789;e.a62=707;e.a63=687;e.a64=696;e.a65=689;e.a66=786;e.a67=787;e.a68=713;e.a69=791;e.a70=785;e.a71=791;e.a72=873;e.a73=761;e.a74=762;e.a203=762;e.a75=759;e.a204=759;e.a76=892;e.a77=892;e.a78=788;e.a79=784;e.a81=438;e.a82=138;e.a83=277;e.a84=415;e.a97=392;e.a98=392;e.a99=668;e.a100=668;e.a89=390;e.a90=390;e.a93=317;e.a94=317;e.a91=276;e.a92=276;e.a205=509;e.a85=509;e.a206=410;e.a86=410;e.a87=234;e.a88=234;e.a95=334;e.a96=334;e.a101=732;e.a102=544;e.a103=544;e.a104=910;e.a106=667;e.a107=760;e.a108=760;e.a112=776;e.a111=595;e.a110=694;e.a109=626;e.a120=788;e.a121=788;e.a122=788;e.a123=788;e.a124=788;e.a125=788;e.a126=788;e.a127=788;e.a128=788;e.a129=788;e.a130=788;e.a131=788;e.a132=788;e.a133=788;e.a134=788;e.a135=788;e.a136=788;e.a137=788;e.a138=788;e.a139=788;e.a140=788;e.a141=788;e.a142=788;e.a143=788;e.a144=788;e.a145=788;e.a146=788;e.a147=788;e.a148=788;e.a149=788;e.a150=788;e.a151=788;e.a152=788;e.a153=788;e.a154=788;e.a155=788;e.a156=788;e.a157=788;e.a158=788;e.a159=788;e.a160=894;e.a161=838;e.a163=1016;e.a164=458;e.a196=748;e.a165=924;e.a192=748;e.a166=918;e.a167=927;e.a168=928;e.a169=928;e.a170=834;e.a171=873;e.a172=828;e.a173=924;e.a162=924;e.a174=917;e.a175=930;e.a176=931;e.a177=463;e.a178=883;e.a179=836;e.a193=836;e.a180=867;e.a199=867;e.a181=696;e.a200=696;e.a182=874;e.a201=874;e.a183=760;e.a184=946;e.a197=771;e.a185=865;e.a194=771;e.a198=888;e.a186=967;e.a195=888;e.a187=831;e.a188=873;e.a189=927;e.a190=970;e.a191=918}))}));t.getMetrics=n;const i=(0,r.getLookupTableFactory)((function(e){e.Courier={ascent:629,descent:-157,capHeight:562,xHeight:-426};e["Courier-Bold"]={ascent:629,descent:-157,capHeight:562,xHeight:439};e["Courier-Oblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e["Courier-BoldOblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e.Helvetica={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-Bold"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Helvetica-Oblique"]={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-BoldOblique"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Times-Roman"]={ascent:683,descent:-217,capHeight:662,xHeight:450};e["Times-Bold"]={ascent:683,descent:-217,capHeight:676,xHeight:461};e["Times-Italic"]={ascent:683,descent:-217,capHeight:653,xHeight:441};e["Times-BoldItalic"]={ascent:683,descent:-217,capHeight:669,xHeight:462};e.Symbol={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN};e.ZapfDingbats={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN}}));t.getFontBasicMetrics=i},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.GlyfTable=void 0;t.GlyfTable=class GlyfTable{constructor({glyfTable:e,isGlyphLocationsLong:t,locaTable:a,numGlyphs:r}){this.glyphs=[];const n=new DataView(a.buffer,a.byteOffset,a.byteLength),i=new DataView(e.buffer,e.byteOffset,e.byteLength),s=t?4:2;let o=t?n.getUint32(0):2*n.getUint16(0),c=0;for(let e=0;ee+(t.getSize()+3&-4)),0)}write(){const e=this.getSize(),t=new DataView(new ArrayBuffer(e)),a=e>131070,r=a?4:2,n=new DataView(new ArrayBuffer((this.glyphs.length+1)*r));a?n.setUint32(0,0):n.setUint16(0,0);let i=0,s=0;for(const e of this.glyphs){i+=e.write(i,t);i=i+3&-4;s+=r;a?n.setUint32(s,i):n.setUint16(s,i>>1)}return{isLocationLong:a,loca:new Uint8Array(n.buffer),glyf:new Uint8Array(t.buffer)}}scale(e){for(let t=0,a=this.glyphs.length;te+t.getSize()),0);return this.header.getSize()+e}write(e,t){if(!this.header)return 0;const a=e;e+=this.header.write(e,t);if(this.simple)e+=this.simple.write(e,t);else for(const a of this.composites)e+=a.write(e,t);return e-a}scale(e){if(!this.header)return;const t=(this.header.xMin+this.header.xMax)/2;this.header.scale(t,e);if(this.simple)this.simple.scale(t,e);else for(const a of this.composites)a.scale(t,e)}}class GlyphHeader{constructor({numberOfContours:e,xMin:t,yMin:a,xMax:r,yMax:n}){this.numberOfContours=e;this.xMin=t;this.yMin=a;this.xMax=r;this.yMax=n}static parse(e,t){return[10,new GlyphHeader({numberOfContours:t.getInt16(e),xMin:t.getInt16(e+2),yMin:t.getInt16(e+4),xMax:t.getInt16(e+6),yMax:t.getInt16(e+8)})]}getSize(){return 10}write(e,t){t.setInt16(e,this.numberOfContours);t.setInt16(e+2,this.xMin);t.setInt16(e+4,this.yMin);t.setInt16(e+6,this.xMax);t.setInt16(e+8,this.yMax);return 10}scale(e,t){this.xMin=Math.round(e+(this.xMin-e)*t);this.xMax=Math.round(e+(this.xMax-e)*t)}}class Contour{constructor({flags:e,xCoordinates:t,yCoordinates:a}){this.xCoordinates=t;this.yCoordinates=a;this.flags=e}}class SimpleGlyph{constructor({contours:e,instructions:t}){this.contours=e;this.instructions=t}static parse(e,t,a){const r=[];for(let n=0;n255?e+=2:o>0&&(e+=1);t=i;o=Math.abs(s-a);o>255?e+=2:o>0&&(e+=1);a=s}}return e}write(e,t){const a=e,r=[],n=[],i=[];let s=0,o=0;for(const a of this.contours){for(let e=0,t=a.xCoordinates.length;e=0?18:2;r.push(e)}else r.push(l)}s=c;const h=a.yCoordinates[e];l=h-o;if(0===l){t|=32;n.push(0)}else{const e=Math.abs(l);if(e<=255){t|=l>=0?36:4;n.push(e)}else n.push(l)}o=h;i.push(t)}t.setUint16(e,r.length-1);e+=2}t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}for(const a of i)t.setUint8(e++,a);for(let a=0,n=r.length;a=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(e+=2):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(e+=2);return e}write(e,t){const a=e;2&this.flags?this.argument1>=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(this.flags|=1):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(this.flags|=1);t.setUint16(e,this.flags);t.setUint16(e+2,this.glyphIndex);e+=4;if(1&this.flags){if(2&this.flags){t.setInt16(e,this.argument1);t.setInt16(e+2,this.argument2)}else{t.setUint16(e,this.argument1);t.setUint16(e+2,this.argument2)}e+=4}else{t.setUint8(e,this.argument1);t.setUint8(e+1,this.argument2);e+=2}if(256&this.flags){t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}}return e-a}scale(e,t){}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.OpenTypeFileBuilder=void 0;var r=a(6),n=a(2);function writeInt16(e,t,a){e[t]=a>>8&255;e[t+1]=255&a}function writeInt32(e,t,a){e[t]=a>>24&255;e[t+1]=a>>16&255;e[t+2]=a>>8&255;e[t+3]=255&a}function writeData(e,t,a){if(a instanceof Uint8Array)e.set(a,t);else if("string"==typeof a)for(let r=0,n=a.length;ra;){a<<=1;r++}const n=a*t;return{range:n,entry:r,rangeShift:t*e-n}}toArray(){let e=this.sfnt;const t=this.tables,a=Object.keys(t);a.sort();const i=a.length;let s,o,c,l,h,u=12+16*i;const d=[u];for(s=0;s>>0;d.push(u)}const f=new Uint8Array(u);for(s=0;s>>0}writeInt32(f,u+4,e);writeInt32(f,u+8,d[s]);writeInt32(f,u+12,t[h].length);u+=16}return f}addTable(e,t){if(e in this.tables)throw new Error("Table "+e+" already exists");this.tables[e]=t}}t.OpenTypeFileBuilder=OpenTypeFileBuilder},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Type1Font=void 0;var r=a(35),n=a(38),i=a(6),s=a(10),o=a(49),c=a(2);function findBlock(e,t,a){const r=e.length,n=t.length,s=r-n;let o=a,c=!1;for(;o=n){o+=a;for(;o=0&&(r[e]=i)}}return(0,n.type1FontGlyphMapping)(e,r,a)}hasGlyphId(e){if(e<0||e>=this.numGlyphs)return!1;if(0===e)return!0;return this.charstrings[e-1].charstring.length>0}getSeacs(e){const t=[];for(let a=0,r=e.length;a0;e--)t[e]-=t[e-1];g.setByName(e,t)}s.topDict.privateDict=g;const m=new r.CFFIndex;for(u=0,d=n.length;u{Object.defineProperty(t,"__esModule",{value:!0});t.Type1Parser=void 0;var r=a(37),n=a(6),i=a(10),s=a(2);const o=[4],c=[5],l=[6],h=[7],u=[8],d=[12,35],f=[14],g=[21],p=[22],m=[30],b=[31];class Type1CharString{constructor(){this.width=0;this.lsb=0;this.flexing=!1;this.output=[];this.stack=[]}convert(e,t,a){const r=e.length;let n,i,y,w=!1;for(let S=0;Sr)return!0;const n=r-e;for(let e=n;e>8&255,255&t);else{t=65536*t|0;this.output.push(255,t>>24&255,t>>16&255,t>>8&255,255&t)}}this.output.push(...t);a?this.stack.splice(n,e):this.stack.length=0;return!1}}function isHexDigit(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function decrypt(e,t,a){if(a>=e.length)return new Uint8Array(0);let r,n,i=0|t;for(r=0;r>8;i=52845*(t+i)+22719&65535}return o}function isSpecial(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}t.Type1Parser=class Type1Parser{constructor(e,t,a){if(t){const t=e.getBytes(),a=!((isHexDigit(t[0])||(0,n.isWhiteSpace)(t[0]))&&isHexDigit(t[1])&&isHexDigit(t[2])&&isHexDigit(t[3])&&isHexDigit(t[4])&&isHexDigit(t[5])&&isHexDigit(t[6])&&isHexDigit(t[7]));e=new i.Stream(a?decrypt(t,55665,4):function decryptAscii(e,t,a){let r=0|t;const n=e.length,i=new Uint8Array(n>>>1);let s,o;for(s=0,o=0;s>8;r=52845*(e+r)+22719&65535}}return i.slice(a,o)}(t,55665,4))}this.seacAnalysisEnabled=!!a;this.stream=e;this.nextChar()}readNumberArray(){this.getToken();const e=[];for(;;){const t=this.getToken();if(null===t||"]"===t||"}"===t)break;e.push(parseFloat(t||0))}return e}readNumber(){const e=this.getToken();return parseFloat(e||0)}readInt(){const e=this.getToken();return 0|parseInt(e||0,10)}readBoolean(){return"true"===this.getToken()?1:0}nextChar(){return this.currentChar=this.stream.getByte()}prevChar(){this.stream.skip(-2);return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(-1===t)return null;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,n.isWhiteSpace)(t))break;t=this.nextChar()}if(isSpecial(t)){this.nextChar();return String.fromCharCode(t)}let a="";do{a+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!(0,n.isWhiteSpace)(t)&&!isSpecial(t));return a}readCharStrings(e,t){return-1===t?e:decrypt(e,4330,t)}extractFontProgram(e){const t=this.stream,a=[],r=[],n=Object.create(null);n.lenIV=4;const i={subrs:[],charstrings:[],properties:{privateData:n}};let s,o,c,l;for(;null!==(s=this.getToken());)if("/"===s){s=this.getToken();switch(s){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;;){s=this.getToken();if(null===s||"end"===s)break;if("/"!==s)continue;const e=this.getToken();o=this.readInt();this.getToken();c=o>0?t.getBytes(o):new Uint8Array(0);l=i.properties.privateData.lenIV;const a=this.readCharStrings(c,l);this.nextChar();s=this.getToken();"noaccess"===s?this.getToken():"/"===s&&this.prevChar();r.push({glyph:e,encoded:a})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){const e=this.readInt();o=this.readInt();this.getToken();c=o>0?t.getBytes(o):new Uint8Array(0);l=i.properties.privateData.lenIV;const r=this.readCharStrings(c,l);this.nextChar();s=this.getToken();"noaccess"===s&&this.getToken();a[e]=r}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":const e=this.readNumberArray();e.length>0&&e.length,0;break;case"StemSnapH":case"StemSnapV":i.properties.privateData[s]=this.readNumberArray();break;case"StdHW":case"StdVW":i.properties.privateData[s]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":case"ExpansionFactor":i.properties.privateData[s]=this.readNumber();break;case"ForceBold":i.properties.privateData[s]=this.readBoolean()}}for(const{encoded:t,glyph:n}of r){const r=new Type1CharString,s=r.convert(t,a,this.seacAnalysisEnabled);let o=r.output;s&&(o=[14]);const c={glyphName:n,charstring:o,width:r.width,lsb:r.lsb,seac:r.seac};".notdef"===n?i.charstrings.unshift(c):i.charstrings.push(c);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(n);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=r.width)}}return i}extractFontHeader(e){let t;for(;null!==(t=this.getToken());)if("/"===t){t=this.getToken();switch(t){case"FontMatrix":const a=this.readNumberArray();e.fontMatrix=a;break;case"Encoding":const n=this.getToken();let i;if(/^\d+$/.test(n)){i=[];const e=0|parseInt(n,10);this.getToken();for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.Pattern=void 0;t.getTilingPatternIR=function getTilingPatternIR(e,t,a){const n=t.getArray("Matrix"),i=r.Util.normalizeRect(t.getArray("BBox")),s=t.get("XStep"),o=t.get("YStep"),c=t.get("PaintType"),l=t.get("TilingType");if(i[2]-i[0]==0||i[3]-i[1]==0)throw new r.FormatError(`Invalid getTilingPatternIR /BBox array: [${i}].`);return["TilingPattern",a,e,n,i,s,o,c,l]};var r=a(2),n=a(7),i=a(14),s=a(6);const o=2,c=3,l=4,h=5,u=6,d=7;t.Pattern=class Pattern{constructor(){(0,r.unreachable)("Cannot initialize Pattern.")}static parseShading(e,t,a,i,f,g){const p=e instanceof n.BaseStream?e.dict:e,m=p.get("ShadingType");try{switch(m){case o:case c:return new RadialAxialShading(p,t,a,f,g);case l:case h:case u:case d:return new MeshShading(e,t,a,f,g);default:throw new r.FormatError("Unsupported ShadingType: "+m)}}catch(e){if(e instanceof s.MissingDataException)throw e;i.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.shadingPattern});(0,r.warn)(e);return new DummyShading}}};class BaseShading{static get SMALL_NUMBER(){return(0,r.shadow)(this,"SMALL_NUMBER",1e-6)}constructor(){this.constructor===BaseShading&&(0,r.unreachable)("Cannot initialize BaseShading.")}getIR(){(0,r.unreachable)("Abstract method `getIR` called.")}}class RadialAxialShading extends BaseShading{constructor(e,t,a,n,s){super();this.coordsArr=e.getArray("Coords");this.shadingType=e.get("ShadingType");const o=i.ColorSpace.parse({cs:e.getRaw("CS")||e.getRaw("ColorSpace"),xref:t,resources:a,pdfFunctionFactory:n,localColorSpaceCache:s}),l=e.getArray("BBox");Array.isArray(l)&&4===l.length?this.bbox=r.Util.normalizeRect(l):this.bbox=null;let h=0,u=1;if(e.has("Domain")){const t=e.getArray("Domain");h=t[0];u=t[1]}let d=!1,f=!1;if(e.has("Extend")){const t=e.getArray("Extend");d=t[0];f=t[1]}if(!(this.shadingType!==c||d&&f)){const[e,t,a,n,i,s]=this.coordsArr,o=Math.hypot(e-n,t-i);a<=s+o&&s<=a+o&&(0,r.warn)("Unsupported radial gradient.")}this.extendStart=d;this.extendEnd=f;const g=e.getRaw("Function"),p=n.createFromArray(g),m=(u-h)/10,b=this.colorStops=[];if(h>=u||m<=0){(0,r.info)("Bad shading domain.");return}const y=new Float32Array(o.numComps),w=new Float32Array(1);let S;for(let e=0;e<=10;e++){w[0]=h+e*m;p(w,0,y,0);S=o.getRgb(y,0);const t=r.Util.makeHexColor(S[0],S[1],S[2]);b.push([e/10,t])}let x="transparent";if(e.has("Background")){S=o.getRgb(e.get("Background"),0);x=r.Util.makeHexColor(S[0],S[1],S[2])}if(!d){b.unshift([0,x]);b[1][0]+=BaseShading.SMALL_NUMBER}if(!f){b.at(-1)[0]-=BaseShading.SMALL_NUMBER;b.push([1,x])}this.colorStops=b}getIR(){const e=this.coordsArr,t=this.shadingType;let a,n,i,s,l;if(t===o){n=[e[0],e[1]];i=[e[2],e[3]];s=null;l=null;a="axial"}else if(t===c){n=[e[0],e[1]];i=[e[3],e[4]];s=e[2];l=e[5];a="radial"}else(0,r.unreachable)(`getPattern type unknown: ${t}`);return["RadialAxial",a,this.bbox,this.colorStops,n,i,s,l]}}class MeshStreamReader{constructor(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;const a=t.numComps;this.tmpCompsBuf=new Float32Array(a);const r=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(r):this.tmpCompsBuf}get hasData(){if(this.stream.end)return this.stream.pos0)return!0;const e=this.stream.getByte();if(e<0)return!1;this.buffer=e;this.bufferLength=8;return!0}readBits(e){let t=this.buffer,a=this.bufferLength;if(32===e){if(0===a)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;t=t<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();const e=this.stream.getByte();this.buffer=e&(1<>a)>>>0}if(8===e&&0===a)return this.stream.getByte();for(;a>a}align(){this.buffer=0;this.bufferLength=0}readFlag(){return this.readBits(this.context.bitsPerFlag)}readCoordinate(){const e=this.context.bitsPerCoordinate,t=this.readBits(e),a=this.readBits(e),r=this.context.decode,n=e<32?1/((1<i?i:e;t=t>s?s:t;a=a{Object.defineProperty(t,"__esModule",{value:!0});t.getXfaFontDict=function getXfaFontDict(e){const t=function getXfaFontWidths(e){const t=getXfaFontName(e);if(!t)return null;const{baseWidths:a,baseMapping:r,factors:n}=t;let i;i=n?a.map(((e,t)=>e*n[t])):a;let s,o=-2;const c=[];for(const[e,t]of r.map(((e,t)=>[e,t])).sort((([e],[t])=>e-t)))if(-1!==e)if(e===o+1){s.push(i[t]);o+=1}else{o=e;s=[i[t]];c.push(e,s)}return c}(e),a=new n.Dict(null);a.set("BaseFont",n.Name.get(e));a.set("Type",n.Name.get("Font"));a.set("Subtype",n.Name.get("CIDFontType2"));a.set("Encoding",n.Name.get("Identity-H"));a.set("CIDToGIDMap",n.Name.get("Identity"));a.set("W",t);a.set("FirstChar",t[0]);a.set("LastChar",t.at(-2)+t.at(-1).length-1);const r=new n.Dict(null);a.set("FontDescriptor",r);const i=new n.Dict(null);i.set("Ordering","Identity");i.set("Registry","Adobe");i.set("Supplement",0);a.set("CIDSystemInfo",i);return a};t.getXfaFontName=getXfaFontName;var r=a(52),n=a(5),i=a(53),s=a(54),o=a(55),c=a(56),l=a(6),h=a(38);const u=(0,l.getLookupTableFactory)((function(e){e["MyriadPro-Regular"]=e["PdfJS-Fallback-Regular"]={name:"LiberationSans-Regular",factors:o.MyriadProRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:o.MyriadProRegularMetrics};e["MyriadPro-Bold"]=e["PdfJS-Fallback-Bold"]={name:"LiberationSans-Bold",factors:o.MyriadProBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:o.MyriadProBoldMetrics};e["MyriadPro-It"]=e["MyriadPro-Italic"]=e["PdfJS-Fallback-Italic"]={name:"LiberationSans-Italic",factors:o.MyriadProItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:o.MyriadProItalicMetrics};e["MyriadPro-BoldIt"]=e["MyriadPro-BoldItalic"]=e["PdfJS-Fallback-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:o.MyriadProBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:o.MyriadProBoldItalicMetrics};e.ArialMT=e.Arial=e["Arial-Regular"]={name:"LiberationSans-Regular",baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping};e["Arial-BoldMT"]=e["Arial-Bold"]={name:"LiberationSans-Bold",baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping};e["Arial-ItalicMT"]=e["Arial-Italic"]={name:"LiberationSans-Italic",baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping};e["Arial-BoldItalicMT"]=e["Arial-BoldItalic"]={name:"LiberationSans-BoldItalic",baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping};e["Calibri-Regular"]={name:"LiberationSans-Regular",factors:r.CalibriRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:r.CalibriRegularMetrics};e["Calibri-Bold"]={name:"LiberationSans-Bold",factors:r.CalibriBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:r.CalibriBoldMetrics};e["Calibri-Italic"]={name:"LiberationSans-Italic",factors:r.CalibriItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:r.CalibriItalicMetrics};e["Calibri-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:r.CalibriBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:r.CalibriBoldItalicMetrics};e["Segoeui-Regular"]={name:"LiberationSans-Regular",factors:c.SegoeuiRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:c.SegoeuiRegularMetrics};e["Segoeui-Bold"]={name:"LiberationSans-Bold",factors:c.SegoeuiBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:c.SegoeuiBoldMetrics};e["Segoeui-Italic"]={name:"LiberationSans-Italic",factors:c.SegoeuiItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:c.SegoeuiItalicMetrics};e["Segoeui-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:c.SegoeuiBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:c.SegoeuiBoldItalicMetrics};e["Helvetica-Regular"]=e.Helvetica={name:"LiberationSans-Regular",factors:i.HelveticaRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:i.HelveticaRegularMetrics};e["Helvetica-Bold"]={name:"LiberationSans-Bold",factors:i.HelveticaBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:i.HelveticaBoldMetrics};e["Helvetica-Italic"]={name:"LiberationSans-Italic",factors:i.HelveticaItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:i.HelveticaItalicMetrics};e["Helvetica-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:i.HelveticaBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:i.HelveticaBoldItalicMetrics}}));function getXfaFontName(e){const t=(0,h.normalizeFontName)(e);return u()[t]}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CalibriRegularMetrics=t.CalibriRegularFactors=t.CalibriItalicMetrics=t.CalibriItalicFactors=t.CalibriBoldMetrics=t.CalibriBoldItalicMetrics=t.CalibriBoldItalicFactors=t.CalibriBoldFactors=void 0;t.CalibriBoldFactors=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.54657,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.73293,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.9121,.86943,.79795,.88198,.77958,.70864,.81055,.90399,.88653,.96017,.82577,.77892,.78257,.97507,1.54657,.97507,.85284,.89552,.90176,.88762,.8785,.75241,.8785,.90518,.95015,.77618,.8785,.88401,.91916,.86304,.88401,.91488,.8785,.8801,.8785,.8785,.91343,.7173,1.04106,.8785,.85075,.95794,.82616,.85162,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.12401,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.73293,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.9121,.86943,.86943,.86943,.86943,.86943,.85284,.87508,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.88762,.88762,.88762,.88762,.88762,.88762,.8715,.75241,.90518,.90518,.90518,.90518,.88401,.88401,.88401,.88401,.8785,.8785,.8801,.8801,.8801,.8801,.8801,.90747,.89049,.8785,.8785,.8785,.8785,.85162,.8785,.85162,.83908,.88762,.83908,.88762,.83908,.88762,.73293,.75241,.73293,.75241,.73293,.75241,.73293,.75241,.87289,.83016,.88506,.93125,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.81921,.77618,.81921,.77618,.81921,.77618,1,1,.87356,.8785,.91075,.89608,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76229,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.79468,.91926,.88175,.70823,.94903,.9121,.8785,1,1,.9121,.8785,.87802,.88656,.8785,.86943,.8801,.86943,.8801,.86943,.8801,.87402,.89291,.77958,.91343,1,1,.77958,.91343,.70864,.7173,.70864,.7173,.70864,.7173,.70864,.7173,1,1,.81055,.75841,.81055,1.06452,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.96017,.95794,.77892,.85162,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.88762,.77539,.8715,.87508,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70674,.98387,.94721,1.33431,1.45894,.95161,1.06303,.83908,.80352,.57184,.6965,.56289,.82001,.56029,.81235,1.02988,.83908,.7762,.68156,.80367,.73133,.78257,.87356,.86943,.95958,.75727,.89019,1.04924,.9121,.7648,.86943,.87356,.79795,.78275,.81055,.77892,.9762,.82577,.99819,.84896,.95958,.77892,.96108,1.01407,.89049,1.02988,.94211,.96108,.8936,.84021,.87842,.96399,.79109,.89049,1.00813,1.02988,.86077,.87445,.92099,.84723,.86513,.8801,.75638,.85714,.78216,.79586,.87965,.94211,.97747,.78287,.97926,.84971,1.02988,.94211,.8801,.94211,.84971,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90264,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.90518,1,1,1,1,1,1,1,1,1,1,1,1,.90548,1,1,1,1,1,1,.96017,.95794,.96017,.95794,.96017,.95794,.77892,.85162,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.92794,.87012,.87012,.87012,.89552,.89552,1.42259,.71143,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.93835,.83406,.91133,.84107,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90527,1.81055,.90527,1.81055,1.31006,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriBoldMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriBoldItalicFactors=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.56239,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.71805,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.90872,.85938,.79795,.87068,.77958,.69766,.81055,.90399,.88653,.96068,.82577,.77892,.78257,.97507,1.529,.97507,.85284,.89552,.90176,.94908,.86411,.74012,.86411,.88323,.95015,.86411,.86331,.88401,.91916,.86304,.88401,.9039,.86331,.86331,.86411,.86411,.90464,.70852,1.04106,.86331,.84372,.95794,.82616,.84548,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.19129,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.71805,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.90872,.85938,.85938,.85938,.85938,.85938,.85284,.87068,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.94908,.94908,.94908,.94908,.94908,.94908,.85887,.74012,.88323,.88323,.88323,.88323,.88401,.88401,.88401,.88401,.8785,.86331,.86331,.86331,.86331,.86331,.86331,.90747,.89049,.86331,.86331,.86331,.86331,.84548,.86411,.84548,.83908,.94908,.83908,.94908,.83908,.94908,.71805,.74012,.71805,.74012,.71805,.74012,.71805,.74012,.87289,.79538,.88506,.92726,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.81921,.86411,.81921,.86411,.81921,.86411,1,1,.87356,.86331,.91075,.8777,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76467,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.77312,.91926,.88175,.70823,.94903,.90872,.86331,1,1,.90872,.86331,.86906,.88116,.86331,.85938,.86331,.85938,.86331,.85938,.86331,.87402,.86549,.77958,.90464,1,1,.77958,.90464,.69766,.70852,.69766,.70852,.69766,.70852,.69766,.70852,1,1,.81055,.75841,.81055,1.06452,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.96068,.95794,.77892,.84548,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.94908,.77539,.85887,.87068,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70088,.98387,.94721,1.33431,1.45894,.95161,1.48387,.83908,.80352,.57118,.6965,.56347,.79179,.55853,.80346,1.02988,.83908,.7762,.67174,.86036,.73133,.78257,.87356,.86441,.95958,.75727,.89019,1.04924,.90872,.74889,.85938,.87891,.79795,.7957,.81055,.77892,.97447,.82577,.97466,.87179,.95958,.77892,.94252,.95612,.8753,1.02988,.92733,.94252,.87411,.84021,.8728,.95612,.74081,.8753,1.02189,1.02988,.84814,.87445,.91822,.84723,.85668,.86331,.81344,.87581,.76422,.82046,.96057,.92733,.99375,.78022,.95452,.86015,1.02988,.92733,.86331,.92733,.86015,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90631,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.88323,1,1,1,1,1,1,1,1,1,1,1,1,.85174,1,1,1,1,1,1,.96068,.95794,.96068,.95794,.96068,.95794,.77892,.84548,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.89807,.87012,.87012,.87012,.89552,.89552,1.42259,.71094,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.92972,.83406,.91133,.83326,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90616,1.81055,.90527,1.81055,1.3107,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriBoldItalicMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriItalicFactors=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39543,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.72346,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89249,.84118,.77452,.85374,.75186,.67789,.79776,.88844,.85066,.94309,.77818,.7306,.76659,1.10369,1.38313,1.10369,1.06139,.89552,.8739,.9245,.9245,.83203,.9245,.85865,1.09842,.9245,.9245,1.03297,1.07692,.90918,1.03297,.94959,.9245,.92274,.9245,.9245,1.02933,.77832,1.20562,.9245,.8916,.98986,.86621,.89453,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.16359,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.72346,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89249,.84118,.84118,.84118,.84118,.84118,.85284,.84557,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.9245,.9245,.9245,.9245,.9245,.9245,.84843,.83203,.85865,.85865,.85865,.85865,.82601,.82601,.82601,.82601,.94469,.9245,.92274,.92274,.92274,.92274,.92274,.90747,.86651,.9245,.9245,.9245,.9245,.89453,.9245,.89453,.8675,.9245,.8675,.9245,.8675,.9245,.72346,.83203,.72346,.83203,.72346,.83203,.72346,.83203,.85193,.8875,.86477,.99034,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.81105,.9245,.81105,.9245,.81105,.9245,1,1,.86275,.9245,.90872,.93591,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77896,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.9375,.98156,.93407,.77261,1.11429,.89249,.9245,1,1,.89249,.9245,.92534,.86698,.9245,.84118,.92274,.84118,.92274,.84118,.92274,.8667,.86291,.75186,1.02933,1,1,.75186,1.02933,.67789,.77832,.67789,.77832,.67789,.77832,.67789,.77832,1,1,.79776,.97655,.79776,1.23023,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.94309,.98986,.7306,.89453,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.9245,.76318,.84843,.84557,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67009,.96334,.93695,1.35191,1.40909,.95161,1.48387,.8675,.90861,.6192,.7363,.64824,.82411,.56321,.85696,1.23516,.8675,.81552,.7286,.84134,.73206,.76659,.86275,.84369,.90685,.77892,.85871,1.02638,.89249,.75828,.84118,.85984,.77452,.76466,.79776,.7306,.90782,.77818,.903,.87291,.90685,.7306,.99058,1.03667,.94635,1.23516,.9849,.99058,.92393,.8916,.942,1.03667,.75026,.94635,1.0297,1.23516,.90918,.94048,.98217,.89746,.84153,.92274,.82507,.88832,.84438,.88178,1.03525,.9849,1.00225,.78086,.97248,.89404,1.23516,.9849,.92274,.9849,.89404,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.89693,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.85865,1,1,1,1,1,1,1,1,1,1,1,1,.90933,1,1,1,1,1,1,.94309,.98986,.94309,.98986,.94309,.98986,.7306,.89453,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.68994,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.97858,.82616,.91133,.83437,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90572,1.81055,.90749,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85284,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriItalicMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriRegularFactors=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39016,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.73834,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89385,.85122,.77452,.86503,.75186,.68887,.79776,.88844,.85066,.94258,.77818,.7306,.76659,1.10369,1.39016,1.10369,1.06139,.89552,.8739,.86128,.94469,.8457,.94469,.89464,1.09842,.84636,.94469,1.03297,1.07692,.90918,1.03297,.95897,.94469,.9482,.94469,.94469,1.04692,.78223,1.20562,.94469,.90332,.98986,.86621,.90527,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.08707,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.73834,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89385,.85122,.85122,.85122,.85122,.85122,.85284,.85311,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.86128,.86128,.86128,.86128,.86128,.86128,.8693,.8457,.89464,.89464,.89464,.89464,.82601,.82601,.82601,.82601,.94469,.94469,.9482,.9482,.9482,.9482,.9482,.90747,.86651,.94469,.94469,.94469,.94469,.90527,.94469,.90527,.8675,.86128,.8675,.86128,.8675,.86128,.73834,.8457,.73834,.8457,.73834,.8457,.73834,.8457,.85193,.92454,.86477,.9921,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.81105,.84636,.81105,.84636,.81105,.84636,1,1,.86275,.94469,.90872,.95786,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77741,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.90452,.98156,1.11842,.77261,1.11429,.89385,.94469,1,1,.89385,.94469,.95877,.86901,.94469,.85122,.9482,.85122,.9482,.85122,.9482,.8667,.90016,.75186,1.04692,1,1,.75186,1.04692,.68887,.78223,.68887,.78223,.68887,.78223,.68887,.78223,1,1,.79776,.92188,.79776,1.23023,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.94258,.98986,.7306,.90527,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.86128,.76318,.8693,.85311,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67742,.96334,.93695,1.35191,1.40909,.95161,1.48387,.86686,.90861,.62267,.74359,.65649,.85498,.56963,.88254,1.23516,.8675,.81552,.75443,.84503,.73206,.76659,.86275,.85122,.90685,.77892,.85746,1.02638,.89385,.75657,.85122,.86275,.77452,.74171,.79776,.7306,.95165,.77818,.89772,.88831,.90685,.7306,.98142,1.02191,.96576,1.23516,.99018,.98142,.9236,.89258,.94035,1.02191,.78848,.96576,.9561,1.23516,.90918,.92578,.95424,.89746,.83969,.9482,.80113,.89442,.85208,.86155,.98022,.99018,1.00452,.81209,.99247,.89181,1.23516,.99018,.9482,.99018,.89181,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.88844,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89464,1,1,1,1,1,1,1,1,1,1,1,1,.96766,1,1,1,1,1,1,.94258,.98986,.94258,.98986,.94258,.98986,.7306,.90527,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.69043,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.99331,.82616,.91133,.84286,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90527,1.81055,.90527,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1.07185,.99413,.96334,1.08065,1,1,1,1,1,1,1,1,1,1,1];t.CalibriRegularMetrics={lineHeight:1.2207,lineGap:.2207}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.HelveticaRegularMetrics=t.HelveticaRegularFactors=t.HelveticaItalicMetrics=t.HelveticaItalicFactors=t.HelveticaBoldMetrics=t.HelveticaBoldItalicMetrics=t.HelveticaBoldItalicFactors=t.HelveticaBoldFactors=void 0;t.HelveticaBoldFactors=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.03374,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.00042,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.03828,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00034,.99977,1,.99997,1.00026,1.00078,1.00036,.99973,1.00013,1.0006,.99977,.99977,.99988,.85148,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,1.00069,1.00022,.99977,1.00001,.99984,1.00026,1.00001,1.00024,1.00001,.9999,1,1.0006,1.00001,1.00041,.99962,1.00026,1.0006,.99995,1.00041,.99942,.99973,.99927,1.00082,.99902,1.00026,1.00087,1.0006,1.00069,.99973,.99867,.99973,.9993,1.00026,1.00049,1.00056,1,.99988,.99935,.99995,.99954,1.00055,.99945,1.00032,1.0006,.99995,1.00026,.99995,1.00032,1.00001,1.00008,.99971,1.00019,.9994,1.00001,1.0006,1.00044,.99973,1.00023,1.00047,1,.99942,.99561,.99989,1.00035,.99977,1.00035,.99977,1.00019,.99944,1.00001,1.00021,.99926,1.00035,1.00035,.99942,1.00048,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.99989,1.00057,1.00001,.99936,1.00052,1.00012,.99996,1.00043,1,1.00035,.9994,.99976,1.00035,.99973,1.00052,1.00041,1.00119,1.00037,.99973,1.00002,.99986,1.00041,1.00041,.99902,.9996,1.00034,.99999,1.00026,.99999,1.00026,.99973,1.00052,.99973,1,.99973,1.00041,1.00075,.9994,1.0003,.99999,1,1.00041,.99955,1,.99915,.99973,.99973,1.00026,1.00119,.99955,.99973,1.0006,.99911,1.0006,1.00026,.99972,1.00026,.99902,1.00041,.99973,.99999,1,1,1.00038,1.0005,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,1.00047,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaBoldMetrics={lineHeight:1.2,lineGap:.2};t.HelveticaBoldItalicFactors=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.0044,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99971,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.01011,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99977,1,1,1.00026,.99969,.99972,.99981,.9998,1.0006,.99977,.99977,1.00022,.91155,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,.99966,1.00022,1.00032,1.00001,.99944,1.00026,1.00001,.99968,1.00001,1.00047,1,1.0006,1.00001,.99981,1.00101,1.00026,1.0006,.99948,.99981,1.00064,.99973,.99942,1.00101,1.00061,1.00026,1.00069,1.0006,1.00014,.99973,1.01322,.99973,1.00065,1.00026,1.00012,.99923,1,1.00064,1.00076,.99948,1.00055,1.00063,1.00007,.99943,1.0006,.99948,1.00026,.99948,.99943,1.00001,1.00001,1.00029,1.00038,1.00035,1.00001,1.0006,1.0006,.99973,.99978,1.00001,1.00057,.99989,.99967,.99964,.99967,.99977,.99999,.99977,1.00038,.99977,1.00001,.99973,1.00066,.99967,.99967,1.00041,.99998,.99999,.99977,1.00022,.99967,1.00001,.99977,1.00026,.99964,1.00031,1.00001,.99999,.99999,1,1.00023,1,1,.99999,1.00035,1.00001,.99999,.99973,.99977,.99999,1.00058,.99973,.99973,.99955,.9995,1.00026,1.00026,1.00032,.99989,1.00034,.99999,1.00026,1.00026,1.00026,.99973,.45998,.99973,1.00026,.99973,1.00001,.99999,.99982,.99994,.99996,1,1.00042,1.00044,1.00029,1.00023,.99973,.99973,1.00026,.99949,1.00002,.99973,1.0006,1.0006,1.0006,.99975,1.00026,1.00026,1.00032,.98685,.99973,1.00026,1,1,.99966,1.00044,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1,.99973,.99971,.99978,1,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00098,1,1,1,1.00049,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaBoldItalicMetrics={lineHeight:1.35,lineGap:.2};t.HelveticaItalicFactors=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.0288,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,.99946,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.06311,.99973,1.00024,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,1.00041,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.89547,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00001,1,1.00054,.99977,1.00084,1.00007,.99973,1.00013,.99924,1.00001,1.00001,.99945,.91221,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00001,.99999,.99977,.99933,1.00022,1.00054,1.00001,1.00065,1.00026,1.00001,1.0001,1.00001,1.00052,1,1.0006,1.00001,.99945,.99897,.99968,.99924,1.00036,.99945,.99949,1,1.0006,.99897,.99918,.99968,.99911,.99924,1,.99962,1.01487,1,1.0005,.99973,1.00012,1.00043,1,.99995,.99994,1.00036,.99947,1.00019,1.00063,1.00025,.99924,1.00036,.99973,1.00036,1.00025,1.00001,1.00001,1.00027,1.0001,1.00068,1.00001,1.0006,1.0006,1,1.00008,.99957,.99972,.9994,.99954,.99975,1.00051,1.00001,1.00019,1.00001,1.0001,.99986,1.00001,1.00001,1.00038,.99954,.99954,.9994,1.00066,.99999,.99977,1.00022,1.00054,1.00001,.99977,1.00026,.99975,1.0001,1.00001,.99993,.9995,.99955,1.00016,.99978,.99974,1.00019,1.00022,.99955,1.00053,.99973,1.00089,1.00005,.99967,1.00048,.99973,1.00002,1.00034,.99973,.99973,.99964,1.00006,1.00066,.99947,.99973,.98894,.99973,1,.44898,1,.99946,1,1.00039,1.00082,.99991,.99991,.99985,1.00022,1.00023,1.00061,1.00006,.99966,.99973,.99973,.99973,1.00019,1.0008,1,.99924,.99924,.99924,.99983,1.00044,.99973,.99964,.98332,1,.99973,1,1,.99962,.99895,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,1.00423,.99925,.99999,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00049,1,1.00245,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,1.00003,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaItalicMetrics={lineHeight:1.35,lineGap:.2};t.HelveticaRegularFactors=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.04596,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,1.00019,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.02572,.99973,1.00005,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,.99999,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.84533,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99928,1,.99977,1.00013,1.00055,.99947,.99945,.99941,.99924,1.00001,1.00001,1.0004,.91621,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00005,.99999,.99977,1.00015,1.00022,.99977,1.00001,.99973,1.00026,1.00001,1.00019,1.00001,.99946,1,1.0006,1.00001,.99978,1.00045,.99973,.99924,1.00023,.99978,.99966,1,1.00065,1.00045,1.00019,.99973,.99973,.99924,1,1,.96499,1,1.00055,.99973,1.00008,1.00027,1,.9997,.99995,1.00023,.99933,1.00019,1.00015,1.00031,.99924,1.00023,.99973,1.00023,1.00031,1.00001,.99928,1.00029,1.00092,1.00035,1.00001,1.0006,1.0006,1,.99988,.99975,1,1.00082,.99561,.9996,1.00035,1.00001,.99962,1.00001,1.00092,.99964,1.00001,.99963,.99999,1.00035,1.00035,1.00082,.99962,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.9996,.99967,1.00001,1.00034,1.00074,1.00054,1.00053,1.00063,.99971,.99962,1.00035,.99975,.99977,.99973,1.00043,.99953,1.0007,.99915,.99973,1.00008,.99892,1.00073,1.00073,1.00114,.99915,1.00073,.99955,.99973,1.00092,.99973,1,.99998,1,1.0003,1,1.00043,1.00001,.99969,1.0003,1,1.00035,1.00001,.9995,1,1.00092,.99973,.99973,.99973,1.0007,.9995,1,.99924,1.0006,.99924,.99972,1.00062,.99973,1.00114,1.00073,1,.99955,1,1,1.00047,.99968,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,.99925,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaRegularMetrics={lineHeight:1.2,lineGap:.2}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LiberationSansRegularWidths=t.LiberationSansRegularMapping=t.LiberationSansItalicWidths=t.LiberationSansItalicMapping=t.LiberationSansBoldWidths=t.LiberationSansBoldMapping=t.LiberationSansBoldItalicWidths=t.LiberationSansBoldItalicMapping=void 0;t.LiberationSansBoldWidths=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,719,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,785,556,556,278,722,556,556,611,278,611,278,611,385,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,465,722,333,853,906,474,825,927,838,278,722,722,601,719,667,611,722,778,278,722,667,833,722,644,778,722,667,600,611,667,821,667,809,802,278,667,615,451,611,278,582,615,610,556,606,475,460,611,541,278,558,556,612,556,445,611,766,619,520,684,446,582,715,576,753,845,278,582,611,582,845,667,669,885,567,711,667,278,276,556,1094,1062,875,610,722,622,719,722,719,722,567,712,667,904,626,719,719,610,702,833,722,778,719,667,722,611,622,854,667,730,703,1005,1019,870,979,719,711,1031,719,556,618,615,417,635,556,709,497,615,615,500,635,740,604,611,604,611,556,490,556,875,556,615,581,833,844,729,854,615,552,854,583,556,556,611,417,552,556,278,281,278,969,906,611,500,615,556,604,778,611,487,447,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1094,556,885,489,1115,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333];t.LiberationSansBoldMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansBoldItalicWidths=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,740,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,782,556,556,278,722,556,556,611,278,611,278,611,396,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,333,722,333,854,906,473,844,930,847,278,722,722,610,671,667,611,722,778,278,722,667,833,722,657,778,718,667,590,611,667,822,667,829,781,278,667,620,479,611,278,591,620,621,556,610,479,492,611,558,278,566,556,603,556,450,611,712,605,532,664,409,591,704,578,773,834,278,591,611,591,834,667,667,886,614,719,667,278,278,556,1094,1042,854,622,719,677,719,722,708,722,614,722,667,927,643,719,719,615,687,833,722,778,719,667,722,611,677,781,667,729,708,979,989,854,1e3,708,719,1042,729,556,619,604,534,618,556,736,510,611,611,507,622,740,604,611,611,611,556,889,556,885,556,646,583,889,935,707,854,594,552,865,589,556,556,611,469,563,556,278,278,278,969,906,611,507,619,556,611,778,611,575,467,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1104,556,885,516,1146,1e3,768,600,834,834,834,834,999,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333];t.LiberationSansBoldItalicMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansItalicWidths=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,625,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,733,444,500,222,667,500,500,556,222,556,222,556,281,556,400,556,222,722,556,722,556,722,556,615,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,354,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,789,846,389,794,865,775,222,667,667,570,671,667,611,722,778,278,667,667,833,722,648,778,725,667,600,611,667,837,667,831,761,278,667,570,439,555,222,550,570,571,500,556,439,463,555,542,222,500,492,548,500,447,556,670,573,486,603,374,550,652,546,728,779,222,550,556,550,779,667,667,843,544,708,667,278,278,500,1066,982,844,589,715,639,724,667,651,667,544,704,667,917,614,715,715,589,686,833,722,778,725,667,722,611,639,795,667,727,673,920,923,805,886,651,694,1022,682,556,562,522,493,553,556,688,465,556,556,472,564,686,550,556,556,556,500,833,500,835,500,572,518,830,851,621,736,526,492,752,534,556,556,556,378,496,500,222,222,222,910,828,556,472,565,500,556,778,556,492,339,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1083,1e3,768,600,834,834,834,834,1e3,500,998,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,584,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285];t.LiberationSansItalicMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansRegularWidths=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,615,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,735,444,500,222,667,500,500,556,222,556,222,556,292,556,334,556,222,722,556,722,556,722,556,604,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,375,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,784,838,384,774,855,752,222,667,667,551,668,667,611,722,778,278,667,668,833,722,650,778,722,667,618,611,667,798,667,835,748,278,667,578,446,556,222,547,578,575,500,557,446,441,556,556,222,500,500,576,500,448,556,690,569,482,617,395,547,648,525,713,781,222,547,556,547,781,667,667,865,542,719,667,278,278,500,1057,1010,854,583,722,635,719,667,656,667,542,677,667,923,604,719,719,583,656,833,722,778,719,667,722,611,635,760,667,740,667,917,938,792,885,656,719,1010,722,556,573,531,365,583,556,669,458,559,559,438,583,688,552,556,542,556,500,458,500,823,500,573,521,802,823,625,719,521,510,750,542,556,556,556,365,510,500,222,278,222,906,812,556,438,559,500,552,778,556,489,411,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1073,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285];t.LiberationSansRegularMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.MyriadProRegularMetrics=t.MyriadProRegularFactors=t.MyriadProItalicMetrics=t.MyriadProItalicFactors=t.MyriadProBoldMetrics=t.MyriadProBoldItalicMetrics=t.MyriadProBoldItalicFactors=t.MyriadProBoldFactors=void 0;t.MyriadProBoldFactors=[1.36898,1,1,.72706,.80479,.83734,.98894,.99793,.9897,.93884,.86209,.94292,.94292,1.16661,1.02058,.93582,.96694,.93582,1.19137,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.78076,.78076,1.02058,1.02058,1.02058,.72851,.78966,.90838,.83637,.82391,.96376,.80061,.86275,.8768,.95407,1.0258,.73901,.85022,.83655,1.0156,.95546,.92179,.87107,.92179,.82114,.8096,.89713,.94438,.95353,.94083,.91905,.90406,.9446,.94292,1.18777,.94292,1.02058,.89903,.90088,.94938,.97898,.81093,.97571,.94938,1.024,.9577,.95933,.98621,1.0474,.97455,.98981,.9672,.95933,.9446,.97898,.97407,.97646,.78036,1.10208,.95442,.95298,.97579,.9332,.94039,.938,.80687,1.01149,.80687,1.02058,.80479,.99793,.99793,.99793,.99793,1.01149,1.00872,.90088,.91882,1.0213,.8361,1.02058,.62295,.54324,.89022,1.08595,1,1,.90088,1,.97455,.93582,.90088,1,1.05686,.8361,.99642,.99642,.99642,.72851,.90838,.90838,.90838,.90838,.90838,.90838,.868,.82391,.80061,.80061,.80061,.80061,1.0258,1.0258,1.0258,1.0258,.97484,.95546,.92179,.92179,.92179,.92179,.92179,1.02058,.92179,.94438,.94438,.94438,.94438,.90406,.86958,.98225,.94938,.94938,.94938,.94938,.94938,.94938,.9031,.81093,.94938,.94938,.94938,.94938,.98621,.98621,.98621,.98621,.93969,.95933,.9446,.9446,.9446,.9446,.9446,1.08595,.9446,.95442,.95442,.95442,.95442,.94039,.97898,.94039,.90838,.94938,.90838,.94938,.90838,.94938,.82391,.81093,.82391,.81093,.82391,.81093,.82391,.81093,.96376,.84313,.97484,.97571,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.8768,.9577,.8768,.9577,.8768,.9577,1,1,.95407,.95933,.97069,.95933,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,.887,1.01591,.73901,1.0474,1,1,.97455,.83655,.98981,1,1,.83655,.73977,.83655,.73903,.84638,1.033,.95546,.95933,1,1,.95546,.95933,.8271,.95417,.95933,.92179,.9446,.92179,.9446,.92179,.9446,.936,.91964,.82114,.97646,1,1,.82114,.97646,.8096,.78036,.8096,.78036,1,1,.8096,.78036,1,1,.89713,.77452,.89713,1.10208,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94083,.97579,.90406,.94039,.90406,.9446,.938,.9446,.938,.9446,.938,1,.99793,.90838,.94938,.868,.9031,.92179,.9446,1,1,.89713,1.10208,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90989,.9358,.91945,.83181,.75261,.87992,.82976,.96034,.83689,.97268,1.0078,.90838,.83637,.8019,.90157,.80061,.9446,.95407,.92436,1.0258,.85022,.97153,1.0156,.95546,.89192,.92179,.92361,.87107,.96318,.89713,.93704,.95638,.91905,.91709,.92796,1.0258,.93704,.94836,1.0373,.95933,1.0078,.95871,.94836,.96174,.92601,.9498,.98607,.95776,.95933,1.05453,1.0078,.98275,.9314,.95617,.91701,1.05993,.9446,.78367,.9553,1,.86832,1.0128,.95871,.99394,.87548,.96361,.86774,1.0078,.95871,.9446,.95871,.86774,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.94083,.97579,.94083,.97579,.94083,.97579,.90406,.94039,.96694,1,.89903,1,1,1,.93582,.93582,.93582,1,.908,.908,.918,.94219,.94219,.96544,1,1.285,1,1,.81079,.81079,1,1,.74854,1,1,1,1,.99793,1,1,1,.65,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.17173,1,.80535,.76169,1.02058,1.0732,1.05486,1,1,1.30692,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.16161,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProBoldMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProBoldItalicFactors=[1.36898,1,1,.66227,.80779,.81625,.97276,.97276,.97733,.92222,.83266,.94292,.94292,1.16148,1.02058,.93582,.96694,.93582,1.17337,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.78076,.78076,1.02058,1.02058,1.02058,.71541,.76813,.85576,.80591,.80729,.94299,.77512,.83655,.86523,.92222,.98621,.71743,.81698,.79726,.98558,.92222,.90637,.83809,.90637,.80729,.76463,.86275,.90699,.91605,.9154,.85308,.85458,.90531,.94292,1.21296,.94292,1.02058,.89903,1.18616,.99613,.91677,.78216,.91677,.90083,.98796,.9135,.92168,.95381,.98981,.95298,.95381,.93459,.92168,.91513,.92004,.91677,.95077,.748,1.04502,.91677,.92061,.94236,.89544,.89364,.9,.80687,.8578,.80687,1.02058,.80779,.97276,.97276,.97276,.97276,.8578,.99973,1.18616,.91339,1.08074,.82891,1.02058,.55509,.71526,.89022,1.08595,1,1,1.18616,1,.96736,.93582,1.18616,1,1.04864,.82711,.99043,.99043,.99043,.71541,.85576,.85576,.85576,.85576,.85576,.85576,.845,.80729,.77512,.77512,.77512,.77512,.98621,.98621,.98621,.98621,.95961,.92222,.90637,.90637,.90637,.90637,.90637,1.02058,.90251,.90699,.90699,.90699,.90699,.85458,.83659,.94951,.99613,.99613,.99613,.99613,.99613,.99613,.85811,.78216,.90083,.90083,.90083,.90083,.95381,.95381,.95381,.95381,.9135,.92168,.91513,.91513,.91513,.91513,.91513,1.08595,.91677,.91677,.91677,.91677,.91677,.89364,.92332,.89364,.85576,.99613,.85576,.99613,.85576,.99613,.80729,.78216,.80729,.78216,.80729,.78216,.80729,.78216,.94299,.76783,.95961,.91677,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.86523,.9135,.86523,.9135,.86523,.9135,1,1,.92222,.92168,.92222,.92168,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.86036,.97096,.71743,.98981,1,1,.95298,.79726,.95381,1,1,.79726,.6894,.79726,.74321,.81691,1.0006,.92222,.92168,1,1,.92222,.92168,.79464,.92098,.92168,.90637,.91513,.90637,.91513,.90637,.91513,.909,.87514,.80729,.95077,1,1,.80729,.95077,.76463,.748,.76463,.748,1,1,.76463,.748,1,1,.86275,.72651,.86275,1.04502,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.9154,.94236,.85458,.89364,.85458,.90531,.9,.90531,.9,.90531,.9,1,.97276,.85576,.99613,.845,.85811,.90251,.91677,1,1,.86275,1.04502,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.00899,1.30628,.85576,.80178,.66862,.7927,.69323,.88127,.72459,.89711,.95381,.85576,.80591,.7805,.94729,.77512,.90531,.92222,.90637,.98621,.81698,.92655,.98558,.92222,.85359,.90637,.90976,.83809,.94523,.86275,.83509,.93157,.85308,.83392,.92346,.98621,.83509,.92886,.91324,.92168,.95381,.90646,.92886,.90557,.86847,.90276,.91324,.86842,.92168,.99531,.95381,.9224,.85408,.92699,.86847,1.0051,.91513,.80487,.93481,1,.88159,1.05214,.90646,.97355,.81539,.89398,.85923,.95381,.90646,.91513,.90646,.85923,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9154,.94236,.9154,.94236,.9154,.94236,.85458,.89364,.96694,1,.89903,1,1,1,.91782,.91782,.91782,1,.896,.896,.896,.9332,.9332,.95973,1,1.26,1,1,.80479,.80178,1,1,.85633,1,1,1,1,.97276,1,1,1,.698,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.14542,1,.79199,.78694,1.02058,1.03493,1.05486,1,1,1.23026,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.20006,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProBoldItalicMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProItalicFactors=[1.36898,1,1,.65507,.84943,.85639,.88465,.88465,.86936,.88307,.86948,.85283,.85283,1.06383,1.02058,.75945,.9219,.75945,1.17337,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.75945,.75945,1.02058,1.02058,1.02058,.69046,.70926,.85158,.77812,.76852,.89591,.70466,.76125,.80094,.86822,.83864,.728,.77212,.79475,.93637,.87514,.8588,.76013,.8588,.72421,.69866,.77598,.85991,.80811,.87832,.78112,.77512,.8562,1.0222,1.18417,1.0222,1.27014,.89903,1.15012,.93859,.94399,.846,.94399,.81453,1.0186,.94219,.96017,1.03075,1.02175,.912,1.03075,.96998,.96017,.93859,.94399,.94399,.95493,.746,1.12658,.94578,.91,.979,.882,.882,.83,.85034,.83537,.85034,1.02058,.70869,.88465,.88465,.88465,.88465,.83537,.90083,1.15012,.9161,.94565,.73541,1.02058,.53609,.69353,.79519,1.08595,1,1,1.15012,1,.91974,.75945,1.15012,1,.9446,.73361,.9005,.9005,.9005,.62864,.85158,.85158,.85158,.85158,.85158,.85158,.773,.76852,.70466,.70466,.70466,.70466,.83864,.83864,.83864,.83864,.90561,.87514,.8588,.8588,.8588,.8588,.8588,1.02058,.85751,.85991,.85991,.85991,.85991,.77512,.76013,.88075,.93859,.93859,.93859,.93859,.93859,.93859,.8075,.846,.81453,.81453,.81453,.81453,.82424,.82424,.82424,.82424,.9278,.96017,.93859,.93859,.93859,.93859,.93859,1.08595,.8562,.94578,.94578,.94578,.94578,.882,.94578,.882,.85158,.93859,.85158,.93859,.85158,.93859,.76852,.846,.76852,.846,.76852,.846,.76852,.846,.89591,.8544,.90561,.94399,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.80094,.94219,.80094,.94219,.80094,.94219,1,1,.86822,.96017,.86822,.96017,.83864,.82424,.83864,.82424,.83864,.82424,.83864,1.03075,.83864,.82424,.81402,1.02738,.728,1.02175,1,1,.912,.79475,1.03075,1,1,.79475,.83911,.79475,.66266,.80553,1.06676,.87514,.96017,1,1,.87514,.96017,.86865,.87396,.96017,.8588,.93859,.8588,.93859,.8588,.93859,.867,.84759,.72421,.95493,1,1,.72421,.95493,.69866,.746,.69866,.746,1,1,.69866,.746,1,1,.77598,.88417,.77598,1.12658,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.87832,.979,.77512,.882,.77512,.8562,.83,.8562,.83,.8562,.83,1,.88465,.85158,.93859,.773,.8075,.85751,.8562,1,1,.77598,1.12658,1.15012,1.15012,1.15012,1.15012,1.15012,1.15313,1.15012,1.15012,1.15012,1.08106,1.03901,.85158,.77025,.62264,.7646,.65351,.86026,.69461,.89947,1.03075,.85158,.77812,.76449,.88836,.70466,.8562,.86822,.8588,.83864,.77212,.85308,.93637,.87514,.82352,.8588,.85701,.76013,.89058,.77598,.8156,.82565,.78112,.77899,.89386,.83864,.8156,.9486,.92388,.96186,1.03075,.91123,.9486,.93298,.878,.93942,.92388,.84596,.96186,.95119,1.03075,.922,.88787,.95829,.88,.93559,.93859,.78815,.93758,1,.89217,1.03737,.91123,.93969,.77487,.85769,.86799,1.03075,.91123,.93859,.91123,.86799,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87832,.979,.87832,.979,.87832,.979,.77512,.882,.9219,1,.89903,1,1,1,.87321,.87321,.87321,1,1.027,1.027,1.027,.86847,.86847,.79121,1,1.124,1,1,.73572,.73572,1,1,.85034,1,1,1,1,.88465,1,1,1,.669,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.04828,1,.74948,.75187,1.02058,.98391,1.02119,1,1,1.06233,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05233,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProItalicMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProRegularFactors=[1.36898,1,1,.76305,.82784,.94935,.89364,.92241,.89073,.90706,.98472,.85283,.85283,1.0664,1.02058,.74505,.9219,.74505,1.23456,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.74505,.74505,1.02058,1.02058,1.02058,.73002,.72601,.91755,.8126,.80314,.92222,.73764,.79726,.83051,.90284,.86023,.74,.8126,.84869,.96518,.91115,.8858,.79761,.8858,.74498,.73914,.81363,.89591,.83659,.89633,.85608,.8111,.90531,1.0222,1.22736,1.0222,1.27014,.89903,.90088,.86667,1.0231,.896,1.01411,.90083,1.05099,1.00512,.99793,1.05326,1.09377,.938,1.06226,1.00119,.99793,.98714,1.0231,1.01231,.98196,.792,1.19137,.99074,.962,1.01915,.926,.942,.856,.85034,.92006,.85034,1.02058,.69067,.92241,.92241,.92241,.92241,.92006,.9332,.90088,.91882,.93484,.75339,1.02058,.56866,.54324,.79519,1.08595,1,1,.90088,1,.95325,.74505,.90088,1,.97198,.75339,.91009,.91009,.91009,.66466,.91755,.91755,.91755,.91755,.91755,.91755,.788,.80314,.73764,.73764,.73764,.73764,.86023,.86023,.86023,.86023,.92915,.91115,.8858,.8858,.8858,.8858,.8858,1.02058,.8858,.89591,.89591,.89591,.89591,.8111,.79611,.89713,.86667,.86667,.86667,.86667,.86667,.86667,.86936,.896,.90083,.90083,.90083,.90083,.84224,.84224,.84224,.84224,.97276,.99793,.98714,.98714,.98714,.98714,.98714,1.08595,.89876,.99074,.99074,.99074,.99074,.942,1.0231,.942,.91755,.86667,.91755,.86667,.91755,.86667,.80314,.896,.80314,.896,.80314,.896,.80314,.896,.92222,.93372,.92915,1.01411,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.83051,1.00512,.83051,1.00512,.83051,1.00512,1,1,.90284,.99793,.90976,.99793,.86023,.84224,.86023,.84224,.86023,.84224,.86023,1.05326,.86023,.84224,.82873,1.07469,.74,1.09377,1,1,.938,.84869,1.06226,1,1,.84869,.83704,.84869,.81441,.85588,1.08927,.91115,.99793,1,1,.91115,.99793,.91887,.90991,.99793,.8858,.98714,.8858,.98714,.8858,.98714,.894,.91434,.74498,.98196,1,1,.74498,.98196,.73914,.792,.73914,.792,1,1,.73914,.792,1,1,.81363,.904,.81363,1.19137,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89633,1.01915,.8111,.942,.8111,.90531,.856,.90531,.856,.90531,.856,1,.92241,.91755,.86667,.788,.86936,.8858,.89876,1,1,.81363,1.19137,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90388,1.03901,.92138,.78105,.7154,.86169,.80513,.94007,.82528,.98612,1.06226,.91755,.8126,.81884,.92819,.73764,.90531,.90284,.8858,.86023,.8126,.91172,.96518,.91115,.83089,.8858,.87791,.79761,.89297,.81363,.88157,.89992,.85608,.81992,.94307,.86023,.88157,.95308,.98699,.99793,1.06226,.95817,.95308,.97358,.928,.98088,.98699,.92761,.99793,.96017,1.06226,.986,.944,.95978,.938,.96705,.98714,.80442,.98972,1,.89762,1.04552,.95817,.99007,.87064,.91879,.88888,1.06226,.95817,.98714,.95817,.88888,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89633,1.01915,.89633,1.01915,.89633,1.01915,.8111,.942,.9219,1,.89903,1,1,1,.93173,.93173,.93173,1,1.06304,1.06304,1.06904,.89903,.89903,.80549,1,1.156,1,1,.76575,.76575,1,1,.72458,1,1,1,1,.92241,1,1,1,.619,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.07257,1,.74705,.71119,1.02058,1.024,1.02119,1,1,1.1536,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05638,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProRegularMetrics={lineHeight:1.2,lineGap:.2}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SegoeuiRegularMetrics=t.SegoeuiRegularFactors=t.SegoeuiItalicMetrics=t.SegoeuiItalicFactors=t.SegoeuiBoldMetrics=t.SegoeuiBoldItalicMetrics=t.SegoeuiBoldItalicFactors=t.SegoeuiBoldFactors=void 0;t.SegoeuiBoldFactors=[1.76738,1,1,.99297,.9824,1.04016,1.06497,1.03424,.97529,1.17647,1.23203,1.1085,1.1085,1.16939,1.2107,.9754,1.21408,.9754,1.59578,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,.81378,.81378,1.2107,1.2107,1.2107,.71703,.97847,.97363,.88776,.8641,1.02096,.79795,.85132,.914,1.06085,1.1406,.8007,.89858,.83693,1.14889,1.09398,.97489,.92094,.97489,.90399,.84041,.95923,1.00135,1,1.06467,.98243,.90996,.99361,1.1085,1.56942,1.1085,1.2107,.74627,.94282,.96752,1.01519,.86304,1.01359,.97278,1.15103,1.01359,.98561,1.02285,1.02285,1.00527,1.02285,1.0302,.99041,1.0008,1.01519,1.01359,1.02258,.79104,1.16862,.99041,.97454,1.02511,.99298,.96752,.95801,.94856,1.16579,.94856,1.2107,.9824,1.03424,1.03424,1,1.03424,1.16579,.8727,1.3871,1.18622,1.10818,1.04478,1.2107,1.18622,.75155,.94994,1.28826,1.21408,1.21408,.91056,1,.91572,.9754,.64663,1.18328,1.24866,1.04478,1.14169,1.15749,1.17389,.71703,.97363,.97363,.97363,.97363,.97363,.97363,.93506,.8641,.79795,.79795,.79795,.79795,1.1406,1.1406,1.1406,1.1406,1.02096,1.09398,.97426,.97426,.97426,.97426,.97426,1.2107,.97489,1.00135,1.00135,1.00135,1.00135,.90996,.92094,1.02798,.96752,.96752,.96752,.96752,.96752,.96752,.93136,.86304,.97278,.97278,.97278,.97278,1.02285,1.02285,1.02285,1.02285,.97122,.99041,1,1,1,1,1,1.28826,1.0008,.99041,.99041,.99041,.99041,.96752,1.01519,.96752,.97363,.96752,.97363,.96752,.97363,.96752,.8641,.86304,.8641,.86304,.8641,.86304,.8641,.86304,1.02096,1.03057,1.02096,1.03517,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.914,1.01359,.914,1.01359,.914,1.01359,1,1,1.06085,.98561,1.06085,1.00879,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,.97138,1.08692,.8007,1.02285,1,1,1.00527,.83693,1.02285,1,1,.83693,.9455,.83693,.90418,.83693,1.13005,1.09398,.99041,1,1,1.09398,.99041,.96692,1.09251,.99041,.97489,1.0008,.97489,1.0008,.97489,1.0008,.93994,.97931,.90399,1.02258,1,1,.90399,1.02258,.84041,.79104,.84041,.79104,.84041,.79104,.84041,.79104,1,1,.95923,1.07034,.95923,1.16862,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.06467,1.02511,.90996,.96752,.90996,.99361,.95801,.99361,.95801,.99361,.95801,1.07733,1.03424,.97363,.96752,.93506,.93136,.97489,1.0008,1,1,.95923,1.16862,1.15103,1.15103,1.01173,1.03959,.75953,.81378,.79912,1.15103,1.21994,.95161,.87815,1.01149,.81525,.7676,.98167,1.01134,1.02546,.84097,1.03089,1.18102,.97363,.88776,.85134,.97826,.79795,.99361,1.06085,.97489,1.1406,.89858,1.0388,1.14889,1.09398,.86039,.97489,1.0595,.92094,.94793,.95923,.90996,.99346,.98243,1.02112,.95493,1.1406,.90996,1.03574,1.02597,1.0008,1.18102,1.06628,1.03574,1.0192,1.01932,1.00886,.97531,1.0106,1.0008,1.13189,1.18102,1.02277,.98683,1.0016,.99561,1.07237,1.0008,.90434,.99921,.93803,.8965,1.23085,1.06628,1.04983,.96268,1.0499,.98439,1.18102,1.06628,1.0008,1.06628,.98439,.79795,1,1,1,1,1,1,1,1,1,1,1,1,1.09466,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.97278,1,1,1,1,1,1,1,1,1,1,1,1,1.02065,1,1,1,1,1,1,1.06467,1.02511,1.06467,1.02511,1.06467,1.02511,.90996,.96752,1,1.21408,.89903,1,1,.75155,1.04394,1.04394,1.04394,1.04394,.98633,.98633,.98633,.73047,.73047,1.20642,.91211,1.25635,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.12454,.93503,1.03424,1.19687,1.03424,1,1,1,.771,1,1,1.15749,1.15749,1.15749,1.10948,.86279,.94434,.86279,.94434,.86182,1,1,1.16897,1,.96085,.90137,1.2107,1.18416,1.13973,.69825,.9716,2.10339,1.29004,1.29004,1.21172,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18874,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.09193,1.09193,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiBoldMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiBoldItalicFactors=[1.76738,1,1,.98946,1.03959,1.04016,1.02809,1.036,.97639,1.10953,1.23203,1.11144,1.11144,1.16939,1.21237,.9754,1.21261,.9754,1.59754,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,.81378,.81378,1.21237,1.21237,1.21237,.73541,.97847,.97363,.89723,.87897,1.0426,.79429,.85292,.91149,1.05815,1.1406,.79631,.90128,.83853,1.04396,1.10615,.97552,.94436,.97552,.88641,.80527,.96083,1.00135,1,1.06777,.9817,.91142,.99361,1.11144,1.57293,1.11144,1.21237,.74627,1.31818,1.06585,.97042,.83055,.97042,.93503,1.1261,.97042,.97922,1.14236,.94552,1.01054,1.14236,1.02471,.97922,.94165,.97042,.97042,1.0276,.78929,1.1261,.97922,.95874,1.02197,.98507,.96752,.97168,.95107,1.16579,.95107,1.21237,1.03959,1.036,1.036,1,1.036,1.16579,.87357,1.31818,1.18754,1.26781,1.05356,1.21237,1.18622,.79487,.94994,1.29004,1.24047,1.24047,1.31818,1,.91484,.9754,1.31818,1.1349,1.24866,1.05356,1.13934,1.15574,1.17389,.73541,.97363,.97363,.97363,.97363,.97363,.97363,.94385,.87897,.79429,.79429,.79429,.79429,1.1406,1.1406,1.1406,1.1406,1.0426,1.10615,.97552,.97552,.97552,.97552,.97552,1.21237,.97552,1.00135,1.00135,1.00135,1.00135,.91142,.94436,.98721,1.06585,1.06585,1.06585,1.06585,1.06585,1.06585,.96705,.83055,.93503,.93503,.93503,.93503,1.14236,1.14236,1.14236,1.14236,.93125,.97922,.94165,.94165,.94165,.94165,.94165,1.29004,.94165,.97922,.97922,.97922,.97922,.96752,.97042,.96752,.97363,1.06585,.97363,1.06585,.97363,1.06585,.87897,.83055,.87897,.83055,.87897,.83055,.87897,.83055,1.0426,1.0033,1.0426,.97042,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.91149,.97042,.91149,.97042,.91149,.97042,1,1,1.05815,.97922,1.05815,.97922,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,.97441,1.04302,.79631,1.01582,1,1,1.01054,.83853,1.14236,1,1,.83853,1.09125,.83853,.90418,.83853,1.19508,1.10615,.97922,1,1,1.10615,.97922,1.01034,1.10466,.97922,.97552,.94165,.97552,.94165,.97552,.94165,.91602,.91981,.88641,1.0276,1,1,.88641,1.0276,.80527,.78929,.80527,.78929,.80527,.78929,.80527,.78929,1,1,.96083,1.05403,.95923,1.16862,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.06777,1.02197,.91142,.96752,.91142,.99361,.97168,.99361,.97168,.99361,.97168,1.23199,1.036,.97363,1.06585,.94385,.96705,.97552,.94165,1,1,.96083,1.1261,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,.95161,1.27126,1.00811,.83284,.77702,.99137,.95253,1.0347,.86142,1.07205,1.14236,.97363,.89723,.86869,1.09818,.79429,.99361,1.05815,.97552,1.1406,.90128,1.06662,1.04396,1.10615,.84918,.97552,1.04694,.94436,.98015,.96083,.91142,1.00356,.9817,1.01945,.98999,1.1406,.91142,1.04961,.9898,1.00639,1.14236,1.07514,1.04961,.99607,1.02897,1.008,.9898,.95134,1.00639,1.11121,1.14236,1.00518,.97981,1.02186,1,1.08578,.94165,.99314,.98387,.93028,.93377,1.35125,1.07514,1.10687,.93491,1.04232,1.00351,1.14236,1.07514,.94165,1.07514,1.00351,.79429,1,1,1,1,1,1,1,1,1,1,1,1,1.09097,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.93503,1,1,1,1,1,1,1,1,1,1,1,1,.96609,1,1,1,1,1,1,1.06777,1.02197,1.06777,1.02197,1.06777,1.02197,.91142,.96752,1,1.21261,.89903,1,1,.75155,1.04745,1.04745,1.04745,1.04394,.98633,.98633,.98633,.72959,.72959,1.20502,.91406,1.26514,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.09125,.93327,1.03336,1.16541,1.036,1,1,1,.771,1,1,1.15574,1.15574,1.15574,1.15574,.86364,.94434,.86279,.94434,.86224,1,1,1.16798,1,.96085,.90068,1.21237,1.18416,1.13904,.69825,.9716,2.10339,1.29004,1.29004,1.21339,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18775,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.13269,1.13269,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiBoldItalicMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiItalicFactors=[1.76738,1,1,.98946,1.14763,1.05365,1.06234,.96927,.92586,1.15373,1.18414,.91349,.91349,1.07403,1.17308,.78383,1.20088,.78383,1.42531,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78383,.78383,1.17308,1.17308,1.17308,.77349,.94565,.94729,.85944,.88506,.9858,.74817,.80016,.88449,.98039,.95782,.69238,.89898,.83231,.98183,1.03989,.96924,.86237,.96924,.80595,.74524,.86091,.95402,.94143,.98448,.8858,.83089,.93285,1.0949,1.39016,1.0949,1.45994,.74627,1.04839,.97454,.97454,.87207,.97454,.87533,1.06151,.97454,1.00176,1.16484,1.08132,.98047,1.16484,1.02989,1.01054,.96225,.97454,.97454,1.06598,.79004,1.16344,1.00351,.94629,.9973,.91016,.96777,.9043,.91082,.92481,.91082,1.17308,.95748,.96927,.96927,1,.96927,.92481,.80597,1.04839,1.23393,1.1781,.9245,1.17308,1.20808,.63218,.94261,1.24822,1.09971,1.09971,1.04839,1,.85273,.78032,1.04839,1.09971,1.22326,.9245,1.09836,1.13525,1.15222,.70424,.94729,.94729,.94729,.94729,.94729,.94729,.85498,.88506,.74817,.74817,.74817,.74817,.95782,.95782,.95782,.95782,.9858,1.03989,.96924,.96924,.96924,.96924,.96924,1.17308,.96924,.95402,.95402,.95402,.95402,.83089,.86237,.88409,.97454,.97454,.97454,.97454,.97454,.97454,.92916,.87207,.87533,.87533,.87533,.87533,.93146,.93146,.93146,.93146,.93854,1.01054,.96225,.96225,.96225,.96225,.96225,1.24822,.8761,1.00351,1.00351,1.00351,1.00351,.96777,.97454,.96777,.94729,.97454,.94729,.97454,.94729,.97454,.88506,.87207,.88506,.87207,.88506,.87207,.88506,.87207,.9858,.95391,.9858,.97454,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.88449,.97454,.88449,.97454,.88449,.97454,1,1,.98039,1.00176,.98039,1.00176,.95782,.93146,.95782,.93146,.95782,.93146,.95782,1.16484,.95782,.93146,.84421,1.12761,.69238,1.08132,1,1,.98047,.83231,1.16484,1,1,.84723,1.04861,.84723,.78755,.83231,1.23736,1.03989,1.01054,1,1,1.03989,1.01054,.9857,1.03849,1.01054,.96924,.96225,.96924,.96225,.96924,.96225,.92383,.90171,.80595,1.06598,1,1,.80595,1.06598,.74524,.79004,.74524,.79004,.74524,.79004,.74524,.79004,1,1,.86091,1.02759,.85771,1.16344,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.98448,.9973,.83089,.96777,.83089,.93285,.9043,.93285,.9043,.93285,.9043,1.31868,.96927,.94729,.97454,.85498,.92916,.96924,.8761,1,1,.86091,1.16344,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,.81965,.81965,.94729,.78032,.71022,.90883,.84171,.99877,.77596,1.05734,1.2,.94729,.85944,.82791,.9607,.74817,.93285,.98039,.96924,.95782,.89898,.98316,.98183,1.03989,.78614,.96924,.97642,.86237,.86075,.86091,.83089,.90082,.8858,.97296,1.01284,.95782,.83089,1.0976,1.04,1.03342,1.2,1.0675,1.0976,.98205,1.03809,1.05097,1.04,.95364,1.03342,1.05401,1.2,1.02148,1.0119,1.04724,1.0127,1.02732,.96225,.8965,.97783,.93574,.94818,1.30679,1.0675,1.11826,.99821,1.0557,1.0326,1.2,1.0675,.96225,1.0675,1.0326,.74817,1,1,1,1,1,1,1,1,1,1,1,1,1.03754,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87533,1,1,1,1,1,1,1,1,1,1,1,1,.98705,1,1,1,1,1,1,.98448,.9973,.98448,.9973,.98448,.9973,.83089,.96777,1,1.20088,.89903,1,1,.75155,.94945,.94945,.94945,.94945,1.12317,1.12317,1.12317,.67603,.67603,1.15621,.73584,1.21191,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87709,.96927,1.01473,.96927,1,1,1,.77295,1,1,1.09836,1.09836,1.09836,1.01522,.86321,.94434,.8649,.94434,.86182,1,1,1.083,1,.91578,.86438,1.17308,1.18416,1.14589,.69825,.97622,1.96791,1.24822,1.24822,1.17308,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.17984,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10742,1.10742,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiItalicMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiRegularFactors=[1.76738,1,1,.98594,1.02285,1.10454,1.06234,.96927,.92037,1.19985,1.2046,.90616,.90616,1.07152,1.1714,.78032,1.20088,.78032,1.40246,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78032,.78032,1.1714,1.1714,1.1714,.80597,.94084,.96706,.85944,.85734,.97093,.75842,.79936,.88198,.9831,.95782,.71387,.86969,.84636,1.07796,1.03584,.96924,.83968,.96924,.82826,.79649,.85771,.95132,.93119,.98965,.88433,.8287,.93365,1.08612,1.3638,1.08612,1.45786,.74627,.80499,.91484,1.05707,.92383,1.05882,.9403,1.12654,1.05882,1.01756,1.09011,1.09011,.99414,1.09011,1.034,1.01756,1.05356,1.05707,1.05882,1.04399,.84863,1.21968,1.01756,.95801,1.00068,.91797,.96777,.9043,.90351,.92105,.90351,1.1714,.85337,.96927,.96927,.99912,.96927,.92105,.80597,1.2434,1.20808,1.05937,.90957,1.1714,1.20808,.75155,.94261,1.24644,1.09971,1.09971,.84751,1,.85273,.78032,.61584,1.05425,1.17914,.90957,1.08665,1.11593,1.14169,.73381,.96706,.96706,.96706,.96706,.96706,.96706,.86035,.85734,.75842,.75842,.75842,.75842,.95782,.95782,.95782,.95782,.97093,1.03584,.96924,.96924,.96924,.96924,.96924,1.1714,.96924,.95132,.95132,.95132,.95132,.8287,.83968,.89049,.91484,.91484,.91484,.91484,.91484,.91484,.93575,.92383,.9403,.9403,.9403,.9403,.8717,.8717,.8717,.8717,1.00527,1.01756,1.05356,1.05356,1.05356,1.05356,1.05356,1.24644,.95923,1.01756,1.01756,1.01756,1.01756,.96777,1.05707,.96777,.96706,.91484,.96706,.91484,.96706,.91484,.85734,.92383,.85734,.92383,.85734,.92383,.85734,.92383,.97093,1.0969,.97093,1.05882,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.88198,1.05882,.88198,1.05882,.88198,1.05882,1,1,.9831,1.01756,.9831,1.01756,.95782,.8717,.95782,.8717,.95782,.8717,.95782,1.09011,.95782,.8717,.84784,1.11551,.71387,1.09011,1,1,.99414,.84636,1.09011,1,1,.84636,1.0536,.84636,.94298,.84636,1.23297,1.03584,1.01756,1,1,1.03584,1.01756,1.00323,1.03444,1.01756,.96924,1.05356,.96924,1.05356,.96924,1.05356,.93066,.98293,.82826,1.04399,1,1,.82826,1.04399,.79649,.84863,.79649,.84863,.79649,.84863,.79649,.84863,1,1,.85771,1.17318,.85771,1.21968,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.98965,1.00068,.8287,.96777,.8287,.93365,.9043,.93365,.9043,.93365,.9043,1.08571,.96927,.96706,.91484,.86035,.93575,.96924,.95923,1,1,.85771,1.21968,1.11437,1.11437,.93109,.91202,.60411,.84164,.55572,1.01173,.97361,.81818,.81818,.96635,.78032,.72727,.92366,.98601,1.03405,.77968,1.09799,1.2,.96706,.85944,.85638,.96491,.75842,.93365,.9831,.96924,.95782,.86969,.94152,1.07796,1.03584,.78437,.96924,.98715,.83968,.83491,.85771,.8287,.94492,.88433,.9287,1.0098,.95782,.8287,1.0625,.98248,1.03424,1.2,1.01071,1.0625,.95246,1.03809,1.04912,.98248,1.00221,1.03424,1.05443,1.2,1.04785,.99609,1.00169,1.05176,.99346,1.05356,.9087,1.03004,.95542,.93117,1.23362,1.01071,1.07831,1.02512,1.05205,1.03502,1.2,1.01071,1.05356,1.01071,1.03502,.75842,1,1,1,1,1,1,1,1,1,1,1,1,1.03719,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9403,1,1,1,1,1,1,1,1,1,1,1,1,1.04021,1,1,1,1,1,1,.98965,1.00068,.98965,1.00068,.98965,1.00068,.8287,.96777,1,1.20088,.89903,1,1,.75155,1.03077,1.03077,1.03077,1.03077,1.13196,1.13196,1.13196,.67428,.67428,1.16039,.73291,1.20996,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87796,.96927,1.01518,.96927,1,1,1,.77295,1,1,1.10539,1.10539,1.11358,1.06967,.86279,.94434,.86279,.94434,.86182,1,1,1.083,1,.91578,.86507,1.1714,1.18416,1.14589,.69825,.97622,1.9697,1.24822,1.24822,1.17238,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18083,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10938,1.10938,1,1,1,1.05425,1.09971,1.09971,1.09971,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiRegularMetrics={lineHeight:1.33008,lineGap:0}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptEvaluator=t.PostScriptCompiler=t.PDFFunctionFactory=void 0;t.isPDFFunction=function isPDFFunction(e){let t;if("object"!=typeof e)return!1;if(e instanceof r.Dict)t=e;else{if(!(e instanceof s.BaseStream))return!1;t=e.dict}return t.has("FunctionType")};var r=a(5),n=a(2),i=a(58),s=a(7),o=a(59);t.PDFFunctionFactory=class PDFFunctionFactory{constructor({xref:e,isEvalSupported:t=!0}){this.xref=e;this.isEvalSupported=!1!==t}create(e){const t=this.getCached(e);if(t)return t;const a=PDFFunction.parse({xref:this.xref,isEvalSupported:this.isEvalSupported,fn:e instanceof r.Ref?this.xref.fetch(e):e});this._cache(e,a);return a}createFromArray(e){const t=this.getCached(e);if(t)return t;const a=PDFFunction.parseArray({xref:this.xref,isEvalSupported:this.isEvalSupported,fnObj:e instanceof r.Ref?this.xref.fetch(e):e});this._cache(e,a);return a}getCached(e){let t;e instanceof r.Ref?t=e:e instanceof r.Dict?t=e.objId:e instanceof s.BaseStream&&(t=e.dict&&e.dict.objId);if(t){const e=this._localFunctionCache.getByRef(t);if(e)return e}return null}_cache(e,t){if(!t)throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.');let a;e instanceof r.Ref?a=e:e instanceof r.Dict?a=e.objId:e instanceof s.BaseStream&&(a=e.dict&&e.dict.objId);a&&this._localFunctionCache.set(null,a,t)}get _localFunctionCache(){return(0,n.shadow)(this,"_localFunctionCache",new o.LocalFunctionCache)}};function toNumberArray(e){if(!Array.isArray(e))return null;const t=e.length;for(let a=0;a>c)*h;l&=(1<a?e=a:e0&&(d=o[u-1]);let f=r[1];u>1,u=s.length>>1,d=new PostScriptEvaluator(l),f=Object.create(null);let g=8192;const p=new Float32Array(u);return function constructPostScriptFn(e,t,a,r){let n,i,s="";const c=p;for(n=0;ne&&(i=e)}m[n]=i}if(g>0){g--;f[s]=m}a.set(m,r)}}}class PostScriptStack{static get MAX_STACK_SIZE(){return(0,n.shadow)(this,"MAX_STACK_SIZE",100)}constructor(e){this.stack=e?Array.prototype.slice.call(e,0):[]}push(e){if(this.stack.length>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");this.stack.push(e)}pop(){if(this.stack.length<=0)throw new Error("PostScript function stack underflow.");return this.stack.pop()}copy(e){if(this.stack.length+e>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");const t=this.stack;for(let a=t.length-e,r=e-1;r>=0;r--,a++)t.push(t[a])}index(e){this.push(this.stack[this.stack.length-e-1])}roll(e,t){const a=this.stack,r=a.length-e,n=a.length-1,i=r+(t-Math.floor(t/e)*e);for(let e=r,t=n;e0?t.push(o<>c);break;case"ceiling":o=t.pop();t.push(Math.ceil(o));break;case"copy":o=t.pop();t.copy(o);break;case"cos":o=t.pop();t.push(Math.cos(o));break;case"cvi":o=0|t.pop();t.push(o);break;case"cvr":break;case"div":c=t.pop();o=t.pop();t.push(o/c);break;case"dup":t.copy(1);break;case"eq":c=t.pop();o=t.pop();t.push(o===c);break;case"exch":t.roll(2,1);break;case"exp":c=t.pop();o=t.pop();t.push(o**c);break;case"false":t.push(!1);break;case"floor":o=t.pop();t.push(Math.floor(o));break;case"ge":c=t.pop();o=t.pop();t.push(o>=c);break;case"gt":c=t.pop();o=t.pop();t.push(o>c);break;case"idiv":c=t.pop();o=t.pop();t.push(o/c|0);break;case"index":o=t.pop();t.index(o);break;case"le":c=t.pop();o=t.pop();t.push(o<=c);break;case"ln":o=t.pop();t.push(Math.log(o));break;case"log":o=t.pop();t.push(Math.log(o)/Math.LN10);break;case"lt":c=t.pop();o=t.pop();t.push(o=t?new AstLiteral(t):e.max<=t?e:new AstMin(e,t)}class PostScriptCompiler{compile(e,t,a){const r=[],n=[],i=t.length>>1,s=a.length>>1;let o,c,l,h,u,d,f,g,p=0;for(let e=0;et.min){o.unshift("Math.max(",i,", ");o.push(")")}if(s{Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptParser=t.PostScriptLexer=void 0;var r=a(2),n=a(5),i=a(6);t.PostScriptParser=class PostScriptParser{constructor(e){this.lexer=e;this.operators=[];this.token=null;this.prev=null}nextToken(){this.prev=this.token;this.token=this.lexer.getToken()}accept(e){if(this.token.type===e){this.nextToken();return!0}return!1}expect(e){if(this.accept(e))return!0;throw new r.FormatError(`Unexpected symbol: found ${this.token.type} expected ${e}.`)}parse(){this.nextToken();this.expect(s.LBRACE);this.parseBlock();this.expect(s.RBRACE);return this.operators}parseBlock(){for(;;)if(this.accept(s.NUMBER))this.operators.push(this.prev.value);else if(this.accept(s.OPERATOR))this.operators.push(this.prev.value);else{if(!this.accept(s.LBRACE))return;this.parseCondition()}}parseCondition(){const e=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(s.RBRACE);if(this.accept(s.IF)){this.operators[e]=this.operators.length;this.operators[e+1]="jz"}else{if(!this.accept(s.LBRACE))throw new r.FormatError("PS Function: error parsing conditional.");{const t=this.operators.length;this.operators.push(null,null);const a=this.operators.length;this.parseBlock();this.expect(s.RBRACE);this.expect(s.IFELSE);this.operators[t]=this.operators.length;this.operators[t+1]="j";this.operators[e]=a;this.operators[e+1]="jz"}}}};const s={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5};class PostScriptToken{static get opCache(){return(0,r.shadow)(this,"opCache",Object.create(null))}constructor(e,t){this.type=e;this.value=t}static getOperator(e){const t=PostScriptToken.opCache[e];return t||(PostScriptToken.opCache[e]=new PostScriptToken(s.OPERATOR,e))}static get LBRACE(){return(0,r.shadow)(this,"LBRACE",new PostScriptToken(s.LBRACE,"{"))}static get RBRACE(){return(0,r.shadow)(this,"RBRACE",new PostScriptToken(s.RBRACE,"}"))}static get IF(){return(0,r.shadow)(this,"IF",new PostScriptToken(s.IF,"IF"))}static get IFELSE(){return(0,r.shadow)(this,"IFELSE",new PostScriptToken(s.IFELSE,"IFELSE"))}}t.PostScriptLexer=class PostScriptLexer{constructor(e){this.stream=e;this.nextChar();this.strBuf=[]}nextChar(){return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(t<0)return n.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,i.isWhiteSpace)(t))break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new PostScriptToken(s.NUMBER,this.getNumber());case 123:this.nextChar();return PostScriptToken.LBRACE;case 125:this.nextChar();return PostScriptToken.RBRACE}const a=this.strBuf;a.length=0;a[0]=String.fromCharCode(t);for(;(t=this.nextChar())>=0&&(t>=65&&t<=90||t>=97&&t<=122);)a.push(String.fromCharCode(t));const r=a.join("");switch(r.toLowerCase()){case"if":return PostScriptToken.IF;case"ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(r)}}getNumber(){let e=this.currentChar;const t=this.strBuf;t.length=0;t[0]=String.fromCharCode(e);for(;(e=this.nextChar())>=0&&(e>=48&&e<=57||45===e||46===e);)t.push(String.fromCharCode(e));const a=parseFloat(t.join(""));if(isNaN(a))throw new r.FormatError(`Invalid floating point number: ${a}`);return a}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LocalTilingPatternCache=t.LocalImageCache=t.LocalGStateCache=t.LocalFunctionCache=t.LocalColorSpaceCache=t.GlobalImageCache=void 0;var r=a(2),n=a(5);class BaseLocalCache{constructor(e){this.constructor===BaseLocalCache&&(0,r.unreachable)("Cannot initialize BaseLocalCache.");this._onlyRefs=!0===(e&&e.onlyRefs);if(!this._onlyRefs){this._nameRefMap=new Map;this._imageMap=new Map}this._imageCache=new n.RefSetCache}getByName(e){this._onlyRefs&&(0,r.unreachable)("Should not call `getByName` method.");const t=this._nameRefMap.get(e);return t?this.getByRef(t):this._imageMap.get(e)||null}getByRef(e){return this._imageCache.get(e)||null}set(e,t,a){(0,r.unreachable)("Abstract method `set` called.")}}t.LocalImageCache=class LocalImageCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalImageCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalColorSpaceCache=class LocalColorSpaceCache extends BaseLocalCache{set(e=null,t=null,a){if("string"!=typeof e&&!t)throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');if(t){if(this._imageCache.has(t))return;null!==e&&this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalFunctionCache=class LocalFunctionCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalFunctionCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}};t.LocalGStateCache=class LocalGStateCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalGStateCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalTilingPatternCache=class LocalTilingPatternCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}};class GlobalImageCache{static get NUM_PAGES_THRESHOLD(){return(0,r.shadow)(this,"NUM_PAGES_THRESHOLD",2)}static get MIN_IMAGES_TO_CACHE(){return(0,r.shadow)(this,"MIN_IMAGES_TO_CACHE",10)}static get MAX_BYTE_SIZE(){return(0,r.shadow)(this,"MAX_BYTE_SIZE",4e7)}constructor(){this._refCache=new n.RefSetCache;this._imageCache=new n.RefSetCache}get _byteSize(){let e=0;for(const t of this._imageCache)e+=t.byteSize;return e}get _cacheLimitReached(){return!(this._imageCache.size{Object.defineProperty(t,"__esModule",{value:!0});t.bidi=function bidi(e,t=-1,a=!1){let c=!0;const l=e.length;if(0===l||a)return createBidiText(e,c,a);s.length=l;o.length=l;let h,u,d=0;for(h=0;h4){c=!0;t=0}else{c=!1;t=1}const f=[];for(h=0;h=0&&"ET"===o[e];--e)o[e]="EN";for(let e=h+1;e0&&(t=o[h-1]);let a=m;e+1w&&isOdd(w)&&(x=w)}for(w=S;w>=x;--w){let e=-1;for(h=0,u=f.length;h=0){reverseValues(s,e,h);e=-1}}else e<0&&(e=h);e>=0&&reverseValues(s,e,f.length)}for(h=0,u=s.length;h"!==e||(s[h]="")}return createBidiText(s.join(""),c)};var r=a(2);const n=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","BN","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"],i=["AN","AN","AN","AN","AN","AN","ON","ON","AL","ET","ET","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","AL","AL","AL","AL","AL","AL"];function isOdd(e){return 0!=(1&e)}function isEven(e){return 0==(1&e)}function findUnequal(e,t,a){let r,n;for(r=t,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.MurmurHash3_64=void 0;var r=a(2);const n=3285377520,i=4294901760,s=65535;t.MurmurHash3_64=class MurmurHash3_64{constructor(e){this.h1=e?4294967295&e:n;this.h2=e?4294967295&e:n}update(e){let t,a;if("string"==typeof e){t=new Uint8Array(2*e.length);a=0;for(let r=0,n=e.length;r>>8;t[a++]=255&n}}}else{if(!(0,r.isArrayBuffer)(e))throw new Error("Wrong data format in MurmurHash3_64_update. Input must be a string or array.");t=e.slice();a=t.byteLength}const n=a>>2,o=a-4*n,c=new Uint32Array(t.buffer,0,n);let l=0,h=0,u=this.h1,d=this.h2;const f=3432918353,g=461845907,p=11601,m=13715;for(let e=0;e>>17;l=l*g&i|l*m&s;u^=l;u=u<<13|u>>>19;u=5*u+3864292196}else{h=c[e];h=h*f&i|h*p&s;h=h<<15|h>>>17;h=h*g&i|h*m&s;d^=h;d=d<<13|d>>>19;d=5*d+3864292196}l=0;switch(o){case 3:l^=t[4*n+2]<<16;case 2:l^=t[4*n+1]<<8;case 1:l^=t[4*n];l=l*f&i|l*p&s;l=l<<15|l>>>17;l=l*g&i|l*m&s;1&n?u^=l:d^=l}this.h1=u;this.h2=d}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&i|36045*e&s;t=4283543511*t&i|(2950163797*(t<<16|e>>>16)&i)>>>16;e^=t>>>1;e=444984403*e&i|60499*e&s;t=3301882366*t&i|(3120437893*(t<<16|e>>>16)&i)>>>16;e^=t>>>1;const a=(e>>>0).toString(16),r=(t>>>0).toString(16);return a.padStart(8,"0")+r.padStart(8,"0")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.OperatorList=void 0;var r=a(2);function addState(e,t,a,r,n){let i=e;for(let e=0,a=t.length-1;e1e3){h=Math.max(h,f);g+=d+2;f=0;d=0}u.push({transform:t,x:f,y:g,w:a.width,h:a.height});f+=a.width+2;d=Math.max(d,a.height)}const p=Math.max(h,f)+1,m=g+d+1,b=new Uint8Array(p*m*4),y=p<<2;for(let e=0;e=0;){t[i-4]=t[i];t[i-3]=t[i+1];t[i-2]=t[i+2];t[i-1]=t[i+3];t[i+a]=t[i+a-4];t[i+a+1]=t[i+a-3];t[i+a+2]=t[i+a-2];t[i+a+3]=t[i+a-1];i-=y}}a.splice(s,4*l,r.OPS.paintInlineImageXObjectGroup);n.splice(s,4*l,[{width:p,height:m,kind:r.ImageKind.RGBA_32BPP,data:b},u]);return s+1}));addState(n,[r.OPS.save,r.OPS.transform,r.OPS.paintImageMaskXObject,r.OPS.restore],null,(function iterateImageMaskGroup(e,t){const a=e.fnArray,n=(t-(e.iCurr-3))%4;switch(n){case 0:return a[t]===r.OPS.save;case 1:return a[t]===r.OPS.transform;case 2:return a[t]===r.OPS.paintImageMaskXObject;case 3:return a[t]===r.OPS.restore}throw new Error(`iterateImageMaskGroup - invalid pos: ${n}`)}),(function foundImageMaskGroup(e,t){const a=e.fnArray,n=e.argsArray,i=e.iCurr,s=i-3,o=i-2,c=i-1;let l=Math.floor((t-s)/4);if(l<10)return t-(t-s)%4;let h,u,d=!1;const f=n[c][0],g=n[o][0],p=n[o][1],m=n[o][2],b=n[o][3];if(p===m){d=!0;h=o+4;let e=c+4;for(let t=1;t=4&&a[i-4]===a[s]&&a[i-3]===a[o]&&a[i-2]===a[c]&&a[i-1]===a[l]&&r[i-4][0]===h&&r[i-4][1]===u){d++;f-=5}let g=f+4;for(let e=1;e=a)break}r=(r||n)[e[t]];if(r&&!Array.isArray(r)){s.iCurr=t;t++;if(!r.checkFn||(0,r.checkFn)(s)){i=r;r=null}else r=null}else t++}this.state=r;this.match=i;this.lastProcessed=t}flush(){for(;this.match;){const e=this.queue.fnArray.length;this.lastProcessed=(0,this.match.processFn)(this.context,e);this.match=null;this.state=null;this._optimize()}}reset(){this.state=null;this.match=null;this.lastProcessed=0}}class OperatorList{static get CHUNK_SIZE(){return(0,r.shadow)(this,"CHUNK_SIZE",1e3)}static get CHUNK_SIZE_ABOUT(){return(0,r.shadow)(this,"CHUNK_SIZE_ABOUT",this.CHUNK_SIZE-5)}constructor(e=0,t){this._streamSink=t;this.fnArray=[];this.argsArray=[];!t||e&r.RenderingIntentFlag.OPLIST?this.optimizer=new NullOptimizer(this):this.optimizer=new QueueOptimizer(this);this.dependencies=new Set;this._totalLength=0;this.weight=0;this._resolved=t?null:Promise.resolve()}get length(){return this.argsArray.length}get ready(){return this._resolved||this._streamSink.ready}get totalLength(){return this._totalLength+this.length}addOp(e,t){this.optimizer.push(e,t);this.weight++;this._streamSink&&(this.weight>=OperatorList.CHUNK_SIZE||this.weight>=OperatorList.CHUNK_SIZE_ABOUT&&(e===r.OPS.restore||e===r.OPS.endText))&&this.flush()}addImageOps(e,t,a){void 0!==a&&this.addOp(r.OPS.beginMarkedContentProps,["OC",a]);this.addOp(e,t);void 0!==a&&this.addOp(r.OPS.endMarkedContent,[])}addDependency(e){if(!this.dependencies.has(e)){this.dependencies.add(e);this.addOp(r.OPS.dependency,[e])}}addDependencies(e){for(const t of e)this.addDependency(t)}addOpList(e){if(e instanceof OperatorList){for(const t of e.dependencies)this.dependencies.add(t);for(let t=0,a=e.length;t{Object.defineProperty(t,"__esModule",{value:!0});t.PDFImage=void 0;var r=a(2),n=a(64),i=a(7),s=a(14),o=a(19),c=a(27),l=a(30),h=a(5);function decodeAndClamp(e,t,a,r){(e=t+e*a)<0?e=0:e>r&&(e=r);return e}function resizeImageMask(e,t,a,r,n,i){const s=n*i;let o;o=t<=8?new Uint8Array(s):t<=16?new Uint16Array(s):new Uint32Array(s);const c=a/n,l=r/i;let h,u,d,f,g=0;const p=new Uint16Array(n),m=a;for(h=0;h0&&Number.isInteger(a.height)&&a.height>0&&(a.width!==b||a.height!==y)){(0,r.warn)("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");b=a.width;y=a.height}if(b<1||y<1)throw new r.FormatError(`Invalid image width: ${b} or height: ${y}`);this.width=b;this.height=y;this.interpolate=g.get("I","Interpolate");this.imageMask=g.get("IM","ImageMask")||!1;this.matte=g.get("Matte")||!1;let w=a.bitsPerComponent;if(!w){w=g.get("BPC","BitsPerComponent");if(!w){if(!this.imageMask)throw new r.FormatError(`Bits per component missing in image: ${this.imageMask}`);w=1}}this.bpc=w;if(!this.imageMask){let i=g.getRaw("CS")||g.getRaw("ColorSpace");if(!i){(0,r.info)("JPX images (which do not require color spaces)");switch(a.numComps){case 1:i=h.Name.get("DeviceGray");break;case 3:i=h.Name.get("DeviceRGB");break;case 4:i=h.Name.get("DeviceCMYK");break;default:throw new Error(`JPX images with ${a.numComps} color components not supported.`)}}this.colorSpace=s.ColorSpace.parse({cs:i,xref:e,resources:n?t:null,pdfFunctionFactory:d,localColorSpaceCache:f});this.numComps=this.colorSpace.numComps}this.decode=g.getArray("D","Decode");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode,w)||u&&!s.ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<>3)*a,o=e.byteLength;let c,l;if(!r||n&&!(s===o))if(n){c=new Uint8Array(s);c.set(e);c.fill(255,o)}else c=new Uint8Array(e);else c=e;if(n)for(l=0;l>7&1;s[d+1]=u>>6&1;s[d+2]=u>>5&1;s[d+3]=u>>4&1;s[d+4]=u>>3&1;s[d+5]=u>>2&1;s[d+6]=u>>1&1;s[d+7]=1&u;d+=8}if(d>=1}}}}else{let a=0;u=0;for(d=0,h=i;d>r;n<0?n=0:n>l&&(n=l);s[d]=n;u&=(1<o[r+1]){t=255;break}}c[u]=t}}}if(c)for(u=0,f=3,d=t*n;u>3;if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===l?e=r.ImageKind.GRAYSCALE_1BPP:"DeviceRGB"!==this.colorSpace.name||8!==l||this.needsDecode||(e=r.ImageKind.RGB_24BPP);if(e&&!this.smask&&!this.mask&&t===s&&a===o){n.kind=e;n.data=this.getImageBytes(o*h,{});if(this.needsDecode){(0,r.assert)(e===r.ImageKind.GRAYSCALE_1BPP,"PDFImage.createImageData: The image must be grayscale.");const t=n.data;for(let e=0,a=t.length;e>3,o=this.getImageBytes(n*s,{internal:!0}),c=this.getComponents(o);let l,h;if(1===i){h=a*n;if(this.needsDecode)for(l=0;l{Object.defineProperty(t,"__esModule",{value:!0});t.applyMaskImageData=function applyMaskImageData({src:e,srcPos:t=0,dest:a,destPos:n=0,width:i,height:s,inverseDecode:o=!1}){const c=r.FeatureTest.isLittleEndian?4278190080:255,[l,h]=o?[0,c]:[c,0],u=i>>3,d=7&i,f=e.length;a=new Uint32Array(a.buffer);for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});t.incrementalUpdate=function incrementalUpdate({originalData:e,xrefInfo:t,newRefs:a,xref:o=null,hasXfa:l=!1,xfaDatasetsRef:h=null,hasXfaDatasetsEntry:u=!1,acroFormRef:d=null,acroForm:f=null,xfaData:g=null}){l&&function updateXFA({xfaData:e,xfaDatasetsRef:t,hasXfaDatasetsEntry:a,acroFormRef:n,acroForm:o,newRefs:c,xref:l,xrefInfo:h}){if(null===l)return;if(!a){if(!n){(0,r.warn)("XFA - Cannot save it");return}const e=o.get("XFA"),a=e.slice();a.splice(2,0,"datasets");a.splice(3,0,t);o.set("XFA",a);const i=l.encrypt;let s=null;i&&(s=i.createCipherTransform(n.num,n.gen));const h=[`${n.num} ${n.gen} obj\n`];writeDict(o,h,s);h.push("\n");o.set("XFA",e);c.push({ref:n,data:h.join("")})}if(null===e){e=function writeXFADataForAcroform(e,t){const a=new s.SimpleXMLParser({hasAttributes:!0}).parseFromString(e);for(const{xfa:e}of t){if(!e)continue;const{path:t,value:n}=e;if(!t)continue;const o=a.documentElement.searchNode((0,i.parseXFAPath)(t),0);o?Array.isArray(n)?o.childNodes=n.map((e=>new s.SimpleDOMNode("value",e))):o.childNodes=[new s.SimpleDOMNode("#text",n)]:(0,r.warn)(`Node not found for path: ${t}`)}const n=[];a.documentElement.dump(n);return n.join("")}(l.fetchIfRef(t).getString(),c)}const u=l.encrypt;if(u){e=u.createCipherTransform(t.num,t.gen).encryptString(e)}const d=`${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n`+e+"\nendstream\nendobj\n";c.push({ref:t,data:d})}({xfaData:g,xfaDatasetsRef:h,hasXfaDatasetsEntry:u,acroFormRef:d,acroForm:f,newRefs:a,xref:o,xrefInfo:t});const p=new n.Dict(null),m=t.newRef;let b,y;const w=e.at(-1);if(10===w||13===w){b=[];y=e.length}else{b=["\n"];y=e.length+1}p.set("Size",m.num+1);p.set("Prev",t.startXRef);p.set("Type",n.Name.get("XRef"));null!==t.rootRef&&p.set("Root",t.rootRef);null!==t.infoRef&&p.set("Info",t.infoRef);null!==t.encryptRef&&p.set("Encrypt",t.encryptRef);a.push({ref:m,data:""});a=a.sort(((e,t)=>e.ref.num-t.ref.num));const S=[[0,1,65535]],x=[0,1];let k=0;for(const{ref:e,data:t}of a){k=Math.max(k,y);S.push([1,y,Math.min(e.gen,65535)]);y+=t.length;x.push(e.num,1);b.push(t)}p.set("Index",x);if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const e=function computeMD5(e,t){const a=Math.floor(Date.now()/1e3),n=t.filename||"",i=[a.toString(),n,e.toString()];let s=i.reduce(((e,t)=>e+t.length),0);for(const e of Object.values(t.info)){i.push(e);s+=e.length}const o=new Uint8Array(s);let l=0;for(const e of i){writeString(e,l,o);l+=e.length}return(0,r.bytesToString)((0,c.calculateMD5)(o))}(y,t);p.set("ID",[t.fileIds[0],e])}const C=[1,Math.ceil(Math.log2(k)/8),2],v=(C[0]+C[1]+C[2])*S.length;p.set("W",C);p.set("Length",v);b.push(`${m.num} ${m.gen} obj\n`);writeDict(p,b,null);b.push(" stream\n");const F=b.reduce(((e,t)=>e+t.length),0),O=`\nendstream\nendobj\nstartxref\n${y}\n%%EOF\n`,T=new Uint8Array(e.length+F+v+O.length);T.set(e);let M=e.length;for(const e of b){writeString(e,M,T);M+=e.length}for(const[e,t,a]of S){M=writeInt(e,C[0],M,T);M=writeInt(t,C[1],M,T);M=writeInt(a,C[2],M,T)}writeString(O,M,T);return T};t.writeDict=writeDict;t.writeObject=function writeObject(e,t,a,r){a.push(`${e.num} ${e.gen} obj\n`);t instanceof n.Dict?writeDict(t,a,r):t instanceof o.BaseStream&&writeStream(t,a,r);a.push("\nendobj\n")};var r=a(2),n=a(5),i=a(6),s=a(66),o=a(7),c=a(67);function writeDict(e,t,a){t.push("<<");for(const r of e.getKeys()){t.push(` /${(0,i.escapePDFName)(r)} `);writeValue(e.getRaw(r),t,a)}t.push(">>")}function writeStream(e,t,a){writeDict(e.dict,t,a);t.push(" stream\n");let r=e.getString();null!==a&&(r=a.encryptString(r));t.push(r,"\nendstream\n")}function writeValue(e,t,a){if(e instanceof n.Name)t.push(`/${(0,i.escapePDFName)(e.name)}`);else if(e instanceof n.Ref)t.push(`${e.num} ${e.gen} R`);else if(Array.isArray(e))!function writeArray(e,t,a){t.push("[");let r=!0;for(const n of e){r?r=!1:t.push(" ");writeValue(n,t,a)}t.push("]")}(e,t,a);else if("string"==typeof e){null!==a&&(e=a.encryptString(e));t.push(`(${(0,r.escapeString)(e)})`)}else"number"==typeof e?t.push((0,i.numberToString)(e)):"boolean"==typeof e?t.push(e.toString()):e instanceof n.Dict?writeDict(e,t,a):e instanceof o.BaseStream?writeStream(e,t,a):null===e?t.push("null"):(0,r.warn)(`Unhandled value in writer: ${typeof e}, please file a bug.`)}function writeInt(e,t,a,r){for(let n=t+a-1;n>a-1;n--){r[n]=255&e;e>>=8}return a+t}function writeString(e,t,a){for(let r=0,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.XMLParserErrorCode=t.XMLParserBase=t.SimpleXMLParser=t.SimpleDOMNode=void 0;var r=a(6);const n={NoError:0,EndOfDocument:-1,UnterminatedCdat:-2,UnterminatedXmlDeclaration:-3,UnterminatedDoctypeDeclaration:-4,UnterminatedComment:-5,MalformedElement:-6,OutOfMemory:-7,UnterminatedAttributeValue:-8,UnterminatedElement:-9,ElementNeverBegun:-10};t.XMLParserErrorCode=n;function isWhitespace(e,t){const a=e[t];return" "===a||"\n"===a||"\r"===a||"\t"===a}class XMLParserBase{_resolveEntities(e){return e.replace(/&([^;]+);/g,((e,t)=>{if("#x"===t.substring(0,2))return String.fromCodePoint(parseInt(t.substring(2),16));if("#"===t.substring(0,1))return String.fromCodePoint(parseInt(t.substring(1),10));switch(t){case"lt":return"<";case"gt":return">";case"amp":return"&";case"quot":return'"';case"apos":return"'"}return this.onResolveEntity(t)}))}_parseContent(e,t){const a=[];let r=t;function skipWs(){for(;r"!==e[r]&&"/"!==e[r];)++r;const n=e.substring(t,r);skipWs();for(;r"!==e[r]&&"/"!==e[r]&&"?"!==e[r];){skipWs();let t="",n="";for(;r"!==e[a]&&"?"!==e[a]&&"/"!==e[a];)++a;const r=e.substring(t,a);!function skipWs(){for(;a"!==e[a+1]);)++a;return{name:r,value:e.substring(n,a),parsed:a-t}}parseXml(e){let t=0;for(;t",a);if(t<0){this.onError(n.UnterminatedElement);return}this.onEndElement(e.substring(a,t));a=t+1;break;case"?":++a;const r=this._parseProcessingInstruction(e,a);if("?>"!==e.substring(a+r.parsed,a+r.parsed+2)){this.onError(n.UnterminatedXmlDeclaration);return}this.onPi(r.name,r.value);a+=r.parsed+2;break;case"!":if("--"===e.substring(a+1,a+3)){t=e.indexOf("--\x3e",a+3);if(t<0){this.onError(n.UnterminatedComment);return}this.onComment(e.substring(a+3,t));a=t+3}else if("[CDATA["===e.substring(a+1,a+8)){t=e.indexOf("]]>",a+8);if(t<0){this.onError(n.UnterminatedCdat);return}this.onCdata(e.substring(a+8,t));a=t+3}else{if("DOCTYPE"!==e.substring(a+1,a+8)){this.onError(n.MalformedElement);return}{const r=e.indexOf("[",a+8);let i=!1;t=e.indexOf(">",a+8);if(t<0){this.onError(n.UnterminatedDoctypeDeclaration);return}if(r>0&&t>r){t=e.indexOf("]>",a+8);if(t<0){this.onError(n.UnterminatedDoctypeDeclaration);return}i=!0}const s=e.substring(a+8,t+(i?1:0));this.onDoctype(s);a=t+(i?2:1)}}break;default:const i=this._parseContent(e,a);if(null===i){this.onError(n.MalformedElement);return}let s=!1;if("/>"===e.substring(a+i.parsed,a+i.parsed+2))s=!0;else if(">"!==e.substring(a+i.parsed,a+i.parsed+1)){this.onError(n.UnterminatedElement);return}this.onBeginElement(i.name,i.attributes,s);a+=i.parsed+(s?2:1)}}else{for(;a0}searchNode(e,t){if(t>=e.length)return this;const a=e[t],r=[];let n=this;for(;;){if(a.name===n.nodeName){if(0!==a.pos){if(0===r.length)return null;{const[i]=r.pop();let s=0;for(const r of i.childNodes)if(a.name===r.nodeName){if(s===a.pos)return r.searchNode(e,t+1);s++}return n.searchNode(e,t+1)}}{const a=n.searchNode(e,t+1);if(null!==a)return a}}if(n.childNodes&&0!==n.childNodes.length){r.push([n,0]);n=n.childNodes[0]}else{if(0===r.length)return null;for(;0!==r.length;){const[e,t]=r.pop(),a=t+1;if(a");for(const t of this.childNodes)t.dump(e);e.push(``)}else this.nodeValue?e.push(`>${(0,r.encodeToXmlString)(this.nodeValue)}`):e.push("/>")}else e.push((0,r.encodeToXmlString)(this.nodeValue))}}t.SimpleDOMNode=SimpleDOMNode;t.SimpleXMLParser=class SimpleXMLParser extends XMLParserBase{constructor({hasAttributes:e=!1,lowerCaseName:t=!1}){super();this._currentFragment=null;this._stack=null;this._errorCode=n.NoError;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=n.NoError;this.parseXml(e);if(this._errorCode!==n.NoError)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onText(e){if(function isWhitespaceString(e){for(let t=0,a=e.length;t{Object.defineProperty(t,"__esModule",{value:!0});t.calculateSHA256=t.calculateMD5=t.PDF20=t.PDF17=t.CipherTransformFactory=t.ARCFourCipher=t.AES256Cipher=t.AES128Cipher=void 0;t.calculateSHA384=calculateSHA384;t.calculateSHA512=void 0;var r=a(2),n=a(5),i=a(68);class ARCFourCipher{constructor(e){this.a=0;this.b=0;const t=new Uint8Array(256),a=e.length;for(let e=0;e<256;++e)t[e]=e;for(let r=0,n=0;r<256;++r){const i=t[r];n=n+i+e[r%a]&255;t[r]=t[n];t[n]=i}this.s=t}encryptBlock(e){let t=this.a,a=this.b;const r=this.s,n=e.length,i=new Uint8Array(n);for(let s=0;s>5&255;h[u++]=n>>13&255;h[u++]=n>>21&255;h[u++]=n>>>29&255;h[u++]=0;h[u++]=0;h[u++]=0;const g=new Int32Array(16);for(u=0;u>>32-o)|0;n=i}i=i+n|0;s=s+l|0;o=o+f|0;c=c+p|0}return new Uint8Array([255&i,i>>8&255,i>>16&255,i>>>24&255,255&s,s>>8&255,s>>16&255,s>>>24&255,255&o,o>>8&255,o>>16&255,o>>>24&255,255&c,c>>8&255,c>>16&255,c>>>24&255])}}();t.calculateMD5=s;class Word64{constructor(e,t){this.high=0|e;this.low=0|t}and(e){this.high&=e.high;this.low&=e.low}xor(e){this.high^=e.high;this.low^=e.low}or(e){this.high|=e.high;this.low|=e.low}shiftRight(e){if(e>=32){this.low=this.high>>>e-32|0;this.high=0}else{this.low=this.low>>>e|this.high<<32-e;this.high=this.high>>>e|0}}shiftLeft(e){if(e>=32){this.high=this.low<>>32-e;this.low<<=e}}rotateRight(e){let t,a;if(32&e){a=this.low;t=this.high}else{t=this.low;a=this.high}e&=31;this.low=t>>>e|a<<32-e;this.high=a>>>e|t<<32-e}not(){this.high=~this.high;this.low=~this.low}add(e){const t=(this.low>>>0)+(e.low>>>0);let a=(this.high>>>0)+(e.high>>>0);t>4294967295&&(a+=1);this.low=0|t;this.high=0|a}copyTo(e,t){e[t]=this.high>>>24&255;e[t+1]=this.high>>16&255;e[t+2]=this.high>>8&255;e[t+3]=255&this.high;e[t+4]=this.low>>>24&255;e[t+5]=this.low>>16&255;e[t+6]=this.low>>8&255;e[t+7]=255&this.low}assign(e){this.high=e.high;this.low=e.low}}const o=function calculateSHA256Closure(){function rotr(e,t){return e>>>t|e<<32-t}function ch(e,t,a){return e&t^~e&a}function maj(e,t,a){return e&t^e&a^t&a}function sigma(e){return rotr(e,2)^rotr(e,13)^rotr(e,22)}function sigmaPrime(e){return rotr(e,6)^rotr(e,11)^rotr(e,25)}function littleSigma(e){return rotr(e,7)^rotr(e,18)^e>>>3}const e=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];return function hash(t,a,r){let n=1779033703,i=3144134277,s=1013904242,o=2773480762,c=1359893119,l=2600822924,h=528734635,u=1541459225;const d=64*Math.ceil((r+9)/64),f=new Uint8Array(d);let g,p;for(g=0;g>>29&255;f[g++]=r>>21&255;f[g++]=r>>13&255;f[g++]=r>>5&255;f[g++]=r<<3&255;const b=new Uint32Array(64);for(g=0;g>>10)+b[p-7]+littleSigma(b[p-15])+b[p-16]|0;let t,a,r=n,d=i,m=s,w=o,S=c,x=l,k=h,C=u;for(p=0;p<64;++p){t=C+sigmaPrime(S)+ch(S,x,k)+e[p]+b[p];a=sigma(r)+maj(r,d,m);C=k;k=x;x=S;S=w+t|0;w=m;m=d;d=r;r=t+a|0}n=n+r|0;i=i+d|0;s=s+m|0;o=o+w|0;c=c+S|0;l=l+x|0;h=h+k|0;u=u+C|0}var y;return new Uint8Array([n>>24&255,n>>16&255,n>>8&255,255&n,i>>24&255,i>>16&255,i>>8&255,255&i,s>>24&255,s>>16&255,s>>8&255,255&s,o>>24&255,o>>16&255,o>>8&255,255&o,c>>24&255,c>>16&255,c>>8&255,255&c,l>>24&255,l>>16&255,l>>8&255,255&l,h>>24&255,h>>16&255,h>>8&255,255&h,u>>24&255,u>>16&255,u>>8&255,255&u])}}();t.calculateSHA256=o;const c=function calculateSHA512Closure(){function ch(e,t,a,r,n){e.assign(t);e.and(a);n.assign(t);n.not();n.and(r);e.xor(n)}function maj(e,t,a,r,n){e.assign(t);e.and(a);n.assign(t);n.and(r);e.xor(n);n.assign(a);n.and(r);e.xor(n)}function sigma(e,t,a){e.assign(t);e.rotateRight(28);a.assign(t);a.rotateRight(34);e.xor(a);a.assign(t);a.rotateRight(39);e.xor(a)}function sigmaPrime(e,t,a){e.assign(t);e.rotateRight(14);a.assign(t);a.rotateRight(18);e.xor(a);a.assign(t);a.rotateRight(41);e.xor(a)}function littleSigma(e,t,a){e.assign(t);e.rotateRight(1);a.assign(t);a.rotateRight(8);e.xor(a);a.assign(t);a.shiftRight(7);e.xor(a)}function littleSigmaPrime(e,t,a){e.assign(t);e.rotateRight(19);a.assign(t);a.rotateRight(61);e.xor(a);a.assign(t);a.shiftRight(6);e.xor(a)}const e=[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)];return function hash(t,a,r,n=!1){let i,s,o,c,l,h,u,d;if(n){i=new Word64(3418070365,3238371032);s=new Word64(1654270250,914150663);o=new Word64(2438529370,812702999);c=new Word64(355462360,4144912697);l=new Word64(1731405415,4290775857);h=new Word64(2394180231,1750603025);u=new Word64(3675008525,1694076839);d=new Word64(1203062813,3204075428)}else{i=new Word64(1779033703,4089235720);s=new Word64(3144134277,2227873595);o=new Word64(1013904242,4271175723);c=new Word64(2773480762,1595750129);l=new Word64(1359893119,2917565137);h=new Word64(2600822924,725511199);u=new Word64(528734635,4215389547);d=new Word64(1541459225,327033209)}const f=128*Math.ceil((r+17)/128),g=new Uint8Array(f);let p,m;for(p=0;p>>29&255;g[p++]=r>>21&255;g[p++]=r>>13&255;g[p++]=r>>5&255;g[p++]=r<<3&255;const y=new Array(80);for(p=0;p<80;p++)y[p]=new Word64(0,0);let w=new Word64(0,0),S=new Word64(0,0),x=new Word64(0,0),k=new Word64(0,0),C=new Word64(0,0),v=new Word64(0,0),F=new Word64(0,0),O=new Word64(0,0);const T=new Word64(0,0),M=new Word64(0,0),E=new Word64(0,0),D=new Word64(0,0);let N,R;for(p=0;p=1;--e){a=i[13];i[13]=i[9];i[9]=i[5];i[5]=i[1];i[1]=a;a=i[14];r=i[10];i[14]=i[6];i[10]=i[2];i[6]=a;i[2]=r;a=i[15];r=i[11];n=i[7];i[15]=i[3];i[11]=a;i[7]=r;i[3]=n;for(let e=0;e<16;++e)i[e]=this._inv_s[i[e]];for(let a=0,r=16*e;a<16;++a,++r)i[a]^=t[r];for(let e=0;e<16;e+=4){const t=this._mix[i[e]],r=this._mix[i[e+1]],n=this._mix[i[e+2]],s=this._mix[i[e+3]];a=t^r>>>8^r<<24^n>>>16^n<<16^s>>>24^s<<8;i[e]=a>>>24&255;i[e+1]=a>>16&255;i[e+2]=a>>8&255;i[e+3]=255&a}}a=i[13];i[13]=i[9];i[9]=i[5];i[5]=i[1];i[1]=a;a=i[14];r=i[10];i[14]=i[6];i[10]=i[2];i[6]=a;i[2]=r;a=i[15];r=i[11];n=i[7];i[15]=i[3];i[11]=a;i[7]=r;i[3]=n;for(let e=0;e<16;++e){i[e]=this._inv_s[i[e]];i[e]^=t[e]}return i}_encrypt(e,t){const a=this._s;let r,n,i;const s=new Uint8Array(16);s.set(e);for(let e=0;e<16;++e)s[e]^=t[e];for(let e=1;e=r;--a)if(e[a]!==t){t=0;break}o-=t;i[i.length-1]=e.subarray(0,16-t)}}const c=new Uint8Array(o);for(let e=0,t=0,a=i.length;e=256&&(o=255&(27^o))}for(let t=0;t<4;++t){a[e]=r^=a[e-32];e++;a[e]=n^=a[e-32];e++;a[e]=i^=a[e-32];e++;a[e]=s^=a[e-32];e++}}return a}}t.AES256Cipher=AES256Cipher;class PDF17{checkOwnerPassword(e,t,a,n){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const s=o(i,0,i.length);return(0,r.isArrayEqual)(s,n)}checkUserPassword(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);const i=o(n,0,n.length);return(0,r.isArrayEqual)(i,a)}getOwnerKey(e,t,a,r){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const i=o(n,0,n.length);return new AES256Cipher(i).decryptBlock(r,!1,new Uint8Array(16))}getUserKey(e,t,a){const r=new Uint8Array(e.length+8);r.set(e,0);r.set(t,e.length);const n=o(r,0,r.length);return new AES256Cipher(n).decryptBlock(a,!1,new Uint8Array(16))}}t.PDF17=PDF17;const l=function PDF20Closure(){function calculatePDF20Hash(e,t,a){let r=o(t,0,t.length).subarray(0,32),n=[0],i=0;for(;i<64||n.at(-1)>i-32;){const t=e.length+r.length+a.length,s=new Uint8Array(t);let l=0;s.set(e,l);l+=e.length;s.set(r,l);l+=r.length;s.set(a,l);const h=new Uint8Array(64*t);for(let e=0,a=0;e<64;e++,a+=t)h.set(s,a);n=new AES128Cipher(r.subarray(0,16)).encrypt(h,r.subarray(16,32));let u=0;for(let e=0;e<16;e++){u*=1;u%=3;u+=(n[e]>>>0)%3;u%=3}0===u?r=o(n,0,n.length):1===u?r=calculateSHA384(n,0,n.length):2===u&&(r=c(n,0,n.length));i++}return r.subarray(0,32)}return class PDF20{hash(e,t,a){return calculatePDF20Hash(e,t,a)}checkOwnerPassword(e,t,a,n){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const s=calculatePDF20Hash(e,i,a);return(0,r.isArrayEqual)(s,n)}checkUserPassword(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);const i=calculatePDF20Hash(e,n,[]);return(0,r.isArrayEqual)(i,a)}getOwnerKey(e,t,a,r){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const i=calculatePDF20Hash(e,n,a);return new AES256Cipher(i).decryptBlock(r,!1,new Uint8Array(16))}getUserKey(e,t,a){const r=new Uint8Array(e.length+8);r.set(e,0);r.set(t,e.length);const n=calculatePDF20Hash(e,r,[]);return new AES256Cipher(n).decryptBlock(a,!1,new Uint8Array(16))}}}();t.PDF20=l;class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const a=new this.StreamCipherConstructor;return new i.DecryptStream(e,t,(function cipherTransformDecryptStream(e,t){return a.decryptBlock(e,t)}))}decryptString(e){const t=new this.StringCipherConstructor;let a=(0,r.stringToBytes)(e);a=t.decryptBlock(a,!0);return(0,r.bytesToString)(a)}encryptString(e){const t=new this.StringCipherConstructor;if(t instanceof AESBaseCipher){const a=16-e.length%16;e+=String.fromCharCode(a).repeat(a);const n=new Uint8Array(16);if("undefined"!=typeof crypto)crypto.getRandomValues(n);else for(let e=0;e<16;e++)n[e]=Math.floor(256*Math.random());let i=(0,r.stringToBytes)(e);i=t.encrypt(i,n);const s=new Uint8Array(16+i.length);s.set(n);s.set(i,16);return(0,r.bytesToString)(s)}let a=(0,r.stringToBytes)(e);a=t.encrypt(a);return(0,r.bytesToString)(a)}}const h=function CipherTransformFactoryClosure(){const e=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]);function prepareKeyData(t,a,r,n,i,o,c,l){const h=40+r.length+t.length,u=new Uint8Array(h);let d,f,g=0;if(a){f=Math.min(32,a.length);for(;g>8&255;u[g++]=i>>16&255;u[g++]=i>>>24&255;for(d=0,f=t.length;d=4&&!l){u[g++]=255;u[g++]=255;u[g++]=255;u[g++]=255}let p=s(u,0,g);const m=c>>3;if(o>=3)for(d=0;d<50;++d)p=s(p,0,m);const b=p.subarray(0,m);let y,w;if(o>=3){for(g=0;g<32;++g)u[g]=e[g];for(d=0,f=t.length;d>8&255;n[o++]=e>>16&255;n[o++]=255&t;n[o++]=t>>8&255;if(r){n[o++]=115;n[o++]=65;n[o++]=108;n[o++]=84}return s(n,0,o).subarray(0,Math.min(a.length+5,16))}function buildCipherConstructor(e,t,a,i,s){if(!(t instanceof n.Name))throw new r.FormatError("Invalid crypt filter name.");const o=e.get(t.name);let c;null!=o&&(c=o.get("CFM"));if(!c||"None"===c.name)return function cipherTransformFactoryBuildCipherConstructorNone(){return new NullCipher};if("V2"===c.name)return function cipherTransformFactoryBuildCipherConstructorV2(){return new ARCFourCipher(buildObjectKey(a,i,s,!1))};if("AESV2"===c.name)return function cipherTransformFactoryBuildCipherConstructorAESV2(){return new AES128Cipher(buildObjectKey(a,i,s,!0))};if("AESV3"===c.name)return function cipherTransformFactoryBuildCipherConstructorAESV3(){return new AES256Cipher(s)};throw new r.FormatError("Unknown crypto method")}return class CipherTransformFactory{constructor(a,i,o){const c=a.get("Filter");if(!(0,n.isName)(c,"Standard"))throw new r.FormatError("unknown encryption method");this.filterName=c.name;this.dict=a;const h=a.get("V");if(!Number.isInteger(h)||1!==h&&2!==h&&4!==h&&5!==h)throw new r.FormatError("unsupported encryption algorithm");this.algorithm=h;let u=a.get("Length");if(!u)if(h<=3)u=40;else{const e=a.get("CF"),t=a.get("StmF");if(e instanceof n.Dict&&t instanceof n.Name){e.suppressEncryption=!0;const a=e.get(t.name);u=a&&a.get("Length")||128;u<40&&(u<<=3)}}if(!Number.isInteger(u)||u<40||u%8!=0)throw new r.FormatError("invalid key length");const d=(0,r.stringToBytes)(a.get("O")).subarray(0,32),f=(0,r.stringToBytes)(a.get("U")).subarray(0,32),g=a.get("P"),p=a.get("R"),m=(4===h||5===h)&&!1!==a.get("EncryptMetadata");this.encryptMetadata=m;const b=(0,r.stringToBytes)(i);let y,w;if(o){if(6===p)try{o=(0,r.utf8StringToString)(o)}catch(e){(0,r.warn)("CipherTransformFactory: Unable to convert UTF8 encoded password.")}y=(0,r.stringToBytes)(o)}if(5!==h)w=prepareKeyData(b,y,d,f,g,p,u,m);else{const e=(0,r.stringToBytes)(a.get("O")).subarray(32,40),t=(0,r.stringToBytes)(a.get("O")).subarray(40,48),n=(0,r.stringToBytes)(a.get("U")).subarray(0,48),i=(0,r.stringToBytes)(a.get("U")).subarray(32,40),s=(0,r.stringToBytes)(a.get("U")).subarray(40,48),o=(0,r.stringToBytes)(a.get("OE")),c=(0,r.stringToBytes)(a.get("UE"));(0,r.stringToBytes)(a.get("Perms"));w=function createEncryptionKey20(e,t,a,r,n,i,s,o,c,h,u,d){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];let f;f=6===e?new l:new PDF17;return f.checkUserPassword(t,o,s)?f.getUserKey(t,c,u):t.length&&f.checkOwnerPassword(t,r,i,a)?f.getOwnerKey(t,n,i,h):null}(p,y,d,e,t,n,f,i,s,o,c)}if(!w&&!o)throw new r.PasswordException("No password given",r.PasswordResponses.NEED_PASSWORD);if(!w&&o){const t=function decodeUserPassword(t,a,r,n){const i=new Uint8Array(32);let o=0;const c=Math.min(32,t.length);for(;o>3;if(r>=3)for(l=0;l<50;++l)h=s(h,0,h.length);let d,f;if(r>=3){f=a;const e=new Uint8Array(u);for(l=19;l>=0;l--){for(let t=0;t=4){const e=a.get("CF");e instanceof n.Dict&&(e.suppressEncryption=!0);this.cf=e;this.stmf=a.get("StmF")||t;this.strf=a.get("StrF")||t;this.eff=a.get("EFF")||this.stmf}}createCipherTransform(e,t){if(4===this.algorithm||5===this.algorithm)return new CipherTransform(buildCipherConstructor(this.cf,this.strf,e,t,this.encryptionKey),buildCipherConstructor(this.cf,this.stmf,e,t,this.encryptionKey));const a=buildObjectKey(e,t,this.encryptionKey,!1),r=function buildCipherCipherConstructor(){return new ARCFourCipher(a)};return new CipherTransform(r,r)}}}();t.CipherTransformFactory=h},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DecryptStream=void 0;var r=a(19);class DecryptStream extends r.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;this.decrypt=a;this.nextChunk=null;this.initialized=!1}readBlock(){let e;if(this.initialized)e=this.nextChunk;else{e=this.str.getBytes(512);this.initialized=!0}if(!e||0===e.length){this.eof=!0;return}this.nextChunk=this.str.getBytes(512);const t=this.nextChunk&&this.nextChunk.length>0;e=(0,this.decrypt)(e,!t);let a=this.bufferLength;const r=e.length,n=this.ensureBuffer(a+r);for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0});t.Catalog=void 0;var r=a(6),n=a(2),i=a(5),s=a(70),o=a(7),c=a(71),l=a(14),h=a(72),u=a(59),d=a(73),f=a(74);function fetchDestination(e){e instanceof i.Dict&&(e=e.get("D"));return Array.isArray(e)?e:null}class Catalog{constructor(e,t){this.pdfManager=e;this.xref=t;this._catDict=t.getCatalogObj();if(!(this._catDict instanceof i.Dict))throw new n.FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict;this._actualNumPages=null;this.fontCache=new i.RefSetCache;this.builtInCMapCache=new Map;this.standardFontDataCache=new Map;this.globalImageCache=new u.GlobalImageCache;this.pageKidsCountCache=new i.RefSetCache;this.pageIndexCache=new i.RefSetCache;this.nonBlendModesSet=new i.RefSet}get version(){const e=this._catDict.get("Version");return(0,n.shadow)(this,"version",e instanceof i.Name?e.name:null)}get lang(){const e=this._catDict.get("Lang");return(0,n.shadow)(this,"lang","string"==typeof e?(0,n.stringToPDFString)(e):null)}get needsRendering(){const e=this._catDict.get("NeedsRendering");return(0,n.shadow)(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this._catDict.get("Collection");t instanceof i.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)("Cannot fetch Collection entry; assuming no collection is present.")}return(0,n.shadow)(this,"collection",e)}get acroForm(){let e=null;try{const t=this._catDict.get("AcroForm");t instanceof i.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)("Cannot fetch AcroForm entry; assuming no forms are present.")}return(0,n.shadow)(this,"acroForm",e)}get acroFormRef(){const e=this._catDict.getRaw("AcroForm");return(0,n.shadow)(this,"acroFormRef",e instanceof i.Ref?e:null)}get metadata(){const e=this._catDict.getRaw("Metadata");if(!(e instanceof i.Ref))return(0,n.shadow)(this,"metadata",null);let t=null;try{const a=!(this.xref.encrypt&&this.xref.encrypt.encryptMetadata),r=this.xref.fetch(e,a);if(r instanceof o.BaseStream&&r.dict instanceof i.Dict){const e=r.dict.get("Type"),a=r.dict.get("Subtype");if((0,i.isName)(e,"Metadata")&&(0,i.isName)(a,"XML")){const e=(0,n.stringToUTF8String)(r.getString());e&&(t=new d.MetadataParser(e).serializable)}}}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)(`Skipping invalid Metadata: "${e}".`)}return(0,n.shadow)(this,"metadata",t)}get markInfo(){let e=null;try{e=this._readMarkInfo()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read mark info.")}return(0,n.shadow)(this,"markInfo",e)}_readMarkInfo(){const e=this._catDict.get("MarkInfo");if(!(e instanceof i.Dict))return null;const t={Marked:!1,UserProperties:!1,Suspects:!1};for(const a in t){const r=e.get(a);"boolean"==typeof r&&(t[a]=r)}return t}get structTreeRoot(){let e=null;try{e=this._readStructTreeRoot()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable read to structTreeRoot info.")}return(0,n.shadow)(this,"structTreeRoot",e)}_readStructTreeRoot(){const e=this._catDict.get("StructTreeRoot");if(!(e instanceof i.Dict))return null;const t=new f.StructTreeRoot(e);t.init();return t}get toplevelPagesDict(){const e=this._catDict.get("Pages");if(!(e instanceof i.Dict))throw new n.FormatError("Invalid top-level pages dictionary.");return(0,n.shadow)(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read document outline.")}return(0,n.shadow)(this,"documentOutline",e)}_readDocumentOutline(){let e=this._catDict.get("Outlines");if(!(e instanceof i.Dict))return null;e=e.getRaw("First");if(!(e instanceof i.Ref))return null;const t={items:[]},a=[{obj:e,parent:t}],r=new i.RefSet;r.put(e);const s=this.xref,o=new Uint8ClampedArray(3);for(;a.length>0;){const t=a.shift(),c=s.fetchIfRef(t.obj);if(null===c)continue;if(!c.has("Title"))throw new n.FormatError("Invalid outline item encountered.");const h={url:null,dest:null};Catalog.parseDestDictionary({destDict:c,resultObj:h,docBaseUrl:this.pdfManager.docBaseUrl});const u=c.get("Title"),d=c.get("F")||0,f=c.getArray("C"),g=c.get("Count");let p=o;!Array.isArray(f)||3!==f.length||0===f[0]&&0===f[1]&&0===f[2]||(p=l.ColorSpace.singletons.rgb.getRgb(f,0));const m={dest:h.dest,url:h.url,unsafeUrl:h.unsafeUrl,newWindow:h.newWindow,title:(0,n.stringToPDFString)(u),color:p,count:Number.isInteger(g)?g:void 0,bold:!!(2&d),italic:!!(1&d),items:[]};t.parent.items.push(m);e=c.getRaw("First");if(e instanceof i.Ref&&!r.has(e)){a.push({obj:e,parent:m});r.put(e)}e=c.getRaw("Next");if(e instanceof i.Ref&&!r.has(e)){a.push({obj:e,parent:t.parent});r.put(e)}}return t.items.length>0?t.items:null}get permissions(){let e=null;try{e=this._readPermissions()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read permissions.")}return(0,n.shadow)(this,"permissions",e)}_readPermissions(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof i.Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const a=[];for(const e in n.PermissionFlag){const r=n.PermissionFlag[e];t&r&&a.push(r)}return a}get optionalContentConfig(){let e=null;try{const t=this._catDict.get("OCProperties");if(!t)return(0,n.shadow)(this,"optionalContentConfig",null);const a=t.get("D");if(!a)return(0,n.shadow)(this,"optionalContentConfig",null);const r=t.get("OCGs");if(!Array.isArray(r))return(0,n.shadow)(this,"optionalContentConfig",null);const s=[],o=[];for(const e of r){if(!(e instanceof i.Ref))continue;o.push(e);const t=this.xref.fetchIfRef(e);s.push({id:e.toString(),name:"string"==typeof t.get("Name")?(0,n.stringToPDFString)(t.get("Name")):null,intent:"string"==typeof t.get("Intent")?(0,n.stringToPDFString)(t.get("Intent")):null})}e=this._readOptionalContentConfig(a,o);e.groups=s}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)(`Unable to read optional content config: ${e}`)}return(0,n.shadow)(this,"optionalContentConfig",e)}_readOptionalContentConfig(e,t){function parseOnOff(e){const a=[];if(Array.isArray(e))for(const r of e)r instanceof i.Ref&&t.includes(r)&&a.push(r.toString());return a}function parseOrder(e,a=0){if(!Array.isArray(e))return null;const n=[];for(const s of e){if(s instanceof i.Ref&&t.includes(s)){r.put(s);n.push(s.toString());continue}const e=parseNestedOrder(s,a);e&&n.push(e)}if(a>0)return n;const s=[];for(const e of t)r.has(e)||s.push(e.toString());s.length&&n.push({name:null,order:s});return n}function parseNestedOrder(e,t){if(++t>s){(0,n.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const r=a.fetchIfRef(e);if(!Array.isArray(r))return null;const i=a.fetchIfRef(r[0]);if("string"!=typeof i)return null;const o=parseOrder(r.slice(1),t);return o&&o.length?{name:(0,n.stringToPDFString)(i),order:o}:null}const a=this.xref,r=new i.RefSet,s=10;return{name:"string"==typeof e.get("Name")?(0,n.stringToPDFString)(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?(0,n.stringToPDFString)(e.get("Creator")):null,baseState:e.get("BaseState")instanceof i.Name?e.get("BaseState").name:null,on:parseOnOff(e.get("ON")),off:parseOnOff(e.get("OFF")),order:parseOrder(e.get("Order")),groups:null}}setActualNumPages(e=null){this._actualNumPages=e}get hasActualNumPages(){return null!==this._actualNumPages}get _pagesCount(){const e=this.toplevelPagesDict.get("Count");if(!Number.isInteger(e))throw new n.FormatError("Page count in top-level pages dictionary is not an integer.");return(0,n.shadow)(this,"_pagesCount",e)}get numPages(){return this.hasActualNumPages?this._actualNumPages:this._pagesCount}get destinations(){const e=this._readDests(),t=Object.create(null);if(e instanceof s.NameTree)for(const[a,r]of e.getAll()){const e=fetchDestination(r);e&&(t[(0,n.stringToPDFString)(a)]=e)}else e instanceof i.Dict&&e.forEach((function(e,a){const r=fetchDestination(a);r&&(t[e]=r)}));return(0,n.shadow)(this,"destinations",t)}getDestination(e){const t=this._readDests();if(t instanceof s.NameTree){const a=fetchDestination(t.get(e));if(a)return a;const r=this.destinations[e];if(r){(0,n.warn)(`Found "${e}" at an incorrect position in the NameTree.`);return r}}else if(t instanceof i.Dict){const a=fetchDestination(t.get(e));if(a)return a}return null}_readDests(){const e=this._catDict.get("Names");return e&&e.has("Dests")?new s.NameTree(e.getRaw("Dests"),this.xref):this._catDict.has("Dests")?this._catDict.get("Dests"):void 0}get pageLabels(){let e=null;try{e=this._readPageLabels()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read page labels.")}return(0,n.shadow)(this,"pageLabels",e)}_readPageLabels(){const e=this._catDict.getRaw("PageLabels");if(!e)return null;const t=new Array(this.numPages);let a=null,o="";const c=new s.NumberTree(e,this.xref).getAll();let l="",h=1;for(let e=0,s=this.numPages;e=1))throw new n.FormatError("Invalid start in PageLabel dictionary.");h=e}else h=1}switch(a){case"D":l=h;break;case"R":case"r":l=(0,r.toRomanNumerals)(h,"r"===a);break;case"A":case"a":const e=26,t=65,i=97,s="a"===a?i:t,o=h-1;l=String.fromCharCode(s+o%e).repeat(Math.floor(o/e)+1);break;default:if(a)throw new n.FormatError(`Invalid style "${a}" in PageLabel dictionary.`);l=""}t[e]=o+l;h++}return t}get pageLayout(){const e=this._catDict.get("PageLayout");let t="";if(e instanceof i.Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return(0,n.shadow)(this,"pageLayout",t)}get pageMode(){const e=this._catDict.get("PageMode");let t="UseNone";if(e instanceof i.Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return(0,n.shadow)(this,"pageMode",t)}get viewerPreferences(){const e=this._catDict.get("ViewerPreferences");if(!(e instanceof i.Dict))return(0,n.shadow)(this,"viewerPreferences",null);let t=null;for(const a of e.getKeys()){const r=e.get(a);let s;switch(a){case"HideToolbar":case"HideMenubar":case"HideWindowUI":case"FitWindow":case"CenterWindow":case"DisplayDocTitle":case"PickTrayByPDFSize":"boolean"==typeof r&&(s=r);break;case"NonFullScreenPageMode":if(r instanceof i.Name)switch(r.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"UseOC":s=r.name;break;default:s="UseNone"}break;case"Direction":if(r instanceof i.Name)switch(r.name){case"L2R":case"R2L":s=r.name;break;default:s="L2R"}break;case"ViewArea":case"ViewClip":case"PrintArea":case"PrintClip":if(r instanceof i.Name)switch(r.name){case"MediaBox":case"CropBox":case"BleedBox":case"TrimBox":case"ArtBox":s=r.name;break;default:s="CropBox"}break;case"PrintScaling":if(r instanceof i.Name)switch(r.name){case"None":case"AppDefault":s=r.name;break;default:s="AppDefault"}break;case"Duplex":if(r instanceof i.Name)switch(r.name){case"Simplex":case"DuplexFlipShortEdge":case"DuplexFlipLongEdge":s=r.name;break;default:s="None"}break;case"PrintPageRange":if(Array.isArray(r)&&r.length%2==0){r.every(((e,t,a)=>Number.isInteger(e)&&e>0&&(0===t||e>=a[t-1])&&e<=this.numPages))&&(s=r)}break;case"NumCopies":Number.isInteger(r)&&r>0&&(s=r);break;default:(0,n.warn)(`Ignoring non-standard key in ViewerPreferences: ${a}.`);continue}if(void 0!==s){t||(t=Object.create(null));t[a]=s}else(0,n.warn)(`Bad value, for key "${a}", in ViewerPreferences: ${r}.`)}return(0,n.shadow)(this,"viewerPreferences",t)}get openAction(){const e=this._catDict.get("OpenAction"),t=Object.create(null);if(e instanceof i.Dict){const a=new i.Dict(this.xref);a.set("A",e);const r={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:a,resultObj:r});Array.isArray(r.dest)?t.dest=r.dest:r.action&&(t.action=r.action)}else Array.isArray(e)&&(t.dest=e);return(0,n.shadow)(this,"openAction",(0,n.objectSize)(t)>0?t:null)}get attachments(){const e=this._catDict.get("Names");let t=null;if(e instanceof i.Dict&&e.has("EmbeddedFiles")){const a=new s.NameTree(e.getRaw("EmbeddedFiles"),this.xref);for(const[e,r]of a.getAll()){const a=new h.FileSpec(r,this.xref);t||(t=Object.create(null));t[(0,n.stringToPDFString)(e)]=a.serializable}}return(0,n.shadow)(this,"attachments",t)}get xfaImages(){const e=this._catDict.get("Names");let t=null;if(e instanceof i.Dict&&e.has("XFAImages")){const a=new s.NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,r]of a.getAll()){t||(t=new i.Dict(this.xref));t.set((0,n.stringToPDFString)(e),r)}}return(0,n.shadow)(this,"xfaImages",t)}_collectJavaScript(){const e=this._catDict.get("Names");let t=null;function appendIfJavaScriptDict(e,a){if(!(a instanceof i.Dict))return;if(!(0,i.isName)(a.get("S"),"JavaScript"))return;let r=a.get("JS");if(r instanceof o.BaseStream)r=r.getString();else if("string"!=typeof r)return;null===t&&(t=new Map);r=(0,n.stringToPDFString)(r).replace(/\u0000/g,"");t.set(e,r)}if(e instanceof i.Dict&&e.has("JavaScript")){const t=new s.NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,a]of t.getAll())appendIfJavaScriptDict((0,n.stringToPDFString)(e),a)}const a=this._catDict.get("OpenAction");a&&appendIfJavaScriptDict("OpenAction",a);return t}get javaScript(){const e=this._collectJavaScript();return(0,n.shadow)(this,"javaScript",e?[...e.values()]:null)}get jsActions(){const e=this._collectJavaScript();let t=(0,r.collectActions)(this.xref,this._catDict,n.DocumentActionEventType);if(e){t||(t=Object.create(null));for(const[a,r]of e)a in t?t[a].push(r):t[a]=[r]}return(0,n.shadow)(this,"jsActions",t)}async fontFallback(e,t){const a=await Promise.all(this.fontCache);for(const r of a)if(r.loadedName===e){r.fallback(t);return}}async cleanup(e=!1){(0,c.clearGlobalCaches)();this.globalImageCache.clear(e);this.pageKidsCountCache.clear();this.pageIndexCache.clear();this.nonBlendModesSet.clear();const t=await Promise.all(this.fontCache);for(const{dict:e}of t)delete e.cacheKey;this.fontCache.clear();this.builtInCMapCache.clear();this.standardFontDataCache.clear()}async getPageDict(e){const t=[this.toplevelPagesDict],a=new i.RefSet,r=this._catDict.getRaw("Pages");r instanceof i.Ref&&a.put(r);const s=this.xref,o=this.pageKidsCountCache,c=this.pageIndexCache;let l=0;for(;t.length;){const r=t.pop();if(r instanceof i.Ref){const h=o.get(r);if(h>=0&&l+h<=e){l+=h;continue}if(a.has(r))throw new n.FormatError("Pages tree contains circular reference.");a.put(r);const u=await s.fetchAsync(r);if(u instanceof i.Dict){let t=u.getRaw("Type");t instanceof i.Ref&&(t=await s.fetchAsync(t));if((0,i.isName)(t,"Page")||!u.has("Kids")){o.has(r)||o.put(r,1);c.has(r)||c.put(r,l);if(l===e)return[u,r];l++;continue}}t.push(u);continue}if(!(r instanceof i.Dict))throw new n.FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:h}=r;let u=r.getRaw("Count");u instanceof i.Ref&&(u=await s.fetchAsync(u));if(Number.isInteger(u)&&u>=0){h&&!o.has(h)&&o.put(h,u);if(l+u<=e){l+=u;continue}}let d=r.getRaw("Kids");d instanceof i.Ref&&(d=await s.fetchAsync(d));if(!Array.isArray(d)){let t=r.getRaw("Type");t instanceof i.Ref&&(t=await s.fetchAsync(t));if((0,i.isName)(t,"Page")||!r.has("Kids")){if(l===e)return[r,null];l++;continue}throw new n.FormatError("Page dictionary kids object is not an array.")}for(let e=d.length-1;e>=0;e--)t.push(d[e])}throw new Error(`Page index ${e} not found.`)}async getAllPageDicts(e=!1){const t=[{currentNode:this.toplevelPagesDict,posInKids:0}],a=new i.RefSet,s=this._catDict.getRaw("Pages");s instanceof i.Ref&&a.put(s);const o=new Map,c=this.xref,l=this.pageIndexCache;let h=0;function addPageDict(e,t){t&&!l.has(t)&&l.put(t,h);o.set(h++,[e,t])}function addPageError(t){if(t instanceof r.XRefEntryException&&!e)throw t;o.set(h++,[t,null])}for(;t.length>0;){const e=t.at(-1),{currentNode:r,posInKids:s}=e;let o=r.getRaw("Kids");if(o instanceof i.Ref)try{o=await c.fetchAsync(o)}catch(e){addPageError(e);break}if(!Array.isArray(o)){addPageError(new n.FormatError("Page dictionary kids object is not an array."));break}if(s>=o.length){t.pop();continue}const l=o[s];let h;if(l instanceof i.Ref){if(a.has(l)){addPageError(new n.FormatError("Pages tree contains circular reference."));break}a.put(l);try{h=await c.fetchAsync(l)}catch(e){addPageError(e);break}}else h=l;if(!(h instanceof i.Dict)){addPageError(new n.FormatError("Page dictionary kid reference points to wrong type of object."));break}let u=h.getRaw("Type");if(u instanceof i.Ref)try{u=await c.fetchAsync(u)}catch(e){addPageError(e);break}(0,i.isName)(u,"Page")||!h.has("Kids")?addPageDict(h,l instanceof i.Ref?l:null):t.push({currentNode:h,posInKids:0});e.posInKids++}return o}getPageIndex(e){const t=this.pageIndexCache.get(e);if(void 0!==t)return Promise.resolve(t);const a=this.xref;let r=0;const next=t=>function pagesBeforeRef(t){let r,s=0;return a.fetchAsync(t).then((function(a){if((0,i.isRefsEqual)(t,e)&&!(0,i.isDict)(a,"Page")&&!(a instanceof i.Dict&&!a.has("Type")&&a.has("Contents")))throw new n.FormatError("The reference does not point to a /Page dictionary.");if(!a)return null;if(!(a instanceof i.Dict))throw new n.FormatError("Node must be a dictionary.");r=a.getRaw("Parent");return a.getAsync("Parent")})).then((function(e){if(!e)return null;if(!(e instanceof i.Dict))throw new n.FormatError("Parent must be a dictionary.");return e.getAsync("Kids")})).then((function(e){if(!e)return null;const o=[];let c=!1;for(let r=0,l=e.length;r{if(!t){this.pageIndexCache.put(e,r);return r}const[a,n]=t;r+=a;return next(n)}));return next(e)}get baseUrl(){const e=this._catDict.get("URI");if(e instanceof i.Dict){const t=e.get("Base");if("string"==typeof t){const e=(0,n.createValidAbsoluteUrl)(t,null,{tryConvertEncoding:!0});if(e)return(0,n.shadow)(this,"baseUrl",e.href)}}return(0,n.shadow)(this,"baseUrl",null)}static parseDestDictionary(e){const t=e.destDict;if(!(t instanceof i.Dict)){(0,n.warn)("parseDestDictionary: `destDict` must be a dictionary.");return}const a=e.resultObj;if("object"!=typeof a){(0,n.warn)("parseDestDictionary: `resultObj` must be an object.");return}const s=e.docBaseUrl||null;let c,l,h=t.get("A");if(!(h instanceof i.Dict))if(t.has("Dest"))h=t.get("Dest");else{h=t.get("AA");h instanceof i.Dict&&(h.has("D")?h=h.get("D"):h.has("U")&&(h=h.get("U")))}if(h instanceof i.Dict){const e=h.get("S");if(!(e instanceof i.Name)){(0,n.warn)("parseDestDictionary: Invalid type in Action dictionary.");return}const t=e.name;switch(t){case"ResetForm":const e=h.get("Flags"),s=0==(1&("number"==typeof e?e:0)),u=[],d=[];for(const e of h.get("Fields")||[])e instanceof i.Ref?d.push(e.toString()):"string"==typeof e&&u.push((0,n.stringToPDFString)(e));a.resetForm={fields:u,refs:d,include:s};break;case"URI":c=h.get("URI");c instanceof i.Name&&(c="/"+c.name);break;case"GoTo":l=h.get("D");break;case"Launch":case"GoToR":const f=h.get("F");f instanceof i.Dict?c=f.get("F")||null:"string"==typeof f&&(c=f);let g=h.get("D");if(g){g instanceof i.Name&&(g=g.name);if("string"==typeof c){const e=c.split("#")[0];"string"==typeof g?c=e+"#"+g:Array.isArray(g)&&(c=e+"#"+JSON.stringify(g))}}const p=h.get("NewWindow");"boolean"==typeof p&&(a.newWindow=p);break;case"Named":const m=h.get("N");m instanceof i.Name&&(a.action=m.name);break;case"JavaScript":const b=h.get("JS");let y;b instanceof o.BaseStream?y=b.getString():"string"==typeof b&&(y=b);const w=y&&(0,r.recoverJsURL)((0,n.stringToPDFString)(y));if(w){c=w.url;a.newWindow=w.newWindow;break}default:if("JavaScript"===t||"SubmitForm"===t)break;(0,n.warn)(`parseDestDictionary - unsupported action: "${t}".`)}}else t.has("Dest")&&(l=t.get("Dest"));if("string"==typeof c){const e=(0,n.createValidAbsoluteUrl)(c,s,{addDefaultProtocol:!0,tryConvertEncoding:!0});e&&(a.url=e.href);a.unsafeUrl=c}if(l){l instanceof i.Name&&(l=l.name);"string"==typeof l?a.dest=(0,n.stringToPDFString)(l):Array.isArray(l)&&(a.dest=l)}}}t.Catalog=Catalog},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NumberTree=t.NameTree=void 0;var r=a(5),n=a(2);class NameOrNumberTree{constructor(e,t,a){this.constructor===NameOrNumberTree&&(0,n.unreachable)("Cannot initialize NameOrNumberTree.");this.root=e;this.xref=t;this._type=a}getAll(){const e=new Map;if(!this.root)return e;const t=this.xref,a=new r.RefSet;a.put(this.root);const i=[this.root];for(;i.length>0;){const s=t.fetchIfRef(i.shift());if(!(s instanceof r.Dict))continue;if(s.has("Kids")){const e=s.get("Kids");if(!Array.isArray(e))continue;for(const t of e){if(a.has(t))throw new n.FormatError(`Duplicate entry in "${this._type}" tree.`);i.push(t);a.put(t)}continue}const o=s.get(this._type);if(Array.isArray(o))for(let a=0,r=o.length;a10){(0,n.warn)(`Search depth limit reached for "${this._type}" tree.`);return null}const i=a.get("Kids");if(!Array.isArray(i))return null;let s=0,o=i.length-1;for(;s<=o;){const r=s+o>>1,n=t.fetchIfRef(i[r]),c=n.get("Limits");if(et.fetchIfRef(c[1]))){a=n;break}s=r+1}}if(s>o)return null}const i=a.get(this._type);if(Array.isArray(i)){let a=0,r=i.length-2;for(;a<=r;){const n=a+r>>1,s=n+(1&n),o=t.fetchIfRef(i[s]);if(eo))return t.fetchIfRef(i[s+1]);a=s+2}}}return null}}t.NameTree=class NameTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Names")}};t.NumberTree=class NumberTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Nums")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.clearGlobalCaches=function clearGlobalCaches(){(0,r.clearPrimitiveCaches)();(0,n.clearUnicodeCaches)()};var r=a(5),n=a(40)},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FileSpec=void 0;var r=a(2),n=a(7),i=a(5);function pickPlatformItem(e){return e.has("UF")?e.get("UF"):e.has("F")?e.get("F"):e.has("Unix")?e.get("Unix"):e.has("Mac")?e.get("Mac"):e.has("DOS")?e.get("DOS"):null}t.FileSpec=class FileSpec{constructor(e,t){if(e instanceof i.Dict){this.xref=t;this.root=e;e.has("FS")&&(this.fs=e.get("FS"));this.description=e.has("Desc")?(0,r.stringToPDFString)(e.get("Desc")):"";e.has("RF")&&(0,r.warn)("Related file specifications are not supported");this.contentAvailable=!0;if(!e.has("EF")){this.contentAvailable=!1;(0,r.warn)("Non-embedded file specifications are not supported")}}}get filename(){if(!this._filename&&this.root){const e=pickPlatformItem(this.root)||"unnamed";this._filename=(0,r.stringToPDFString)(e).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename}get content(){if(!this.contentAvailable)return null;!this.contentRef&&this.root&&(this.contentRef=pickPlatformItem(this.root.get("EF")));let e=null;if(this.contentRef){const t=this.xref.fetchIfRef(this.contentRef);t instanceof n.BaseStream?e=t.getBytes():(0,r.warn)("Embedded file specification points to non-existing/invalid content")}else(0,r.warn)("Embedded file specification does not have a content");return e}get serializable(){return{filename:this.filename,content:this.content}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.MetadataParser=void 0;var r=a(66);t.MetadataParser=class MetadataParser{constructor(e){e=this._repair(e);const t=new r.SimpleXMLParser({lowerCaseName:!0}).parseFromString(e);this._metadataMap=new Map;this._data=e;t&&this._parse(t)}_repair(e){return e.replace(/^[^<]+/,"").replace(/>\\376\\377([^<]+)/g,(function(e,t){const a=t.replace(/\\([0-3])([0-7])([0-7])/g,(function(e,t,a,r){return String.fromCharCode(64*t+8*a+1*r)})).replace(/&(amp|apos|gt|lt|quot);/g,(function(e,t){switch(t){case"amp":return"&";case"apos":return"'";case"gt":return">";case"lt":return"<";case"quot":return'"'}throw new Error(`_repair: ${t} isn't defined.`)})),r=[];for(let e=0,t=a.length;e=32&&t<127&&60!==t&&62!==t&&38!==t?r.push(String.fromCharCode(t)):r.push("&#x"+(65536+t).toString(16).substring(1)+";")}return">"+r.join("")}))}_getSequence(e){const t=e.nodeName;return"rdf:bag"!==t&&"rdf:seq"!==t&&"rdf:alt"!==t?null:e.childNodes.filter((e=>"rdf:li"===e.nodeName))}_parseArray(e){if(!e.hasChildNodes())return;const[t]=e.childNodes,a=this._getSequence(t)||[];this._metadataMap.set(e.nodeName,a.map((e=>e.textContent.trim())))}_parse(e){let t=e.documentElement;if("rdf:rdf"!==t.nodeName){t=t.firstChild;for(;t&&"rdf:rdf"!==t.nodeName;)t=t.nextSibling}if(t&&"rdf:rdf"===t.nodeName&&t.hasChildNodes())for(const e of t.childNodes)if("rdf:description"===e.nodeName)for(const t of e.childNodes){const e=t.nodeName;switch(e){case"#text":continue;case"dc:creator":case"dc:subject":this._parseArray(t);continue}this._metadataMap.set(e,t.textContent.trim())}}get serializable(){return{parsedData:this._metadataMap,rawData:this._data}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StructTreeRoot=t.StructTreePage=void 0;var r=a(5),n=a(2),i=a(70);const s="PAGE_CONTENT",o="STREAM_CONTENT",c="OBJECT",l="ELEMENT";t.StructTreeRoot=class StructTreeRoot{constructor(e){this.dict=e;this.roleMap=new Map}init(){this.readRoleMap()}readRoleMap(){const e=this.dict.get("RoleMap");e instanceof r.Dict&&e.forEach(((e,t)=>{t instanceof r.Name&&this.roleMap.set(e,t.name)}))}};class StructElementNode{constructor(e,t){this.tree=e;this.dict=t;this.kids=[];this.parseKids()}get role(){const e=this.dict.get("S"),t=e instanceof r.Name?e.name:"",{root:a}=this.tree;return a.roleMap.has(t)?a.roleMap.get(t):t}parseKids(){let e=null;const t=this.dict.getRaw("Pg");t instanceof r.Ref&&(e=t.toString());const a=this.dict.get("K");if(Array.isArray(a))for(const t of a){const a=this.parseKid(e,t);a&&this.kids.push(a)}else{const t=this.parseKid(e,a);t&&this.kids.push(t)}}parseKid(e,t){if(Number.isInteger(t))return this.tree.pageDict.objId!==e?null:new StructElement({type:s,mcid:t,pageObjId:e});let a=null;t instanceof r.Ref?a=this.dict.xref.fetch(t):t instanceof r.Dict&&(a=t);if(!a)return null;const n=a.getRaw("Pg");n instanceof r.Ref&&(e=n.toString());const i=a.get("Type")instanceof r.Name?a.get("Type").name:null;return"MCR"===i?this.tree.pageDict.objId!==e?null:new StructElement({type:o,refObjId:a.getRaw("Stm")instanceof r.Ref?a.getRaw("Stm").toString():null,pageObjId:e,mcid:a.get("MCID")}):"OBJR"===i?this.tree.pageDict.objId!==e?null:new StructElement({type:c,refObjId:a.getRaw("Obj")instanceof r.Ref?a.getRaw("Obj").toString():null,pageObjId:e}):new StructElement({type:l,dict:a})}}class StructElement{constructor({type:e,dict:t=null,mcid:a=null,pageObjId:r=null,refObjId:n=null}){this.type=e;this.dict=t;this.mcid=a;this.pageObjId=r;this.refObjId=n;this.parentNode=null}}t.StructTreePage=class StructTreePage{constructor(e,t){this.root=e;this.rootDict=e?e.dict:null;this.pageDict=t;this.nodes=[]}parse(){if(!this.root||!this.rootDict)return;const e=this.rootDict.get("ParentTree");if(!e)return;const t=this.pageDict.get("StructParents");if(!Number.isInteger(t))return;const a=new i.NumberTree(e,this.rootDict.xref).get(t);if(!Array.isArray(a))return;const n=new Map;for(const e of a)e instanceof r.Ref&&this.addNode(this.rootDict.xref.fetch(e),n)}addNode(e,t,a=0){if(a>40){(0,n.warn)("StructTree MAX_DEPTH reached.");return null}if(t.has(e))return t.get(e);const i=new StructElementNode(this,e);t.set(e,i);const s=e.get("P");if(!s||(0,r.isName)(s.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,i)||t.delete(e);return i}const o=this.addNode(s,t,a+1);if(!o)return i;let c=!1;for(const t of o.kids)if(t.type===l&&t.dict===e){t.parentNode=i;c=!0}c||t.delete(e);return i}addTopLevelNode(e,t){const a=this.rootDict.get("K");if(!a)return!1;if(a instanceof r.Dict){if(a.objId!==e.objId)return!1;this.nodes[0]=t;return!0}if(!Array.isArray(a))return!0;let n=!1;for(let r=0;r40){(0,n.warn)("StructTree too deep to be fully serialized.");return}const r=Object.create(null);r.role=e.role;r.children=[];t.children.push(r);const i=e.dict.get("Alt");"string"==typeof i&&(r.alt=(0,n.stringToPDFString)(i));const h=e.dict.get("Lang");"string"==typeof h&&(r.lang=(0,n.stringToPDFString)(h));for(const t of e.kids){const e=t.type===l?t.parentNode:null;e?nodeToSerializable(e,r,a+1):t.type===s||t.type===o?r.children.push({type:"content",id:`page${t.pageObjId}_mcid${t.mcid}`}):t.type===c&&r.children.push({type:"object",id:t.refObjId})}}const e=Object.create(null);e.children=[];e.role="Root";for(const t of this.nodes)t&&nodeToSerializable(t,e);return e}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ObjectLoader=void 0;var r=a(5),n=a(7),i=a(6),s=a(2);function addChildren(e,t){if(e instanceof r.Dict)e=e.getRawValues();else if(e instanceof n.BaseStream)e=e.dict.getRawValues();else if(!Array.isArray(e))return;for(const i of e)((a=i)instanceof r.Ref||a instanceof r.Dict||a instanceof n.BaseStream||Array.isArray(a))&&t.push(i);var a}t.ObjectLoader=class ObjectLoader{constructor(e,t,a){this.dict=e;this.keys=t;this.xref=a;this.refSet=null}async load(){if(this.xref.stream.isDataLoaded)return;const{keys:e,dict:t}=this;this.refSet=new r.RefSet;const a=[];for(let r=0,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.XFAFactory=void 0;var r=a(77),n=a(81),i=a(87),s=a(85),o=a(78),c=a(2),l=a(88),h=a(98);class XFAFactory{constructor(e){try{this.root=(new l.XFAParser).parse(XFAFactory._createDocument(e));const t=new n.Binder(this.root);this.form=t.bind();this.dataHandler=new i.DataHandler(this.root,t.getData());this.form[r.$globalData].template=this.form}catch(e){(0,c.warn)(`XFA - an error occurred during parsing and binding: ${e}`)}}isValid(){return this.root&&this.form}_createPagesHelper(){const e=this.form[r.$toPages]();return new Promise(((t,a)=>{const nextIteration=()=>{try{const a=e.next();a.done?t(a.value):setTimeout(nextIteration,0)}catch(e){a(e)}};setTimeout(nextIteration,0)}))}async _createPages(){try{this.pages=await this._createPagesHelper();this.dims=this.pages.children.map((e=>{const{width:t,height:a}=e.attributes.style;return[0,0,parseInt(t),parseInt(a)]}))}catch(e){(0,c.warn)(`XFA - an error occurred during layout: ${e}`)}}getBoundingBox(e){return this.dims[e]}async getNumPages(){this.pages||await this._createPages();return this.dims.length}setImages(e){this.form[r.$globalData].images=e}setFonts(e){this.form[r.$globalData].fontFinder=new s.FontFinder(e);const t=[];for(let e of this.form[r.$globalData].usedTypefaces){e=(0,o.stripQuotes)(e);this.form[r.$globalData].fontFinder.find(e)||t.push(e)}return t.length>0?t:null}appendFonts(e,t){this.form[r.$globalData].fontFinder.add(e,t)}async getPages(){this.pages||await this._createPages();const e=this.pages;this.pages=null;return e}serializeData(e){return this.dataHandler.serialize(e)}static _createDocument(e){return e["/xdp:xdp"]?Object.values(e).join(""):e["xdp:xdp"]}static getRichTextAsHtml(e){if(!e||"string"!=typeof e)return null;try{let t=new l.XFAParser(h.XhtmlNamespace,!0).parse(e);if(!["body","xhtml"].includes(t[r.$nodeName])){const e=h.XhtmlNamespace.body({});e[r.$appendChild](t);t=e}const a=t[r.$toHTML]();if(!a.success)return null;const{html:n}=a,{attributes:i}=n;if(i){i.class&&(i.class=i.class.filter((e=>!e.startsWith("xfa"))));i.dir="auto"}return{html:n,str:t[r.$text]()}}catch(e){(0,c.warn)(`XFA - an error occurred during parsing of rich text: ${e}`)}return null}}t.XFAFactory=XFAFactory},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XmlObject=t.XFAObjectArray=t.XFAObject=t.XFAAttribute=t.StringObject=t.OptionObject=t.Option10=t.Option01=t.IntegerObject=t.ContentObject=t.$uid=t.$toStyle=t.$toString=t.$toPages=t.$toHTML=t.$text=t.$tabIndex=t.$setValue=t.$setSetAttributes=t.$setId=t.$searchNode=t.$root=t.$resolvePrototypes=t.$removeChild=t.$pushPara=t.$pushGlyphs=t.$popPara=t.$onText=t.$onChildCheck=t.$onChild=t.$nsAttributes=t.$nodeName=t.$namespaceId=t.$isUsable=t.$isTransparent=t.$isThereMoreWidth=t.$isSplittable=t.$isNsAgnostic=t.$isDescendent=t.$isDataValue=t.$isCDATAXml=t.$isBindable=t.$insertAt=t.$indexOf=t.$ids=t.$hasSettableValue=t.$globalData=t.$getTemplateRoot=t.$getSubformParent=t.$getRealChildrenByNameIt=t.$getParent=t.$getNextPage=t.$getExtra=t.$getDataValue=t.$getContainedChildren=t.$getChildrenByNameIt=t.$getChildrenByName=t.$getChildrenByClass=t.$getChildren=t.$getAvailableSpace=t.$getAttributes=t.$getAttributeIt=t.$flushHTML=t.$finalize=t.$extra=t.$dump=t.$data=t.$content=t.$consumed=t.$clone=t.$cleanup=t.$cleanPage=t.$clean=t.$childrenToHTML=t.$appendChild=t.$addHTML=t.$acceptWhitespace=void 0;var r=a(78),n=a(2),i=a(6),s=a(79),o=a(80);const c=Symbol();t.$acceptWhitespace=c;const l=Symbol();t.$addHTML=l;const h=Symbol();t.$appendChild=h;const u=Symbol();t.$childrenToHTML=u;const d=Symbol();t.$clean=d;const f=Symbol();t.$cleanPage=f;const g=Symbol();t.$cleanup=g;const p=Symbol();t.$clone=p;const m=Symbol();t.$consumed=m;const b=Symbol("content");t.$content=b;const y=Symbol("data");t.$data=y;const w=Symbol();t.$dump=w;const S=Symbol("extra");t.$extra=S;const x=Symbol();t.$finalize=x;const k=Symbol();t.$flushHTML=k;const C=Symbol();t.$getAttributeIt=C;const v=Symbol();t.$getAttributes=v;const F=Symbol();t.$getAvailableSpace=F;const O=Symbol();t.$getChildrenByClass=O;const T=Symbol();t.$getChildrenByName=T;const M=Symbol();t.$getChildrenByNameIt=M;const E=Symbol();t.$getDataValue=E;const D=Symbol();t.$getExtra=D;const N=Symbol();t.$getRealChildrenByNameIt=N;const R=Symbol();t.$getChildren=R;const L=Symbol();t.$getContainedChildren=L;const j=Symbol();t.$getNextPage=j;const $=Symbol();t.$getSubformParent=$;const _=Symbol();t.$getParent=_;const U=Symbol();t.$getTemplateRoot=U;const X=Symbol();t.$globalData=X;const H=Symbol();t.$hasSettableValue=H;const q=Symbol();t.$ids=q;const z=Symbol();t.$indexOf=z;const W=Symbol();t.$insertAt=W;const G=Symbol();t.$isCDATAXml=G;const V=Symbol();t.$isBindable=V;const K=Symbol();t.$isDataValue=K;const Y=Symbol();t.$isDescendent=Y;const J=Symbol();t.$isNsAgnostic=J;const Z=Symbol();t.$isSplittable=Z;const Q=Symbol();t.$isThereMoreWidth=Q;const ee=Symbol();t.$isTransparent=ee;const te=Symbol();t.$isUsable=te;const ae=Symbol(),re=Symbol("namespaceId");t.$namespaceId=re;const ne=Symbol("nodeName");t.$nodeName=ne;const ie=Symbol();t.$nsAttributes=ie;const se=Symbol();t.$onChild=se;const oe=Symbol();t.$onChildCheck=oe;const ce=Symbol();t.$onText=ce;const le=Symbol();t.$pushGlyphs=le;const he=Symbol();t.$popPara=he;const ue=Symbol();t.$pushPara=ue;const de=Symbol();t.$removeChild=de;const fe=Symbol("root");t.$root=fe;const ge=Symbol();t.$resolvePrototypes=ge;const pe=Symbol();t.$searchNode=pe;const me=Symbol();t.$setId=me;const be=Symbol();t.$setSetAttributes=be;const ye=Symbol();t.$setValue=ye;const we=Symbol();t.$tabIndex=we;const Se=Symbol();t.$text=Se;const xe=Symbol();t.$toPages=xe;const Ae=Symbol();t.$toHTML=Ae;const ke=Symbol();t.$toString=ke;const Ce=Symbol();t.$toStyle=Ce;const ve=Symbol("uid");t.$uid=ve;const Fe=Symbol(),Oe=Symbol(),Te=Symbol(),Ie=Symbol("_children"),Me=Symbol(),Pe=Symbol(),Ee=Symbol(),De=Symbol(),Ne=Symbol(),Be=Symbol(),Re=Symbol(),Le=Symbol(),je=Symbol(),$e=Symbol("parent"),_e=Symbol(),Ue=Symbol(),Xe=Symbol();let He=0;const qe=s.NamespaceIds.datasets.id;class XFAObject{constructor(e,t,a=!1){this[re]=e;this[ne]=t;this[Re]=a;this[$e]=null;this[Ie]=[];this[ve]=`${t}${He++}`;this[X]=null}[se](e){if(!this[Re]||!this[oe](e))return!1;const t=e[ne],a=this[t];if(!(a instanceof XFAObjectArray)){null!==a&&this[de](a);this[t]=e;this[h](e);return!0}if(a.push(e)){this[h](e);return!0}let r="";this.id?r=` (id: ${this.id})`:this.name&&(r=` (name: ${this.name} ${this.h.value})`);(0,n.warn)(`XFA - node "${this[ne]}"${r} has already enough "${t}"!`);return!1}[oe](e){return this.hasOwnProperty(e[ne])&&e[re]===this[re]}[J](){return!1}[c](){return!1}[G](){return!1}[V](){return!1}[he](){this.para&&this[U]()[S].paraStack.pop()}[ue](){this[U]()[S].paraStack.push(this.para)}[me](e){this.id&&this[re]===s.NamespaceIds.template.id&&e.set(this.id,this)}[U](){return this[X].template}[Z](){return!1}[Q](){return!1}[h](e){e[$e]=this;this[Ie].push(e);!e[X]&&this[X]&&(e[X]=this[X])}[de](e){const t=this[Ie].indexOf(e);this[Ie].splice(t,1)}[H](){return this.hasOwnProperty("value")}[ye](e){}[ce](e){}[x](){}[d](e){delete this[Re];if(this[g]){e.clean(this[g]);delete this[g]}}[z](e){return this[Ie].indexOf(e)}[W](e,t){t[$e]=this;this[Ie].splice(e,0,t);!t[X]&&this[X]&&(t[X]=this[X])}[ee](){return!this.name}[ae](){return""}[Se](){return 0===this[Ie].length?this[b]:this[Ie].map((e=>e[Se]())).join("")}get[Te](){const e=Object.getPrototypeOf(this);if(!e._attributes){const t=e._attributes=new Set;for(const e of Object.getOwnPropertyNames(this)){if(null===this[e]||this[e]instanceof XFAObject||this[e]instanceof XFAObjectArray)break;t.add(e)}}return(0,n.shadow)(this,Te,e._attributes)}[Y](e){let t=this;for(;t;){if(t===e)return!0;t=t[_]()}return!1}[_](){return this[$e]}[$](){return this[_]()}[R](e=null){return e?this[e]:this[Ie]}[w](){const e=Object.create(null);this[b]&&(e.$content=this[b]);for(const t of Object.getOwnPropertyNames(this)){const a=this[t];null!==a&&(a instanceof XFAObject?e[t]=a[w]():a instanceof XFAObjectArray?a.isEmpty()||(e[t]=a.dump()):e[t]=a)}return e}[Ce](){return null}[Ae](){return r.HTMLResult.EMPTY}*[L](){for(const e of this[R]())yield e}*[De](e,t){for(const a of this[L]())if(!e||t===e.has(a[ne])){const e=this[F](),t=a[Ae](e);t.success||(this[S].failingNode=a);yield t}}[k](){return null}[l](e,t){this[S].children.push(e)}[F](){}[u]({filter:e=null,include:t=!0}){if(this[S].generator){const e=this[F](),t=this[S].failingNode[Ae](e);if(!t.success)return t;t.html&&this[l](t.html,t.bbox);delete this[S].failingNode}else this[S].generator=this[De](e,t);for(;;){const e=this[S].generator.next();if(e.done)break;const t=e.value;if(!t.success)return t;t.html&&this[l](t.html,t.bbox)}this[S].generator=null;return r.HTMLResult.EMPTY}[be](e){this[Ue]=new Set(Object.keys(e))}[Be](e){const t=this[Te],a=this[Ue];return[...e].filter((e=>t.has(e)&&!a.has(e)))}[ge](e,t=new Set){for(const a of this[Ie])a[_e](e,t)}[_e](e,t){const a=this[Ne](e,t);a?this[Fe](a,e,t):this[ge](e,t)}[Ne](e,t){const{use:a,usehref:r}=this;if(!a&&!r)return null;let i=null,s=null,c=null,l=a;if(r){l=r;r.startsWith("#som(")&&r.endsWith(")")?s=r.slice("#som(".length,r.length-1):r.startsWith(".#som(")&&r.endsWith(")")?s=r.slice(".#som(".length,r.length-1):r.startsWith("#")?c=r.slice(1):r.startsWith(".#")&&(c=r.slice(2))}else a.startsWith("#")?c=a.slice(1):s=a;this.use=this.usehref="";if(c)i=e.get(c);else{i=(0,o.searchNode)(e.get(fe),this,s,!0,!1);i&&(i=i[0])}if(!i){(0,n.warn)(`XFA - Invalid prototype reference: ${l}.`);return null}if(i[ne]!==this[ne]){(0,n.warn)(`XFA - Incompatible prototype: ${i[ne]} !== ${this[ne]}.`);return null}if(t.has(i)){(0,n.warn)("XFA - Cycle detected in prototypes use.");return null}t.add(i);const h=i[Ne](e,t);h&&i[Fe](h,e,t);i[ge](e,t);t.delete(i);return i}[Fe](e,t,a){if(a.has(e)){(0,n.warn)("XFA - Cycle detected in prototypes use.");return}!this[b]&&e[b]&&(this[b]=e[b]);new Set(a).add(e);for(const t of this[Be](e[Ue])){this[t]=e[t];this[Ue]&&this[Ue].add(t)}for(const r of Object.getOwnPropertyNames(this)){if(this[Te].has(r))continue;const n=this[r],i=e[r];if(n instanceof XFAObjectArray){for(const e of n[Ie])e[_e](t,a);for(let r=n[Ie].length,s=i[Ie].length;rXFAObject[Me](e))):"object"==typeof e&&null!==e?Object.assign({},e):e}[p](){const e=Object.create(Object.getPrototypeOf(this));for(const t of Object.getOwnPropertySymbols(this))try{e[t]=this[t]}catch(a){(0,n.shadow)(e,t,this[t])}e[ve]=`${e[ne]}${He++}`;e[Ie]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[Te].has(t)){e[t]=XFAObject[Me](this[t]);continue}const a=this[t];e[t]=a instanceof XFAObjectArray?new XFAObjectArray(a[Le]):null}for(const t of this[Ie]){const a=t[ne],r=t[p]();e[Ie].push(r);r[$e]=e;null===e[a]?e[a]=r:e[a][Ie].push(r)}return e}[R](e=null){return e?this[Ie].filter((t=>t[ne]===e)):this[Ie]}[O](e){return this[e]}[T](e,t,a=!0){return Array.from(this[M](e,t,a))}*[M](e,t,a=!0){if("parent"!==e){for(const a of this[Ie]){a[ne]===e&&(yield a);a.name===e&&(yield a);(t||a[ee]())&&(yield*a[M](e,t,!1))}a&&this[Te].has(e)&&(yield new XFAAttribute(this,e,this[e]))}else yield this[$e]}}t.XFAObject=XFAObject;class XFAObjectArray{constructor(e=1/0){this[Le]=e;this[Ie]=[]}push(e){if(this[Ie].length<=this[Le]){this[Ie].push(e);return!0}(0,n.warn)(`XFA - node "${e[ne]}" accepts no more than ${this[Le]} children`);return!1}isEmpty(){return 0===this[Ie].length}dump(){return 1===this[Ie].length?this[Ie][0][w]():this[Ie].map((e=>e[w]()))}[p](){const e=new XFAObjectArray(this[Le]);e[Ie]=this[Ie].map((e=>e[p]()));return e}get children(){return this[Ie]}clear(){this[Ie].length=0}}t.XFAObjectArray=XFAObjectArray;class XFAAttribute{constructor(e,t,a){this[$e]=e;this[ne]=t;this[b]=a;this[m]=!1;this[ve]="attribute"+He++}[_](){return this[$e]}[K](){return!0}[E](){return this[b].trim()}[ye](e){e=e.value||"";this[b]=e.toString()}[Se](){return this[b]}[Y](e){return this[$e]===e||this[$e][Y](e)}}t.XFAAttribute=XFAAttribute;class XmlObject extends XFAObject{constructor(e,t,a={}){super(e,t);this[b]="";this[Pe]=null;if("#text"!==t){const e=new Map;this[Oe]=e;for(const[t,r]of Object.entries(a))e.set(t,new XFAAttribute(this,t,r));if(a.hasOwnProperty(ie)){const e=a[ie].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[Pe]=!1:"dataValue"===e&&(this[Pe]=!0))}}this[m]=!1}[ke](e){const t=this[ne];if("#text"===t){e.push((0,i.encodeToXmlString)(this[b]));return}const a=(0,n.utf8StringToString)(t),r=this[re]===qe?"xfa:":"";e.push(`<${r}${a}`);for(const[t,a]of this[Oe].entries()){const r=(0,n.utf8StringToString)(t);e.push(` ${r}="${(0,i.encodeToXmlString)(a[b])}"`)}null!==this[Pe]&&(this[Pe]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[b]||0!==this[Ie].length){e.push(">");if(this[b])"string"==typeof this[b]?e.push((0,i.encodeToXmlString)(this[b])):this[b][ke](e);else for(const t of this[Ie])t[ke](e);e.push(``)}else e.push("/>")}[se](e){if(this[b]){const e=new XmlObject(this[re],"#text");this[h](e);e[b]=this[b];this[b]=""}this[h](e);return!0}[ce](e){this[b]+=e}[x](){if(this[b]&&this[Ie].length>0){const e=new XmlObject(this[re],"#text");this[h](e);e[b]=this[b];delete this[b]}}[Ae](){return"#text"===this[ne]?r.HTMLResult.success({name:"#text",value:this[b]}):r.HTMLResult.EMPTY}[R](e=null){return e?this[Ie].filter((t=>t[ne]===e)):this[Ie]}[v](){return this[Oe]}[O](e){const t=this[Oe].get(e);return void 0!==t?t:this[R](e)}*[M](e,t){const a=this[Oe].get(e);a&&(yield a);for(const a of this[Ie]){a[ne]===e&&(yield a);t&&(yield*a[M](e,t))}}*[C](e,t){const a=this[Oe].get(e);!a||t&&a[m]||(yield a);for(const a of this[Ie])yield*a[C](e,t)}*[N](e,t,a){for(const r of this[Ie]){r[ne]!==e||a&&r[m]||(yield r);t&&(yield*r[N](e,t,a))}}[K](){return null===this[Pe]?0===this[Ie].length||this[Ie][0][re]===s.NamespaceIds.xhtml.id:this[Pe]}[E](){return null===this[Pe]?0===this[Ie].length?this[b].trim():this[Ie][0][re]===s.NamespaceIds.xhtml.id?this[Ie][0][Se]().trim():null:this[b].trim()}[ye](e){e=e.value||"";this[b]=e.toString()}[w](e=!1){const t=Object.create(null);e&&(t.$ns=this[re]);this[b]&&(t.$content=this[b]);t.$name=this[ne];t.children=[];for(const a of this[Ie])t.children.push(a[w](e));t.attributes=Object.create(null);for(const[e,a]of this[Oe])t.attributes[e]=a[b];return t}}t.XmlObject=XmlObject;class ContentObject extends XFAObject{constructor(e,t){super(e,t);this[b]=""}[ce](e){this[b]+=e}[x](){}}t.ContentObject=ContentObject;t.OptionObject=class OptionObject extends ContentObject{constructor(e,t,a){super(e,t);this[je]=a}[x](){this[b]=(0,r.getKeyword)({data:this[b],defaultValue:this[je][0],validate:e=>this[je].includes(e)})}[d](e){super[d](e);delete this[je]}};t.StringObject=class StringObject extends ContentObject{[x](){this[b]=this[b].trim()}};class IntegerObject extends ContentObject{constructor(e,t,a,r){super(e,t);this[Ee]=a;this[Xe]=r}[x](){this[b]=(0,r.getInteger)({data:this[b],defaultValue:this[Ee],validate:this[Xe]})}[d](e){super[d](e);delete this[Ee];delete this[Xe]}}t.IntegerObject=IntegerObject;t.Option01=class Option01 extends IntegerObject{constructor(e,t){super(e,t,0,(e=>1===e))}};t.Option10=class Option10 extends IntegerObject{constructor(e,t){super(e,t,1,(e=>0===e))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.HTMLResult=void 0;t.getBBox=function getBBox(e){const t=-1;if(!e)return{x:t,y:t,width:t,height:t};const a=e.trim().split(/\s*,\s*/).map((e=>getMeasurement(e,"-1")));if(a.length<4||a[2]<0||a[3]<0)return{x:t,y:t,width:t,height:t};const[r,n,i,s]=a;return{x:r,y:n,width:i,height:s}};t.getColor=function getColor(e,t=[0,0,0]){let[a,r,n]=t;if(!e)return{r:a,g:r,b:n};const i=e.trim().split(/\s*,\s*/).map((e=>Math.min(Math.max(0,parseInt(e.trim(),10)),255))).map((e=>isNaN(e)?0:e));if(i.length<3)return{r:a,g:r,b:n};[a,r,n]=i;return{r:a,g:r,b:n}};t.getFloat=function getFloat({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const r=parseFloat(e);if(!isNaN(r)&&a(r))return r;return t};t.getInteger=function getInteger({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const r=parseInt(e,10);if(!isNaN(r)&&a(r))return r;return t};t.getKeyword=getKeyword;t.getMeasurement=getMeasurement;t.getRatio=function getRatio(e){if(!e)return{num:1,den:1};const t=e.trim().split(/\s*:\s*/).map((e=>parseFloat(e))).filter((e=>!isNaN(e)));1===t.length&&t.push(1);if(0===t.length)return{num:1,den:1};const[a,r]=t;return{num:a,den:r}};t.getRelevant=function getRelevant(e){if(!e)return[];return e.trim().split(/\s+/).map((e=>({excluded:"-"===e[0],viewname:e.substring(1)})))};t.getStringOption=function getStringOption(e,t){return getKeyword({data:e,defaultValue:t[0],validate:e=>t.includes(e)})};t.stripQuotes=function stripQuotes(e){if(e.startsWith("'")||e.startsWith('"'))return e.slice(1,e.length-1);return e};var r=a(2);const n={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},i=/([+-]?\d+\.?\d*)(.*)/;function getKeyword({data:e,defaultValue:t,validate:a}){return e&&a(e=e.trim())?e:t}function getMeasurement(e,t="0"){t=t||"0";if(!e)return getMeasurement(t);const a=e.trim().match(i);if(!a)return getMeasurement(t);const[,r,s]=a,o=parseFloat(r);if(isNaN(o))return getMeasurement(t);if(0===o)return 0;const c=n[s];return c?c(o):o}class HTMLResult{static get FAILURE(){return(0,r.shadow)(this,"FAILURE",new HTMLResult(!1,null,null,null))}static get EMPTY(){return(0,r.shadow)(this,"EMPTY",new HTMLResult(!0,null,null,null))}constructor(e,t,a,r){this.success=e;this.html=t;this.bbox=a;this.breakNode=r}isBreak(){return!!this.breakNode}static breakNode(e){return new HTMLResult(!1,null,null,e)}static success(e,t=null){return new HTMLResult(!0,e,t,null)}}t.HTMLResult=HTMLResult},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NamespaceIds=t.$buildXFAObject=void 0;const a=Symbol();t.$buildXFAObject=a;t.NamespaceIds={config:{id:0,check:e=>e.startsWith("http://www.xfa.org/schema/xci/")},connectionSet:{id:1,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-connection-set/")},datasets:{id:2,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-data/")},form:{id:3,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-form/")},localeSet:{id:4,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-locale-set/")},pdf:{id:5,check:e=>"http://ns.adobe.com/xdp/pdf/"===e},signature:{id:6,check:e=>"http://www.w3.org/2000/09/xmldsig#"===e},sourceSet:{id:7,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-source-set/")},stylesheet:{id:8,check:e=>"http://www.w3.org/1999/XSL/Transform"===e},template:{id:9,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-template/")},xdc:{id:10,check:e=>e.startsWith("http://www.xfa.org/schema/xdc/")},xdp:{id:11,check:e=>"http://ns.adobe.com/xdp/"===e},xfdf:{id:12,check:e=>"http://ns.adobe.com/xfdf/"===e},xhtml:{id:13,check:e=>"http://www.w3.org/1999/xhtml"===e},xmpmeta:{id:14,check:e=>"http://ns.adobe.com/xmpmeta/"===e}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.createDataNode=function createDataNode(e,t,a){const n=parseExpression(a);if(!n)return null;if(n.some((e=>e.operator===l)))return null;const s=f.get(n[0].name);let o=0;if(s){e=s(e,t);o=1}else e=t||e;for(let t=n.length;o0&&p.push(e)}if(0!==p.length||u||0!==d)e=isFinite(f)?p.filter((e=>fe[f])):p.flat();else{const a=t[r.$getParent]();if(!(t=a))return null;d=-1;e=[t]}}if(0===e.length)return null;return e};var r=a(77),n=a(79),i=a(2);const s=/^[^.[]+/,o=/^[^\]]+/,c=0,l=1,h=2,u=3,d=4,f=new Map([["$data",(e,t)=>e.datasets?e.datasets.data:e],["$record",(e,t)=>(e.datasets?e.datasets.data:e)[r.$getChildren]()[0]],["$template",(e,t)=>e.template],["$connectionSet",(e,t)=>e.connectionSet],["$form",(e,t)=>e.form],["$layout",(e,t)=>e.layout],["$host",(e,t)=>e.host],["$dataWindow",(e,t)=>e.dataWindow],["$event",(e,t)=>e.event],["!",(e,t)=>e.datasets],["$xfa",(e,t)=>e],["xfa",(e,t)=>e],["$",(e,t)=>t]]),g=new WeakMap,p=n.NamespaceIds.datasets.id;function parseExpression(e,t,a=!0){let r=e.match(s);if(!r)return null;let[n]=r;const f=[{name:n,cacheName:"."+n,index:0,js:null,formCalc:null,operator:c}];let g=n.length;for(;g{Object.defineProperty(t,"__esModule",{value:!0});t.Binder=void 0;var r=a(77),n=a(82),i=a(80),s=a(79),o=a(2);const c=s.NamespaceIds.datasets.id;function createText(e){const t=new n.Text({});t[r.$content]=e;return t}t.Binder=class Binder{constructor(e){this.root=e;this.datasets=e.datasets;e.datasets&&e.datasets.data?this.data=e.datasets.data:this.data=new r.XmlObject(s.NamespaceIds.datasets.id,"data");this.emptyMerge=0===this.data[r.$getChildren]().length;this.root.form=this.form=e.template[r.$clone]()}_isConsumeData(){return!this.emptyMerge&&this._mergeMode}_isMatchTemplate(){return!this._isConsumeData()}bind(){this._bindElement(this.form,this.data);return this.form}getData(){return this.data}_bindValue(e,t,a){e[r.$data]=t;if(e[r.$hasSettableValue]())if(t[r.$isDataValue]()){const a=t[r.$getDataValue]();e[r.$setValue](createText(a))}else if(e instanceof n.Field&&e.ui&&e.ui.choiceList&&"multiSelect"===e.ui.choiceList.open){const a=t[r.$getChildren]().map((e=>e[r.$content].trim())).join("\n");e[r.$setValue](createText(a))}else this._isConsumeData()&&(0,o.warn)("XFA - Nodes haven't the same type.");else!t[r.$isDataValue]()||this._isMatchTemplate()?this._bindElement(e,t):(0,o.warn)("XFA - Nodes haven't the same type.")}_findDataByNameToConsume(e,t,a,n){if(!e)return null;let i,o;for(let n=0;n<3;n++){i=a[r.$getRealChildrenByNameIt](e,!1,!0);for(;;){o=i.next().value;if(!o)break;if(t===o[r.$isDataValue]())return o}if(a[r.$namespaceId]===s.NamespaceIds.datasets.id&&"data"===a[r.$nodeName])break;a=a[r.$getParent]()}if(!n)return null;i=this.data[r.$getRealChildrenByNameIt](e,!0,!1);o=i.next().value;if(o)return o;i=this.data[r.$getAttributeIt](e,!0);o=i.next().value;return o&&o[r.$isDataValue]()?o:null}_setProperties(e,t){if(e.hasOwnProperty("setProperty"))for(const{ref:a,target:s,connection:c}of e.setProperty.children){if(c)continue;if(!a)continue;const l=(0,i.searchNode)(this.root,t,a,!1,!1);if(!l){(0,o.warn)(`XFA - Invalid reference: ${a}.`);continue}const[h]=l;if(!h[r.$isDescendent](this.data)){(0,o.warn)("XFA - Invalid node: must be a data node.");continue}const u=(0,i.searchNode)(this.root,e,s,!1,!1);if(!u){(0,o.warn)(`XFA - Invalid target: ${s}.`);continue}const[d]=u;if(!d[r.$isDescendent](e)){(0,o.warn)("XFA - Invalid target: must be a property or subproperty.");continue}const f=d[r.$getParent]();if(d instanceof n.SetProperty||f instanceof n.SetProperty){(0,o.warn)("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(d instanceof n.BindItems||f instanceof n.BindItems){(0,o.warn)("XFA - Invalid target: cannot be a bindItems or one of its properties.");continue}const g=h[r.$text](),p=d[r.$nodeName];if(d instanceof r.XFAAttribute){const e=Object.create(null);e[p]=g;const t=Reflect.construct(Object.getPrototypeOf(f).constructor,[e]);f[p]=t[p]}else if(d.hasOwnProperty(r.$content)){d[r.$data]=h;d[r.$content]=g;d[r.$finalize]()}else(0,o.warn)("XFA - Invalid node to use in setProperty")}}_bindItems(e,t){if(!e.hasOwnProperty("items")||!e.hasOwnProperty("bindItems")||e.bindItems.isEmpty())return;for(const t of e.items.children)e[r.$removeChild](t);e.items.clear();const a=new n.Items({}),s=new n.Items({});e[r.$appendChild](a);e.items.push(a);e[r.$appendChild](s);e.items.push(s);for(const{ref:n,labelRef:c,valueRef:l,connection:h}of e.bindItems.children){if(h)continue;if(!n)continue;const e=(0,i.searchNode)(this.root,t,n,!1,!1);if(e)for(const t of e){if(!t[r.$isDescendent](this.datasets)){(0,o.warn)(`XFA - Invalid ref (${n}): must be a datasets child.`);continue}const e=(0,i.searchNode)(this.root,t,c,!0,!1);if(!e){(0,o.warn)(`XFA - Invalid label: ${c}.`);continue}const[h]=e;if(!h[r.$isDescendent](this.datasets)){(0,o.warn)("XFA - Invalid label: must be a datasets child.");continue}const u=(0,i.searchNode)(this.root,t,l,!0,!1);if(!u){(0,o.warn)(`XFA - Invalid value: ${l}.`);continue}const[d]=u;if(!d[r.$isDescendent](this.datasets)){(0,o.warn)("XFA - Invalid value: must be a datasets child.");continue}const f=createText(h[r.$text]()),g=createText(d[r.$text]());a[r.$appendChild](f);a.text.push(f);s[r.$appendChild](g);s.text.push(g)}else(0,o.warn)(`XFA - Invalid reference: ${n}.`)}}_bindOccurrences(e,t,a){let n;if(t.length>1){n=e[r.$clone]();n[r.$removeChild](n.occur);n.occur=null}this._bindValue(e,t[0],a);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const i=e[r.$getParent](),s=e[r.$nodeName],o=i[r.$indexOf](e);for(let e=1,c=t.length;et.name===e.name)).length:a[n].children.length;const s=a[r.$indexOf](e)+1,o=t.initial-i;if(o){const t=e[r.$clone]();t[r.$removeChild](t.occur);t.occur=null;a[n].push(t);a[r.$insertAt](s,t);for(let e=1;e0)this._bindOccurrences(n,[e[0]],null);else if(this.emptyMerge){const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId],a=n[r.$data]=new r.XmlObject(e,n.name||"root");t[r.$appendChild](a);this._bindElement(n,a)}continue}if(!n[r.$isBindable]())continue;let e=!1,s=null,l=null,h=null;if(n.bind){switch(n.bind.match){case"none":this._setAndBind(n,t);continue;case"global":e=!0;break;case"dataRef":if(!n.bind.ref){(0,o.warn)(`XFA - ref is empty in node ${n[r.$nodeName]}.`);this._setAndBind(n,t);continue}l=n.bind.ref}n.bind.picture&&(s=n.bind.picture[r.$content])}const[u,d]=this._getOccurInfo(n);if(l){h=(0,i.searchNode)(this.root,t,l,!0,!1);if(null===h){h=(0,i.createDataNode)(this.data,t,l);if(!h)continue;this._isConsumeData()&&(h[r.$consumed]=!0);this._setAndBind(n,h);continue}this._isConsumeData()&&(h=h.filter((e=>!e[r.$consumed])));h.length>d?h=h.slice(0,d):0===h.length&&(h=null);h&&this._isConsumeData()&&h.forEach((e=>{e[r.$consumed]=!0}))}else{if(!n.name){this._setAndBind(n,t);continue}if(this._isConsumeData()){const a=[];for(;a.length0?a:null}else{h=t[r.$getRealChildrenByNameIt](n.name,!1,this.emptyMerge).next().value;if(!h){if(0===u){a.push(n);continue}const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId];h=n[r.$data]=new r.XmlObject(e,n.name);this.emptyMerge&&(h[r.$consumed]=!0);t[r.$appendChild](h);this._setAndBind(n,h);continue}this.emptyMerge&&(h[r.$consumed]=!0);h=[h]}}h?this._bindOccurrences(n,h,s):u>0?this._setAndBind(n,t):a.push(n)}a.forEach((e=>e[r.$getParent]()[r.$removeChild](e)))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Value=t.Text=t.TemplateNamespace=t.Template=t.SetProperty=t.Items=t.Field=t.BindItems=void 0;var r=a(77),n=a(79),i=a(83),s=a(84),o=a(78),c=a(2),l=a(85),h=a(6),u=a(80);const d=n.NamespaceIds.template.id,f="http://www.w3.org/2000/svg",g=/^H(\d+)$/,p=new Set(["image/gif","image/jpeg","image/jpg","image/pjpeg","image/png","image/apng","image/x-png","image/bmp","image/x-ms-bmp","image/tiff","image/tif","application/octet-stream"]),m=[[[66,77],"image/bmp"],[[255,216,255],"image/jpeg"],[[73,73,42,0],"image/tiff"],[[77,77,0,42],"image/tiff"],[[71,73,70,56,57,97],"image/gif"],[[137,80,78,71,13,10,26,10],"image/png"]];function getBorderDims(e){if(!e||!e.border)return{w:0,h:0};const t=e.border[r.$getExtra]();return t?{w:t.widths[0]+t.widths[2]+t.insets[0]+t.insets[2],h:t.widths[1]+t.widths[3]+t.insets[1]+t.insets[3]}:{w:0,h:0}}function hasMargin(e){return e.margin&&(e.margin.topInset||e.margin.rightInset||e.margin.bottomInset||e.margin.leftInset)}function _setValue(e,t){if(!e.value){const t=new Value({});e[r.$appendChild](t);e.value=t}e.value[r.$setValue](t)}function*getContainedChildren(e){for(const t of e[r.$getChildren]())t instanceof SubformSet?yield*t[r.$getContainedChildren]():yield t}function isRequired(e){return e.validate&&"error"===e.validate.nullTest}function setTabIndex(e){for(;e;){if(!e.traversal){e[r.$tabIndex]=e[r.$getParent]()[r.$tabIndex];return}if(e[r.$tabIndex])return;let t=null;for(const a of e.traversal[r.$getChildren]())if("next"===a.operation){t=a;break}if(!t||!t.ref){e[r.$tabIndex]=e[r.$getParent]()[r.$tabIndex];return}const a=e[r.$getTemplateRoot]();e[r.$tabIndex]=++a[r.$tabIndex];const n=a[r.$searchNode](t.ref,e);if(!n)return;e=n[0]}}function applyAssist(e,t){const a=e.assist;if(a){const e=a[r.$toHTML]();e&&(t.title=e);const n=a.role.match(g);if(n){const e="heading",a=n[1];t.role=e;t["aria-level"]=a}}if("table"===e.layout)t.role="table";else if("row"===e.layout)t.role="row";else{const a=e[r.$getParent]();"row"===a.layout&&(a.assist&&"TH"===a.assist.role?t.role="columnheader":t.role="cell")}}function ariaLabel(e){if(!e.assist)return null;const t=e.assist;return t.speak&&""!==t.speak[r.$content]?t.speak[r.$content]:t.toolTip?t.toolTip[r.$content]:null}function valueToHtml(e){return o.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:Object.create(null)},children:[{name:"span",attributes:{style:Object.create(null)},value:e}]})}function setFirstUnsplittable(e){const t=e[r.$getTemplateRoot]();if(null===t[r.$extra].firstUnsplittable){t[r.$extra].firstUnsplittable=e;t[r.$extra].noLayoutFailure=!0}}function unsetFirstUnsplittable(e){const t=e[r.$getTemplateRoot]();t[r.$extra].firstUnsplittable===e&&(t[r.$extra].noLayoutFailure=!1)}function handleBreak(e){if(e[r.$extra])return!1;e[r.$extra]=Object.create(null);if("auto"===e.targetType)return!1;const t=e[r.$getTemplateRoot]();let a=null;if(e.target){a=t[r.$searchNode](e.target,e[r.$getParent]());if(!a)return!1;a=a[0]}const{currentPageArea:n,currentContentArea:i}=t[r.$extra];if("pageArea"===e.targetType){a instanceof PageArea||(a=null);if(e.startNew){e[r.$extra].target=a||n;return!0}if(a&&a!==n){e[r.$extra].target=a;return!0}return!1}a instanceof ContentArea||(a=null);const s=a&&a[r.$getParent]();let o,c=s;if(e.startNew)if(a){const e=s.contentArea.children,t=e.indexOf(i),r=e.indexOf(a);-1!==t&&te;n[r.$extra].noLayoutFailure=!0;const o=t[r.$toHTML](a);e[r.$addHTML](o.html,o.bbox);n[r.$extra].noLayoutFailure=i;t[r.$getSubformParent]=s}class AppearanceFilter extends r.StringObject{constructor(e){super(d,"appearanceFilter");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Arc extends r.XFAObject{constructor(e){super(d,"arc",!0);this.circular=(0,o.getInteger)({data:e.circular,defaultValue:0,validate:e=>1===e});this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.startAngle=(0,o.getFloat)({data:e.startAngle,defaultValue:0,validate:e=>!0});this.sweepAngle=(0,o.getFloat)({data:e.sweepAngle,defaultValue:360,validate:e=>!0});this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null;this.fill=null}[r.$toHTML](){const e=this.edge||new Edge({}),t=e[r.$toStyle](),a=Object.create(null);this.fill&&"visible"===this.fill.presence?Object.assign(a,this.fill[r.$toStyle]()):a.fill="transparent";a.strokeWidth=(0,s.measureToString)("visible"===e.presence?e.thickness:0);a.stroke=t.color;let n;const i={xmlns:f,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)n={name:"ellipse",attributes:{xmlns:f,cx:"50%",cy:"50%",rx:"50%",ry:"50%",style:a}};else{const e=this.startAngle*Math.PI/180,t=this.sweepAngle*Math.PI/180,r=this.sweepAngle>180?1:0,[s,o,c,l]=[50*(1+Math.cos(e)),50*(1-Math.sin(e)),50*(1+Math.cos(e+t)),50*(1-Math.sin(e+t))];n={name:"path",attributes:{xmlns:f,d:`M ${s} ${o} A 50 50 0 ${r} 0 ${c} ${l}`,vectorEffect:"non-scaling-stroke",style:a}};Object.assign(i,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const c={name:"svg",children:[n],attributes:i};if(hasMargin(this[r.$getParent]()[r.$getParent]()))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[c]});c.attributes.style.position="absolute";return o.HTMLResult.success(c)}}class Area extends r.XFAObject{constructor(e){super(d,"area",!0);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.id=e.id||"";this.name=e.name||"";this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.desc=null;this.extras=null;this.area=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$isTransparent](){return!0}[r.$isBindable](){return!0}[r.$addHTML](e,t){const[a,n,i,s]=t;this[r.$extra].width=Math.max(this[r.$extra].width,a+i);this[r.$extra].height=Math.max(this[r.$extra].height,n+s);this[r.$extra].children.push(e)}[r.$getAvailableSpace](){return this[r.$extra].availableSpace}[r.$toHTML](e){const t=(0,s.toStyle)(this,"position"),a={style:t,id:this[r.$uid],class:["xfaArea"]};(0,s.isPrintOnly)(this)&&a.class.push("xfaPrintOnly");this.name&&(a.xfaName=this.name);const n=[];this[r.$extra]={children:n,width:0,height:0,availableSpace:e};const i=this[r.$childrenToHTML]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!i.success){if(i.isBreak())return i;delete this[r.$extra];return o.HTMLResult.FAILURE}t.width=(0,s.measureToString)(this[r.$extra].width);t.height=(0,s.measureToString)(this[r.$extra].height);const c={name:"div",attributes:a,children:n},l=[this.x,this.y,this[r.$extra].width,this[r.$extra].height];delete this[r.$extra];return o.HTMLResult.success(c,l)}}class Assist extends r.XFAObject{constructor(e){super(d,"assist",!0);this.id=e.id||"";this.role=e.role||"";this.use=e.use||"";this.usehref=e.usehref||"";this.speak=null;this.toolTip=null}[r.$toHTML](){return this.toolTip&&this.toolTip[r.$content]?this.toolTip[r.$content]:null}}class Barcode extends r.XFAObject{constructor(e){super(d,"barcode",!0);this.charEncoding=(0,o.getKeyword)({data:e.charEncoding?e.charEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.checksum=(0,o.getStringOption)(e.checksum,["none","1mod10","1mod10_1mod11","2mod10","auto"]);this.dataColumnCount=(0,o.getInteger)({data:e.dataColumnCount,defaultValue:-1,validate:e=>e>=0});this.dataLength=(0,o.getInteger)({data:e.dataLength,defaultValue:-1,validate:e=>e>=0});this.dataPrep=(0,o.getStringOption)(e.dataPrep,["none","flateCompress"]);this.dataRowCount=(0,o.getInteger)({data:e.dataRowCount,defaultValue:-1,validate:e=>e>=0});this.endChar=e.endChar||"";this.errorCorrectionLevel=(0,o.getInteger)({data:e.errorCorrectionLevel,defaultValue:-1,validate:e=>e>=0&&e<=8});this.id=e.id||"";this.moduleHeight=(0,o.getMeasurement)(e.moduleHeight,"5mm");this.moduleWidth=(0,o.getMeasurement)(e.moduleWidth,"0.25mm");this.printCheckDigit=(0,o.getInteger)({data:e.printCheckDigit,defaultValue:0,validate:e=>1===e});this.rowColumnRatio=(0,o.getRatio)(e.rowColumnRatio);this.startChar=e.startChar||"";this.textLocation=(0,o.getStringOption)(e.textLocation,["below","above","aboveEmbedded","belowEmbedded","none"]);this.truncate=(0,o.getInteger)({data:e.truncate,defaultValue:0,validate:e=>1===e});this.type=(0,o.getStringOption)(e.type?e.type.toLowerCase():"",["aztec","codabar","code2of5industrial","code2of5interleaved","code2of5matrix","code2of5standard","code3of9","code3of9extended","code11","code49","code93","code128","code128a","code128b","code128c","code128sscc","datamatrix","ean8","ean8add2","ean8add5","ean13","ean13add2","ean13add5","ean13pwcd","fim","logmars","maxicode","msi","pdf417","pdf417macro","plessey","postauscust2","postauscust3","postausreplypaid","postausstandard","postukrm4scc","postusdpbc","postusimb","postusstandard","postus5zip","qrcode","rfid","rss14","rss14expanded","rss14limited","rss14stacked","rss14stackedomni","rss14truncated","telepen","ucc128","ucc128random","ucc128sscc","upca","upcaadd2","upcaadd5","upcapwcd","upce","upceadd2","upceadd5","upcean2","upcean5","upsmaxicode"]);this.upsMode=(0,o.getStringOption)(e.upsMode,["usCarrier","internationalCarrier","secureSymbol","standardSymbol"]);this.use=e.use||"";this.usehref=e.usehref||"";this.wideNarrowRatio=(0,o.getRatio)(e.wideNarrowRatio);this.encrypt=null;this.extras=null}}class Bind extends r.XFAObject{constructor(e){super(d,"bind",!0);this.match=(0,o.getStringOption)(e.match,["once","dataRef","global","none"]);this.ref=e.ref||"";this.picture=null}}class BindItems extends r.XFAObject{constructor(e){super(d,"bindItems");this.connection=e.connection||"";this.labelRef=e.labelRef||"";this.ref=e.ref||"";this.valueRef=e.valueRef||""}}t.BindItems=BindItems;class Bookend extends r.XFAObject{constructor(e){super(d,"bookend");this.id=e.id||"";this.leader=e.leader||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}}class BooleanElement extends r.Option01{constructor(e){super(d,"boolean");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$toHTML](e){return valueToHtml(1===this[r.$content]?"1":"0")}}class Border extends r.XFAObject{constructor(e){super(d,"border",!0);this.break=(0,o.getStringOption)(e.break,["close","open"]);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new r.XFAObjectArray(4);this.edge=new r.XFAObjectArray(4);this.extras=null;this.fill=null;this.margin=null}[r.$getExtra](){if(!this[r.$extra]){const e=this.edge.children.slice();if(e.length<4){const t=e.at(-1)||new Edge({});for(let a=e.length;a<4;a++)e.push(t)}const t=e.map((e=>e.thickness)),a=[0,0,0,0];if(this.margin){a[0]=this.margin.topInset;a[1]=this.margin.rightInset;a[2]=this.margin.bottomInset;a[3]=this.margin.leftInset}this[r.$extra]={widths:t,insets:a,edges:e}}return this[r.$extra]}[r.$toStyle](){const{edges:e}=this[r.$getExtra](),t=e.map((e=>{const t=e[r.$toStyle]();t.color=t.color||"#000000";return t})),a=Object.create(null);this.margin&&Object.assign(a,this.margin[r.$toStyle]());this.fill&&"visible"===this.fill.presence&&Object.assign(a,this.fill[r.$toStyle]());if(this.corner.children.some((e=>0!==e.radius))){const e=this.corner.children.map((e=>e[r.$toStyle]()));if(2===e.length||3===e.length){const t=e.at(-1);for(let a=e.length;a<4;a++)e.push(t)}a.borderRadius=e.map((e=>e.radius)).join(" ")}switch(this.presence){case"invisible":case"hidden":a.borderStyle="";break;case"inactive":a.borderStyle="none";break;default:a.borderStyle=t.map((e=>e.style)).join(" ")}a.borderWidth=t.map((e=>e.width)).join(" ");a.borderColor=t.map((e=>e.color)).join(" ");return a}}class Break extends r.XFAObject{constructor(e){super(d,"break",!0);this.after=(0,o.getStringOption)(e.after,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.afterTarget=e.afterTarget||"";this.before=(0,o.getStringOption)(e.before,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.beforeTarget=e.beforeTarget||"";this.bookendLeader=e.bookendLeader||"";this.bookendTrailer=e.bookendTrailer||"";this.id=e.id||"";this.overflowLeader=e.overflowLeader||"";this.overflowTarget=e.overflowTarget||"";this.overflowTrailer=e.overflowTrailer||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class BreakAfter extends r.XFAObject{constructor(e){super(d,"breakAfter",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=(0,o.getStringOption)(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}}class BreakBefore extends r.XFAObject{constructor(e){super(d,"breakBefore",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=(0,o.getStringOption)(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}[r.$toHTML](e){this[r.$extra]={};return o.HTMLResult.FAILURE}}class Button extends r.XFAObject{constructor(e){super(d,"button",!0);this.highlight=(0,o.getStringOption)(e.highlight,["inverted","none","outline","push"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toHTML](e){const t=this[r.$getParent]()[r.$getParent](),a={name:"button",attributes:{id:this[r.$uid],class:["xfaButton"],style:{}},children:[]};for(const e of t.event.children){if("click"!==e.activity||!e.script)continue;const t=(0,h.recoverJsURL)(e.script[r.$content]);if(!t)continue;const n=(0,s.fixURL)(t.url);n&&a.children.push({name:"a",attributes:{id:"link"+this[r.$uid],href:n,newWindow:t.newWindow,class:["xfaLink"],style:{}},children:[]})}return o.HTMLResult.success(a)}}class Calculate extends r.XFAObject{constructor(e){super(d,"calculate",!0);this.id=e.id||"";this.override=(0,o.getStringOption)(e.override,["disabled","error","ignore","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.script=null}}class Caption extends r.XFAObject{constructor(e){super(d,"caption",!0);this.id=e.id||"";this.placement=(0,o.getStringOption)(e.placement,["left","bottom","inline","right","top"]);this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.reserve=Math.ceil((0,o.getMeasurement)(e.reserve));this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.font=null;this.margin=null;this.para=null;this.value=null}[r.$setValue](e){_setValue(this,e)}[r.$getExtra](e){if(!this[r.$extra]){let{width:t,height:a}=e;switch(this.placement){case"left":case"right":case"inline":t=this.reserve<=0?t:this.reserve;break;case"top":case"bottom":a=this.reserve<=0?a:this.reserve}this[r.$extra]=(0,s.layoutNode)(this,{width:t,height:a})}return this[r.$extra]}[r.$toHTML](e){if(!this.value)return o.HTMLResult.EMPTY;this[r.$pushPara]();const t=this.value[r.$toHTML](e).html;if(!t){this[r.$popPara]();return o.HTMLResult.EMPTY}const a=this.reserve;if(this.reserve<=0){const{w:t,h:a}=this[r.$getExtra](e);switch(this.placement){case"left":case"right":case"inline":this.reserve=t;break;case"top":case"bottom":this.reserve=a}}const n=[];"string"==typeof t?n.push({name:"#text",value:t}):n.push(t);const i=(0,s.toStyle)(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(i.width=(0,s.measureToString)(this.reserve));break;case"top":case"bottom":this.reserve>0&&(i.height=(0,s.measureToString)(this.reserve))}(0,s.setPara)(this,null,t);this[r.$popPara]();this.reserve=a;return o.HTMLResult.success({name:"div",attributes:{style:i,class:["xfaCaption"]},children:n})}}class Certificate extends r.StringObject{constructor(e){super(d,"certificate");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Certificates extends r.XFAObject{constructor(e){super(d,"certificates",!0);this.credentialServerPolicy=(0,o.getStringOption)(e.credentialServerPolicy,["optional","required"]);this.id=e.id||"";this.url=e.url||"";this.urlPolicy=e.urlPolicy||"";this.use=e.use||"";this.usehref=e.usehref||"";this.encryption=null;this.issuers=null;this.keyUsage=null;this.oids=null;this.signing=null;this.subjectDNs=null}}class CheckButton extends r.XFAObject{constructor(e){super(d,"checkButton",!0);this.id=e.id||"";this.mark=(0,o.getStringOption)(e.mark,["default","check","circle","cross","diamond","square","star"]);this.shape=(0,o.getStringOption)(e.shape,["square","round"]);this.size=(0,o.getMeasurement)(e.size,"10pt");this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)("margin"),a=(0,s.measureToString)(this.size);t.width=t.height=a;let n,i,c;const l=this[r.$getParent]()[r.$getParent](),h=l.items.children.length&&l.items.children[0][r.$toHTML]().html||[],u={on:(void 0!==h[0]?h[0]:"on").toString(),off:(void 0!==h[1]?h[1]:"off").toString()},d=(l.value&&l.value[r.$text]()||"off")===u.on||void 0,f=l[r.$getSubformParent](),g=l[r.$uid];let p;if(f instanceof ExclGroup){c=f[r.$uid];n="radio";i="xfaRadio";p=f[r.$data]&&f[r.$data][r.$uid]||f[r.$uid]}else{n="checkbox";i="xfaCheckbox";p=l[r.$data]&&l[r.$data][r.$uid]||l[r.$uid]}const m={name:"input",attributes:{class:[i],style:t,fieldId:g,dataId:p,type:n,checked:d,xfaOn:u.on,xfaOff:u.off,"aria-label":ariaLabel(l),"aria-required":!1}};c&&(m.attributes.name=c);if(isRequired(l)){m.attributes["aria-required"]=!0;m.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[m]})}}class ChoiceList extends r.XFAObject{constructor(e){super(d,"choiceList",!0);this.commitOn=(0,o.getStringOption)(e.commitOn,["select","exit"]);this.id=e.id||"";this.open=(0,o.getStringOption)(e.open,["userControl","always","multiSelect","onEntry"]);this.textEntry=(0,o.getInteger)({data:e.textEntry,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","margin"),a=this[r.$getParent]()[r.$getParent](),n={fontSize:`calc(${a.font&&a.font.size||10}px * var(--scale-factor))`},i=[];if(a.items.children.length>0){const e=a.items;let t=0,s=0;if(2===e.children.length){t=e.children[0].save;s=1-t}const o=e.children[t][r.$toHTML]().html,c=e.children[s][r.$toHTML]().html;let l=!1;const h=a.value&&a.value[r.$text]()||"";for(let e=0,t=o.length;ee>=0});this.use=e.use||"";this.usehref=e.usehref||""}}class Connect extends r.XFAObject{constructor(e){super(d,"connect",!0);this.connection=e.connection||"";this.id=e.id||"";this.ref=e.ref||"";this.usage=(0,o.getStringOption)(e.usage,["exportAndImport","exportOnly","importOnly"]);this.use=e.use||"";this.usehref=e.usehref||"";this.picture=null}}class ContentArea extends r.XFAObject{constructor(e){super(d,"contentArea",!0);this.h=(0,o.getMeasurement)(e.h);this.id=e.id||"";this.name=e.name||"";this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=(0,o.getMeasurement)(e.w);this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.desc=null;this.extras=null}[r.$toHTML](e){const t={left:(0,s.measureToString)(this.x),top:(0,s.measureToString)(this.y),width:(0,s.measureToString)(this.w),height:(0,s.measureToString)(this.h)},a=["xfaContentarea"];(0,s.isPrintOnly)(this)&&a.push("xfaPrintOnly");return o.HTMLResult.success({name:"div",children:[],attributes:{style:t,class:a,id:this[r.$uid]}})}}class Corner extends r.XFAObject{constructor(e){super(d,"corner",!0);this.id=e.id||"";this.inverted=(0,o.getInteger)({data:e.inverted,defaultValue:0,validate:e=>1===e});this.join=(0,o.getStringOption)(e.join,["square","round"]);this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.radius=(0,o.getMeasurement)(e.radius);this.stroke=(0,o.getStringOption)(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=(0,o.getMeasurement)(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"visibility");e.radius=(0,s.measureToString)("square"===this.join?0:this.radius);return e}}class DateElement extends r.ContentObject{constructor(e){super(d,"date");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class DateTime extends r.ContentObject{constructor(e){super(d,"dateTime");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class DateTimeEdit extends r.XFAObject{constructor(e){super(d,"dateTimeEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.picker=(0,o.getStringOption)(e.picker,["host","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin"),a=this[r.$getParent]()[r.$getParent](),n={name:"input",attributes:{type:"text",fieldId:a[r.$uid],dataId:a[r.$data]&&a[r.$data][r.$uid]||a[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Decimal extends r.ContentObject{constructor(e){super(d,"decimal");this.fracDigits=(0,o.getInteger)({data:e.fracDigits,defaultValue:2,validate:e=>!0});this.id=e.id||"";this.leadDigits=(0,o.getInteger)({data:e.leadDigits,defaultValue:-1,validate:e=>!0});this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseFloat(this[r.$content].trim());this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class DefaultUi extends r.XFAObject{constructor(e){super(d,"defaultUi",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class Desc extends r.XFAObject{constructor(e){super(d,"desc",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}}class DigestMethod extends r.OptionObject{constructor(e){super(d,"digestMethod",["","SHA1","SHA256","SHA512","RIPEMD160"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class DigestMethods extends r.XFAObject{constructor(e){super(d,"digestMethods",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.digestMethod=new r.XFAObjectArray}}class Draw extends r.XFAObject{constructor(e){super(d,"draw",!0);this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.rotate=(0,o.getInteger)({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.border=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.value=null;this.setProperty=new r.XFAObjectArray}[r.$setValue](e){_setValue(this,e)}[r.$toHTML](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);this[r.$pushPara]();const t=this.w,a=this.h,{w:n,h:c,isBroken:l}=(0,s.layoutNode)(this,e);if(n&&""===this.w){if(l&&this[r.$getSubformParent]()[r.$isThereMoreWidth]()){this[r.$popPara]();return o.HTMLResult.FAILURE}this.w=n}c&&""===this.h&&(this.h=c);setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e)){this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.FAILURE}unsetFirstUnsplittable(this);const h=(0,s.toStyle)(this,"font","hAlign","dimensions","position","presence","rotate","anchorType","border","margin");(0,s.setMinMaxDimensions)(this,h);if(h.margin){h.padding=h.margin;delete h.margin}const u=["xfaDraw"];this.font&&u.push("xfaFont");(0,s.isPrintOnly)(this)&&u.push("xfaPrintOnly");const d={style:h,id:this[r.$uid],class:u};this.name&&(d.xfaName=this.name);const f={name:"div",attributes:d,children:[]};applyAssist(this,d);const g=(0,s.computeBbox)(this,f,e),p=this.value?this.value[r.$toHTML](e).html:null;if(null===p){this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.success((0,s.createWrapper)(this,f),g)}f.children.push(p);(0,s.setPara)(this,h,p);this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.success((0,s.createWrapper)(this,f),g)}}class Edge extends r.XFAObject{constructor(e){super(d,"edge",!0);this.cap=(0,o.getStringOption)(e.cap,["square","butt","round"]);this.id=e.id||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.stroke=(0,o.getStringOption)(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=(0,o.getMeasurement)(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"visibility");Object.assign(e,{linecap:this.cap,width:(0,s.measureToString)(this.thickness),color:this.color?this.color[r.$toStyle]():"#000000",style:""});if("visible"!==this.presence)e.style="none";else switch(this.stroke){case"solid":e.style="solid";break;case"dashDot":case"dashDotDot":case"dashed":e.style="dashed";break;case"dotted":e.style="dotted";break;case"embossed":e.style="ridge";break;case"etched":e.style="groove";break;case"lowered":e.style="inset";break;case"raised":e.style="outset"}return e}}class Encoding extends r.OptionObject{constructor(e){super(d,"encoding",["adbe.x509.rsa_sha1","adbe.pkcs7.detached","adbe.pkcs7.sha1"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Encodings extends r.XFAObject{constructor(e){super(d,"encodings",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encoding=new r.XFAObjectArray}}class Encrypt extends r.XFAObject{constructor(e){super(d,"encrypt",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=null}}class EncryptData extends r.XFAObject{constructor(e){super(d,"encryptData",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["encrypt","decrypt"]);this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Encryption extends r.XFAObject{constructor(e){super(d,"encryption",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class EncryptionMethod extends r.OptionObject{constructor(e){super(d,"encryptionMethod",["","AES256-CBC","TRIPLEDES-CBC","AES128-CBC","AES192-CBC"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EncryptionMethods extends r.XFAObject{constructor(e){super(d,"encryptionMethods",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encryptionMethod=new r.XFAObjectArray}}class Event extends r.XFAObject{constructor(e){super(d,"event",!0);this.activity=(0,o.getStringOption)(e.activity,["click","change","docClose","docReady","enter","exit","full","indexChange","initialize","mouseDown","mouseEnter","mouseExit","mouseUp","postExecute","postOpen","postPrint","postSave","postSign","postSubmit","preExecute","preOpen","prePrint","preSave","preSign","preSubmit","ready","validationState"]);this.id=e.id||"";this.listen=(0,o.getStringOption)(e.listen,["refOnly","refAndDescendents"]);this.name=e.name||"";this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.encryptData=null;this.execute=null;this.script=null;this.signData=null;this.submit=null}}class ExData extends r.ContentObject{constructor(e){super(d,"exData");this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.maxLength=(0,o.getInteger)({data:e.maxLength,defaultValue:-1,validate:e=>e>=-1});this.name=e.name||"";this.rid=e.rid||"";this.transferEncoding=(0,o.getStringOption)(e.transferEncoding,["none","base64","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$isCDATAXml](){return"text/html"===this.contentType}[r.$onChild](e){if("text/html"===this.contentType&&e[r.$namespaceId]===n.NamespaceIds.xhtml.id){this[r.$content]=e;return!0}if("text/xml"===this.contentType){this[r.$content]=e;return!0}return!1}[r.$toHTML](e){return"text/html"===this.contentType&&this[r.$content]?this[r.$content][r.$toHTML](e):o.HTMLResult.EMPTY}}class ExObject extends r.XFAObject{constructor(e){super(d,"exObject",!0);this.archive=e.archive||"";this.classId=e.classId||"";this.codeBase=e.codeBase||"";this.codeType=e.codeType||"";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}}class ExclGroup extends r.XFAObject{constructor(e){super(d,"exclGroup",!0);this.access=(0,o.getStringOption)(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=(0,o.getStringOption)(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.margin=null;this.para=null;this.traversal=null;this.validate=null;this.connect=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray}[r.$isBindable](){return!0}[r.$hasSettableValue](){return!0}[r.$setValue](e){for(const t of this.field.children){if(!t.value){const e=new Value({});t[r.$appendChild](e);t.value=e}t.value[r.$setValue](e)}}[r.$isThereMoreWidth](){return this.layout.endsWith("-tb")&&0===this[r.$extra].attempt&&this[r.$extra].numberInLine>0||this[r.$getParent]()[r.$isThereMoreWidth]()}[r.$isSplittable](){const e=this[r.$getSubformParent]();if(!e[r.$isSplittable]())return!1;if(void 0!==this[r.$extra]._isSplittable)return this[r.$extra]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[r.$extra]._isSplittable=!1;return!1}if(e.layout&&e.layout.endsWith("-tb")&&0!==e[r.$extra].numberInLine)return!1;this[r.$extra]._isSplittable=!0;return!0}[r.$flushHTML](){return(0,i.flushHTML)(this)}[r.$addHTML](e,t){(0,i.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,i.getAvailableSpace)(this)}[r.$toHTML](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);const t=[],a={id:this[r.$uid],class:[]};(0,s.setAccess)(this,a.class);this[r.$extra]||(this[r.$extra]=Object.create(null));Object.assign(this[r.$extra],{children:t,attributes:a,attempt:0,line:null,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[r.$isSplittable]();n||setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e))return o.HTMLResult.FAILURE;const c=new Set(["field"]);if(this.layout.includes("row")){const e=this[r.$getSubformParent]().columnWidths;if(Array.isArray(e)&&e.length>0){this[r.$extra].columnWidths=e;this[r.$extra].currentColumn=0}}const l=(0,s.toStyle)(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),h=["xfaExclgroup"],u=(0,s.layoutClass)(this);u&&h.push(u);(0,s.isPrintOnly)(this)&&h.push("xfaPrintOnly");a.style=l;a.class=h;this.name&&(a.xfaName=this.name);this[r.$pushPara]();const d="lr-tb"===this.layout||"rl-tb"===this.layout,f=d?2:1;for(;this[r.$extra].attempte>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.rotate=(0,o.getInteger)({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.format=null;this.items=new r.XFAObjectArray(2);this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.validate=null;this.value=null;this.bindItems=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray}[r.$isBindable](){return!0}[r.$setValue](e){_setValue(this,e)}[r.$toHTML](e){setTabIndex(this);if(!this.ui){this.ui=new Ui({});this.ui[r.$globalData]=this[r.$globalData];this[r.$appendChild](this.ui);let e;switch(this.items.children.length){case 0:e=new TextEdit({});this.ui.textEdit=e;break;case 1:e=new CheckButton({});this.ui.checkButton=e;break;case 2:e=new ChoiceList({});this.ui.choiceList=e}this.ui[r.$appendChild](e)}if(!this.ui||"hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return o.HTMLResult.EMPTY;this.caption&&delete this.caption[r.$extra];this[r.$pushPara]();const t=this.caption?this.caption[r.$toHTML](e).html:null,a=this.w,n=this.h;let c=0,h=0;if(this.margin){c=this.margin.leftInset+this.margin.rightInset;h=this.margin.topInset+this.margin.bottomInset}let u=null;if(""===this.w||""===this.h){let t=null,a=null,n=0,i=0;if(this.ui.checkButton)n=i=this.ui.checkButton.size;else{const{w:t,h:a}=(0,s.layoutNode)(this,e);if(null!==t){n=t;i=a}else i=(0,l.getMetrics)(this.font,!0).lineNoGap}u=getBorderDims(this.ui[r.$getExtra]());n+=u.w;i+=u.h;if(this.caption){const{w:s,h:c,isBroken:l}=this.caption[r.$getExtra](e);if(l&&this[r.$getSubformParent]()[r.$isThereMoreWidth]()){this[r.$popPara]();return o.HTMLResult.FAILURE}t=s;a=c;switch(this.caption.placement){case"left":case"right":case"inline":t+=n;break;case"top":case"bottom":a+=i}}else{t=n;a=i}if(t&&""===this.w){t+=c;this.w=Math.min(this.maxW<=0?1/0:this.maxW,this.minW+1e>=1&&e<=5});this.appearanceFilter=null;this.certificates=null;this.digestMethods=null;this.encodings=null;this.encryptionMethods=null;this.handler=null;this.lockDocument=null;this.mdp=null;this.reasons=null;this.timeStamp=null}}class Float extends r.ContentObject{constructor(e){super(d,"float");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseFloat(this[r.$content].trim());this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class Font extends r.XFAObject{constructor(e){super(d,"font",!0);this.baselineShift=(0,o.getMeasurement)(e.baselineShift);this.fontHorizontalScale=(0,o.getFloat)({data:e.fontHorizontalScale,defaultValue:100,validate:e=>e>=0});this.fontVerticalScale=(0,o.getFloat)({data:e.fontVerticalScale,defaultValue:100,validate:e=>e>=0});this.id=e.id||"";this.kerningMode=(0,o.getStringOption)(e.kerningMode,["none","pair"]);this.letterSpacing=(0,o.getMeasurement)(e.letterSpacing,"0");this.lineThrough=(0,o.getInteger)({data:e.lineThrough,defaultValue:0,validate:e=>1===e||2===e});this.lineThroughPeriod=(0,o.getStringOption)(e.lineThroughPeriod,["all","word"]);this.overline=(0,o.getInteger)({data:e.overline,defaultValue:0,validate:e=>1===e||2===e});this.overlinePeriod=(0,o.getStringOption)(e.overlinePeriod,["all","word"]);this.posture=(0,o.getStringOption)(e.posture,["normal","italic"]);this.size=(0,o.getMeasurement)(e.size,"10pt");this.typeface=e.typeface||"Courier";this.underline=(0,o.getInteger)({data:e.underline,defaultValue:0,validate:e=>1===e||2===e});this.underlinePeriod=(0,o.getStringOption)(e.underlinePeriod,["all","word"]);this.use=e.use||"";this.usehref=e.usehref||"";this.weight=(0,o.getStringOption)(e.weight,["normal","bold"]);this.extras=null;this.fill=null}[r.$clean](e){super[r.$clean](e);this[r.$globalData].usedTypefaces.add(this.typeface)}[r.$toStyle](){const e=(0,s.toStyle)(this,"fill"),t=e.color;if(t)if("#000000"===t)delete e.color;else if(!t.startsWith("#")){e.background=t;e.backgroundClip="text";e.color="transparent"}this.baselineShift&&(e.verticalAlign=(0,s.measureToString)(this.baselineShift));e.fontKerning="none"===this.kerningMode?"none":"normal";e.letterSpacing=(0,s.measureToString)(this.letterSpacing);if(0!==this.lineThrough){e.textDecoration="line-through";2===this.lineThrough&&(e.textDecorationStyle="double")}if(0!==this.overline){e.textDecoration="overline";2===this.overline&&(e.textDecorationStyle="double")}e.fontStyle=this.posture;e.fontSize=(0,s.measureToString)(.99*this.size);(0,s.setFontFamily)(this,this,this[r.$globalData].fontFinder,e);if(0!==this.underline){e.textDecoration="underline";2===this.underline&&(e.textDecorationStyle="double")}e.fontWeight=this.weight;return e}}class Format extends r.XFAObject{constructor(e){super(d,"format",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null}}class Handler extends r.StringObject{constructor(e){super(d,"handler");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Hyphenation extends r.XFAObject{constructor(e){super(d,"hyphenation");this.excludeAllCaps=(0,o.getInteger)({data:e.excludeAllCaps,defaultValue:0,validate:e=>1===e});this.excludeInitialCap=(0,o.getInteger)({data:e.excludeInitialCap,defaultValue:0,validate:e=>1===e});this.hyphenate=(0,o.getInteger)({data:e.hyphenate,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.pushCharacterCount=(0,o.getInteger)({data:e.pushCharacterCount,defaultValue:3,validate:e=>e>=0});this.remainCharacterCount=(0,o.getInteger)({data:e.remainCharacterCount,defaultValue:3,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||"";this.wordCharacterCount=(0,o.getInteger)({data:e.wordCharacterCount,defaultValue:7,validate:e=>e>=0})}}class Image extends r.StringObject{constructor(e){super(d,"image");this.aspect=(0,o.getStringOption)(e.aspect,["fit","actual","height","none","width"]);this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.name=e.name||"";this.transferEncoding=(0,o.getStringOption)(e.transferEncoding,["base64","none","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$toHTML](){if(this.contentType&&!p.has(this.contentType.toLowerCase()))return o.HTMLResult.EMPTY;let e=this[r.$globalData].images&&this[r.$globalData].images.get(this.href);if(!e&&(this.href||!this[r.$content]))return o.HTMLResult.EMPTY;e||"base64"!==this.transferEncoding||(e=(0,c.stringToBytes)(atob(this[r.$content])));if(!e)return o.HTMLResult.EMPTY;if(!this.contentType){for(const[t,a]of m)if(e.length>t.length&&t.every(((t,a)=>t===e[a]))){this.contentType=a;break}if(!this.contentType)return o.HTMLResult.EMPTY}const t=new Blob([e],{type:this.contentType});let a;switch(this.aspect){case"fit":case"actual":break;case"height":a={height:"100%",objectFit:"fill"};break;case"none":a={width:"100%",height:"100%",objectFit:"fill"};break;case"width":a={width:"100%",objectFit:"fill"}}const n=this[r.$getParent]();return o.HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:a,src:URL.createObjectURL(t),alt:n?ariaLabel(n[r.$getParent]()):null}})}}class ImageEdit extends r.XFAObject{constructor(e){super(d,"imageEdit",!0);this.data=(0,o.getStringOption)(e.data,["link","embed"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){return"embed"===this.data?o.HTMLResult.success({name:"div",children:[],attributes:{}}):o.HTMLResult.EMPTY}}class Integer extends r.ContentObject{constructor(e){super(d,"integer");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseInt(this[r.$content].trim(),10);this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class Issuers extends r.XFAObject{constructor(e){super(d,"issuers",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class Items extends r.XFAObject{constructor(e){super(d,"items",!0);this.id=e.id||"";this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.ref=e.ref||"";this.save=(0,o.getInteger)({data:e.save,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}[r.$toHTML](){const e=[];for(const t of this[r.$getChildren]())e.push(t[r.$text]());return o.HTMLResult.success(e)}}t.Items=Items;class Keep extends r.XFAObject{constructor(e){super(d,"keep",!0);this.id=e.id||"";const t=["none","contentArea","pageArea"];this.intact=(0,o.getStringOption)(e.intact,t);this.next=(0,o.getStringOption)(e.next,t);this.previous=(0,o.getStringOption)(e.previous,t);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class KeyUsage extends r.XFAObject{constructor(e){super(d,"keyUsage");const t=["","yes","no"];this.crlSign=(0,o.getStringOption)(e.crlSign,t);this.dataEncipherment=(0,o.getStringOption)(e.dataEncipherment,t);this.decipherOnly=(0,o.getStringOption)(e.decipherOnly,t);this.digitalSignature=(0,o.getStringOption)(e.digitalSignature,t);this.encipherOnly=(0,o.getStringOption)(e.encipherOnly,t);this.id=e.id||"";this.keyAgreement=(0,o.getStringOption)(e.keyAgreement,t);this.keyCertSign=(0,o.getStringOption)(e.keyCertSign,t);this.keyEncipherment=(0,o.getStringOption)(e.keyEncipherment,t);this.nonRepudiation=(0,o.getStringOption)(e.nonRepudiation,t);this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Line extends r.XFAObject{constructor(e){super(d,"line",!0);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.slope=(0,o.getStringOption)(e.slope,["\\","/"]);this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null}[r.$toHTML](){const e=this[r.$getParent]()[r.$getParent](),t=this.edge||new Edge({}),a=t[r.$toStyle](),n=Object.create(null),i="visible"===t.presence?t.thickness:0;n.strokeWidth=(0,s.measureToString)(i);n.stroke=a.color;let c,l,h,u,d="100%",g="100%";if(e.w<=i){[c,l,h,u]=["50%",0,"50%","100%"];d=n.strokeWidth}else if(e.h<=i){[c,l,h,u]=[0,"50%","100%","50%"];g=n.strokeWidth}else"\\"===this.slope?[c,l,h,u]=[0,0,"100%","100%"]:[c,l,h,u]=[0,"100%","100%",0];const p={name:"svg",children:[{name:"line",attributes:{xmlns:f,x1:c,y1:l,x2:h,y2:u,style:n}}],attributes:{xmlns:f,width:d,height:g,style:{overflow:"visible"}}};if(hasMargin(e))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[p]});p.attributes.style.position="absolute";return o.HTMLResult.success(p)}}class Linear extends r.XFAObject{constructor(e){super(d,"linear",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["toRight","toBottom","toLeft","toTop"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";return`linear-gradient(${this.type.replace(/([RBLT])/," $1").toLowerCase()}, ${e}, ${this.color?this.color[r.$toStyle]():"#000000"})`}}class LockDocument extends r.ContentObject{constructor(e){super(d,"lockDocument");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){this[r.$content]=(0,o.getStringOption)(this[r.$content],["auto","0","1"])}}class Manifest extends r.XFAObject{constructor(e){super(d,"manifest",!0);this.action=(0,o.getStringOption)(e.action,["include","all","exclude"]);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.ref=new r.XFAObjectArray}}class Margin extends r.XFAObject{constructor(e){super(d,"margin",!0);this.bottomInset=(0,o.getMeasurement)(e.bottomInset,"0");this.id=e.id||"";this.leftInset=(0,o.getMeasurement)(e.leftInset,"0");this.rightInset=(0,o.getMeasurement)(e.rightInset,"0");this.topInset=(0,o.getMeasurement)(e.topInset,"0");this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toStyle](){return{margin:(0,s.measureToString)(this.topInset)+" "+(0,s.measureToString)(this.rightInset)+" "+(0,s.measureToString)(this.bottomInset)+" "+(0,s.measureToString)(this.leftInset)}}}class Mdp extends r.XFAObject{constructor(e){super(d,"mdp");this.id=e.id||"";this.permissions=(0,o.getInteger)({data:e.permissions,defaultValue:2,validate:e=>1===e||3===e});this.signatureType=(0,o.getStringOption)(e.signatureType,["filler","author"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Medium extends r.XFAObject{constructor(e){super(d,"medium");this.id=e.id||"";this.imagingBBox=(0,o.getBBox)(e.imagingBBox);this.long=(0,o.getMeasurement)(e.long);this.orientation=(0,o.getStringOption)(e.orientation,["portrait","landscape"]);this.short=(0,o.getMeasurement)(e.short);this.stock=e.stock||"";this.trayIn=(0,o.getStringOption)(e.trayIn,["auto","delegate","pageFront"]);this.trayOut=(0,o.getStringOption)(e.trayOut,["auto","delegate"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Message extends r.XFAObject{constructor(e){super(d,"message",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.text=new r.XFAObjectArray}}class NumericEdit extends r.XFAObject{constructor(e){super(d,"numericEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin"),a=this[r.$getParent]()[r.$getParent](),n={name:"input",attributes:{type:"text",fieldId:a[r.$uid],dataId:a[r.$data]&&a[r.$data][r.$uid]||a[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Occur extends r.XFAObject{constructor(e){super(d,"occur",!0);this.id=e.id||"";this.initial=""!==e.initial?(0,o.getInteger)({data:e.initial,defaultValue:"",validate:e=>!0}):"";this.max=""!==e.max?(0,o.getInteger)({data:e.max,defaultValue:1,validate:e=>!0}):"";this.min=""!==e.min?(0,o.getInteger)({data:e.min,defaultValue:1,validate:e=>!0}):"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$clean](){const e=this[r.$getParent](),t=this.min;""===this.min&&(this.min=e instanceof PageArea||e instanceof PageSet?0:1);""===this.max&&(this.max=""===t?e instanceof PageArea||e instanceof PageSet?-1:1:this.min);-1!==this.max&&this.max!0});this.name=e.name||"";this.numbered=(0,o.getInteger)({data:e.numbered,defaultValue:1,validate:e=>!0});this.oddOrEven=(0,o.getStringOption)(e.oddOrEven,["any","even","odd"]);this.pagePosition=(0,o.getStringOption)(e.pagePosition,["any","first","last","only","rest"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.desc=null;this.extras=null;this.medium=null;this.occur=null;this.area=new r.XFAObjectArray;this.contentArea=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.subform=new r.XFAObjectArray}[r.$isUsable](){if(!this[r.$extra]){this[r.$extra]={numberOfUse:0};return!0}return!this.occur||-1===this.occur.max||this[r.$extra].numberOfUsee.oddOrEven===t&&e.pagePosition===a));if(n)return n;n=this.pageArea.children.find((e=>"any"===e.oddOrEven&&e.pagePosition===a));if(n)return n;n=this.pageArea.children.find((e=>"any"===e.oddOrEven&&"any"===e.pagePosition));return n||this.pageArea.children[0]}}class Para extends r.XFAObject{constructor(e){super(d,"para",!0);this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.lineHeight=e.lineHeight?(0,o.getMeasurement)(e.lineHeight,"0pt"):"";this.marginLeft=e.marginLeft?(0,o.getMeasurement)(e.marginLeft,"0pt"):"";this.marginRight=e.marginRight?(0,o.getMeasurement)(e.marginRight,"0pt"):"";this.orphans=(0,o.getInteger)({data:e.orphans,defaultValue:0,validate:e=>e>=0});this.preserve=e.preserve||"";this.radixOffset=e.radixOffset?(0,o.getMeasurement)(e.radixOffset,"0pt"):"";this.spaceAbove=e.spaceAbove?(0,o.getMeasurement)(e.spaceAbove,"0pt"):"";this.spaceBelow=e.spaceBelow?(0,o.getMeasurement)(e.spaceBelow,"0pt"):"";this.tabDefault=e.tabDefault?(0,o.getMeasurement)(this.tabDefault):"";this.tabStops=(e.tabStops||"").trim().split(/\s+/).map(((e,t)=>t%2==1?(0,o.getMeasurement)(e):e));this.textIndent=e.textIndent?(0,o.getMeasurement)(e.textIndent,"0pt"):"";this.use=e.use||"";this.usehref=e.usehref||"";this.vAlign=(0,o.getStringOption)(e.vAlign,["top","bottom","middle"]);this.widows=(0,o.getInteger)({data:e.widows,defaultValue:0,validate:e=>e>=0});this.hyphenation=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"hAlign");""!==this.marginLeft&&(e.paddingLeft=(0,s.measureToString)(this.marginLeft));""!==this.marginRight&&(e.paddingight=(0,s.measureToString)(this.marginRight));""!==this.spaceAbove&&(e.paddingTop=(0,s.measureToString)(this.spaceAbove));""!==this.spaceBelow&&(e.paddingBottom=(0,s.measureToString)(this.spaceBelow));if(""!==this.textIndent){e.textIndent=(0,s.measureToString)(this.textIndent);(0,s.fixTextIndent)(e)}this.lineHeight>0&&(e.lineHeight=(0,s.measureToString)(this.lineHeight));""!==this.tabDefault&&(e.tabSize=(0,s.measureToString)(this.tabDefault));this.tabStops.length;this.hyphenatation&&Object.assign(e,this.hyphenatation[r.$toStyle]());return e}}class PasswordEdit extends r.XFAObject{constructor(e){super(d,"passwordEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.passwordChar=e.passwordChar||"*";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}}class Pattern extends r.XFAObject{constructor(e){super(d,"pattern",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["crossHatch","crossDiagonal","diagonalLeft","diagonalRight","horizontal","vertical"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";const t=this.color?this.color[r.$toStyle]():"#000000",a="repeating-linear-gradient",n=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${a}(to top,${n}) ${a}(to right,${n})`;case"crossDiagonal":return`${a}(45deg,${n}) ${a}(-45deg,${n})`;case"diagonalLeft":return`${a}(45deg,${n})`;case"diagonalRight":return`${a}(-45deg,${n})`;case"horizontal":return`${a}(to top,${n})`;case"vertical":return`${a}(to right,${n})`}return""}}class Picture extends r.StringObject{constructor(e){super(d,"picture");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Proto extends r.XFAObject{constructor(e){super(d,"proto",!0);this.appearanceFilter=new r.XFAObjectArray;this.arc=new r.XFAObjectArray;this.area=new r.XFAObjectArray;this.assist=new r.XFAObjectArray;this.barcode=new r.XFAObjectArray;this.bindItems=new r.XFAObjectArray;this.bookend=new r.XFAObjectArray;this.boolean=new r.XFAObjectArray;this.border=new r.XFAObjectArray;this.break=new r.XFAObjectArray;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.button=new r.XFAObjectArray;this.calculate=new r.XFAObjectArray;this.caption=new r.XFAObjectArray;this.certificate=new r.XFAObjectArray;this.certificates=new r.XFAObjectArray;this.checkButton=new r.XFAObjectArray;this.choiceList=new r.XFAObjectArray;this.color=new r.XFAObjectArray;this.comb=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.contentArea=new r.XFAObjectArray;this.corner=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.dateTimeEdit=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.defaultUi=new r.XFAObjectArray;this.desc=new r.XFAObjectArray;this.digestMethod=new r.XFAObjectArray;this.digestMethods=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.edge=new r.XFAObjectArray;this.encoding=new r.XFAObjectArray;this.encodings=new r.XFAObjectArray;this.encrypt=new r.XFAObjectArray;this.encryptData=new r.XFAObjectArray;this.encryption=new r.XFAObjectArray;this.encryptionMethod=new r.XFAObjectArray;this.encryptionMethods=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.execute=new r.XFAObjectArray;this.extras=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.fill=new r.XFAObjectArray;this.filter=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.font=new r.XFAObjectArray;this.format=new r.XFAObjectArray;this.handler=new r.XFAObjectArray;this.hyphenation=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.imageEdit=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.issuers=new r.XFAObjectArray;this.items=new r.XFAObjectArray;this.keep=new r.XFAObjectArray;this.keyUsage=new r.XFAObjectArray;this.line=new r.XFAObjectArray;this.linear=new r.XFAObjectArray;this.lockDocument=new r.XFAObjectArray;this.manifest=new r.XFAObjectArray;this.margin=new r.XFAObjectArray;this.mdp=new r.XFAObjectArray;this.medium=new r.XFAObjectArray;this.message=new r.XFAObjectArray;this.numericEdit=new r.XFAObjectArray;this.occur=new r.XFAObjectArray;this.oid=new r.XFAObjectArray;this.oids=new r.XFAObjectArray;this.overflow=new r.XFAObjectArray;this.pageArea=new r.XFAObjectArray;this.pageSet=new r.XFAObjectArray;this.para=new r.XFAObjectArray;this.passwordEdit=new r.XFAObjectArray;this.pattern=new r.XFAObjectArray;this.picture=new r.XFAObjectArray;this.radial=new r.XFAObjectArray;this.reason=new r.XFAObjectArray;this.reasons=new r.XFAObjectArray;this.rectangle=new r.XFAObjectArray;this.ref=new r.XFAObjectArray;this.script=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray;this.signData=new r.XFAObjectArray;this.signature=new r.XFAObjectArray;this.signing=new r.XFAObjectArray;this.solid=new r.XFAObjectArray;this.speak=new r.XFAObjectArray;this.stipple=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray;this.subjectDN=new r.XFAObjectArray;this.subjectDNs=new r.XFAObjectArray;this.submit=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.textEdit=new r.XFAObjectArray;this.time=new r.XFAObjectArray;this.timeStamp=new r.XFAObjectArray;this.toolTip=new r.XFAObjectArray;this.traversal=new r.XFAObjectArray;this.traverse=new r.XFAObjectArray;this.ui=new r.XFAObjectArray;this.validate=new r.XFAObjectArray;this.value=new r.XFAObjectArray;this.variables=new r.XFAObjectArray}}class Radial extends r.XFAObject{constructor(e){super(d,"radial",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["toEdge","toCenter"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";const t=this.color?this.color[r.$toStyle]():"#000000";return`radial-gradient(circle at center, ${"toEdge"===this.type?`${e},${t}`:`${t},${e}`})`}}class Reason extends r.StringObject{constructor(e){super(d,"reason");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Reasons extends r.XFAObject{constructor(e){super(d,"reasons",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.reason=new r.XFAObjectArray}}class Rectangle extends r.XFAObject{constructor(e){super(d,"rectangle",!0);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new r.XFAObjectArray(4);this.edge=new r.XFAObjectArray(4);this.fill=null}[r.$toHTML](){const e=this.edge.children.length?this.edge.children[0]:new Edge({}),t=e[r.$toStyle](),a=Object.create(null);this.fill&&"visible"===this.fill.presence?Object.assign(a,this.fill[r.$toStyle]()):a.fill="transparent";a.strokeWidth=(0,s.measureToString)("visible"===e.presence?e.thickness:0);a.stroke=t.color;const n=(this.corner.children.length?this.corner.children[0]:new Corner({}))[r.$toStyle](),i={name:"svg",children:[{name:"rect",attributes:{xmlns:f,width:"100%",height:"100%",x:0,y:0,rx:n.radius,ry:n.radius,style:a}}],attributes:{xmlns:f,style:{overflow:"visible"},width:"100%",height:"100%"}};if(hasMargin(this[r.$getParent]()[r.$getParent]()))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[i]});i.attributes.style.position="absolute";return o.HTMLResult.success(i)}}class RefElement extends r.StringObject{constructor(e){super(d,"ref");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Script extends r.StringObject{constructor(e){super(d,"script");this.binding=e.binding||"";this.contentType=e.contentType||"";this.id=e.id||"";this.name=e.name||"";this.runAt=(0,o.getStringOption)(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class SetProperty extends r.XFAObject{constructor(e){super(d,"setProperty");this.connection=e.connection||"";this.ref=e.ref||"";this.target=e.target||""}}t.SetProperty=SetProperty;class SignData extends r.XFAObject{constructor(e){super(d,"signData",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["sign","clear","verify"]);this.ref=e.ref||"";this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Signature extends r.XFAObject{constructor(e){super(d,"signature",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["PDF1.3","PDF1.6"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.filter=null;this.manifest=null;this.margin=null}}class Signing extends r.XFAObject{constructor(e){super(d,"signing",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class Solid extends r.XFAObject{constructor(e){super(d,"solid",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toStyle](e){return e?e[r.$toStyle]():"#FFFFFF"}}class Speak extends r.StringObject{constructor(e){super(d,"speak");this.disable=(0,o.getInteger)({data:e.disable,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.priority=(0,o.getStringOption)(e.priority,["custom","caption","name","toolTip"]);this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Stipple extends r.XFAObject{constructor(e){super(d,"stipple",!0);this.id=e.id||"";this.rate=(0,o.getInteger)({data:e.rate,defaultValue:50,validate:e=>e>=0&&e<=100});this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){const t=this.rate/100;return c.Util.makeHexColor(Math.round(e.value.r*(1-t)+this.value.r*t),Math.round(e.value.g*(1-t)+this.value.g*t),Math.round(e.value.b*(1-t)+this.value.b*t))}}class Subform extends r.XFAObject{constructor(e){super(d,"subform",!0);this.access=(0,o.getStringOption)(e.access,["open","nonInteractive","protected","readOnly"]);this.allowMacro=(0,o.getInteger)({data:e.allowMacro,defaultValue:0,validate:e=>1===e});this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.columnWidths=(e.columnWidths||"").trim().split(/\s+/).map((e=>"-1"===e?-1:(0,o.getMeasurement)(e)));this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=(0,o.getStringOption)(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.mergeMode=(0,o.getStringOption)(e.mergeMode,["consumeData","matchTemplate"]);this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.restoreState=(0,o.getStringOption)(e.restoreState,["manual","auto"]);this.scope=(0,o.getStringOption)(e.scope,["name","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.bookend=null;this.border=null;this.break=null;this.calculate=null;this.desc=null;this.extras=null;this.keep=null;this.margin=null;this.occur=null;this.overflow=null;this.pageSet=null;this.para=null;this.traversal=null;this.validate=null;this.variables=null;this.area=new r.XFAObjectArray;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.proto=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}[r.$getSubformParent](){const e=this[r.$getParent]();return e instanceof SubformSet?e[r.$getSubformParent]():e}[r.$isBindable](){return!0}[r.$isThereMoreWidth](){return this.layout.endsWith("-tb")&&0===this[r.$extra].attempt&&this[r.$extra].numberInLine>0||this[r.$getParent]()[r.$isThereMoreWidth]()}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$flushHTML](){return(0,i.flushHTML)(this)}[r.$addHTML](e,t){(0,i.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,i.getAvailableSpace)(this)}[r.$isSplittable](){const e=this[r.$getSubformParent]();if(!e[r.$isSplittable]())return!1;if(void 0!==this[r.$extra]._isSplittable)return this[r.$extra]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[r.$extra]._isSplittable=!1;return!1}if(this.keep&&"none"!==this.keep.intact){this[r.$extra]._isSplittable=!1;return!1}if(e.layout&&e.layout.endsWith("-tb")&&0!==e[r.$extra].numberInLine)return!1;this[r.$extra]._isSplittable=!0;return!0}[r.$toHTML](e){setTabIndex(this);if(this.break){if("auto"!==this.break.after||""!==this.break.afterTarget){const e=new BreakAfter({targetType:this.break.after,target:this.break.afterTarget,startNew:this.break.startNew.toString()});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.breakAfter.push(e)}if("auto"!==this.break.before||""!==this.break.beforeTarget){const e=new BreakBefore({targetType:this.break.before,target:this.break.beforeTarget,startNew:this.break.startNew.toString()});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.breakBefore.push(e)}if(""!==this.break.overflowTarget){const e=new Overflow({target:this.break.overflowTarget,leader:this.break.overflowLeader,trailer:this.break.overflowTrailer});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.overflow.push(e)}this[r.$removeChild](this.break);this.break=null}if("hidden"===this.presence||"inactive"===this.presence)return o.HTMLResult.EMPTY;(this.breakBefore.children.length>1||this.breakAfter.children.length>1)&&(0,c.warn)("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");if(this.breakBefore.children.length>=1){const e=this.breakBefore.children[0];if(handleBreak(e))return o.HTMLResult.breakNode(e)}if(this[r.$extra]&&this[r.$extra].afterBreakAfter)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);const t=[],a={id:this[r.$uid],class:[]};(0,s.setAccess)(this,a.class);this[r.$extra]||(this[r.$extra]=Object.create(null));Object.assign(this[r.$extra],{children:t,line:null,attributes:a,attempt:0,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[r.$getTemplateRoot](),l=n[r.$extra].noLayoutFailure,h=this[r.$isSplittable]();h||setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e))return o.HTMLResult.FAILURE;const u=new Set(["area","draw","exclGroup","field","subform","subformSet"]);if(this.layout.includes("row")){const e=this[r.$getSubformParent]().columnWidths;if(Array.isArray(e)&&e.length>0){this[r.$extra].columnWidths=e;this[r.$extra].currentColumn=0}}const d=(0,s.toStyle)(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),f=["xfaSubform"],g=(0,s.layoutClass)(this);g&&f.push(g);a.style=d;a.class=f;this.name&&(a.xfaName=this.name);if(this.overflow){const t=this.overflow[r.$getExtra]();if(t.addLeader){t.addLeader=!1;handleOverflow(this,t.leader,e)}}this[r.$pushPara]();const p="lr-tb"===this.layout||"rl-tb"===this.layout,m=p?2:1;for(;this[r.$extra].attempt=1){const e=this.breakAfter.children[0];if(handleBreak(e)){this[r.$extra].afterBreakAfter=C;return o.HTMLResult.breakNode(e)}}delete this[r.$extra];return C}}class SubformSet extends r.XFAObject{constructor(e){super(d,"subformSet",!0);this.id=e.id||"";this.name=e.name||"";this.relation=(0,o.getStringOption)(e.relation,["ordered","choice","unordered"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.bookend=null;this.break=null;this.desc=null;this.extras=null;this.occur=null;this.overflow=null;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$getSubformParent](){let e=this[r.$getParent]();for(;!(e instanceof Subform);)e=e[r.$getParent]();return e}[r.$isBindable](){return!0}}class SubjectDN extends r.ContentObject{constructor(e){super(d,"subjectDN");this.delimiter=e.delimiter||",";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){this[r.$content]=new Map(this[r.$content].split(this.delimiter).map((e=>{(e=e.split("=",2))[0]=e[0].trim();return e})))}}class SubjectDNs extends r.XFAObject{constructor(e){super(d,"subjectDNs",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.subjectDN=new r.XFAObjectArray}}class Submit extends r.XFAObject{constructor(e){super(d,"submit",!0);this.embedPDF=(0,o.getInteger)({data:e.embedPDF,defaultValue:0,validate:e=>1===e});this.format=(0,o.getStringOption)(e.format,["xdp","formdata","pdf","urlencoded","xfd","xml"]);this.id=e.id||"";this.target=e.target||"";this.textEncoding=(0,o.getKeyword)({data:e.textEncoding?e.textEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.use=e.use||"";this.usehref=e.usehref||"";this.xdpContent=e.xdpContent||"";this.encrypt=null;this.encryptData=new r.XFAObjectArray;this.signData=new r.XFAObjectArray}}class Template extends r.XFAObject{constructor(e){super(d,"template",!0);this.baseProfile=(0,o.getStringOption)(e.baseProfile,["full","interactiveForms"]);this.extras=null;this.subform=new r.XFAObjectArray}[r.$finalize](){0===this.subform.children.length&&(0,c.warn)("XFA - No subforms in template node.");this.subform.children.length>=2&&(0,c.warn)("XFA - Several subforms in template node: please file a bug.");this[r.$tabIndex]=5e3}[r.$isSplittable](){return!0}[r.$searchNode](e,t){return e.startsWith("#")?[this[r.$ids].get(e.slice(1))]:(0,u.searchNode)(this,t,e,!0,!0)}*[r.$toPages](){if(!this.subform.children.length)return o.HTMLResult.success({name:"div",children:[]});this[r.$extra]={overflowNode:null,firstUnsplittable:null,currentContentArea:null,currentPageArea:null,noLayoutFailure:!1,pageNumber:1,pagePosition:"first",oddOrEven:"odd",blankOrNotBlank:"nonBlank",paraStack:[]};const e=this.subform.children[0];e.pageSet[r.$cleanPage]();const t=e.pageSet.pageArea.children,a={name:"div",children:[]};let n=null,i=null,s=null;if(e.breakBefore.children.length>=1){i=e.breakBefore.children[0];s=i.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){i=e.subform.children[0].breakBefore.children[0];s=i.target}else if(e.break&&e.break.beforeTarget){i=e.break;s=i.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break&&e.subform.children[0].break.beforeTarget){i=e.subform.children[0].break;s=i.beforeTarget}if(i){const e=this[r.$searchNode](s,i[r.$getParent]());if(e instanceof PageArea){n=e;i[r.$extra]={}}}n||(n=t[0]);n[r.$extra]={numberOfUse:1};const l=n[r.$getParent]();l[r.$extra]={numberOfUse:1,pageIndex:l.pageArea.children.indexOf(n),pageSetIndex:0};let h,u=null,d=null,f=!0,g=0,p=0;for(;;){if(f)g=0;else{a.children.pop();if(3==++g){(0,c.warn)("XFA - Something goes wrong: please file a bug.");return a}}h=null;this[r.$extra].currentPageArea=n;const t=n[r.$toHTML]().html;a.children.push(t);if(u){this[r.$extra].noLayoutFailure=!0;t.children.push(u[r.$toHTML](n[r.$extra].space).html);u=null}if(d){this[r.$extra].noLayoutFailure=!0;t.children.push(d[r.$toHTML](n[r.$extra].space).html);d=null}const i=n.contentArea.children,s=t.children.filter((e=>e.attributes.class.includes("xfaContentarea")));f=!1;this[r.$extra].firstUnsplittable=null;this[r.$extra].noLayoutFailure=!1;const flush=t=>{const a=e[r.$flushHTML]();if(a){f=f||a.children&&0!==a.children.length;s[t].children.push(a)}};for(let t=p,n=i.length;t1&&a.children.pop();return a}if(c.isBreak()){const e=c.breakNode;flush(t);if("auto"===e.targetType)continue;if(e.leader){u=this[r.$searchNode](e.leader,e[r.$getParent]());u=u?u[0]:null}if(e.trailer){d=this[r.$searchNode](e.trailer,e[r.$getParent]());d=d?d[0]:null}if("pageArea"===e.targetType){h=e[r.$extra].target;t=1/0}else if(e[r.$extra].target){h=e[r.$extra].target;p=e[r.$extra].index+1;t=1/0}else t=e[r.$extra].index}else if(this[r.$extra].overflowNode){const e=this[r.$extra].overflowNode;this[r.$extra].overflowNode=null;const a=e[r.$getExtra](),n=a.target;a.addLeader=null!==a.leader;a.addTrailer=null!==a.trailer;flush(t);const s=t;t=1/0;if(n instanceof PageArea)h=n;else if(n instanceof ContentArea){const e=i.indexOf(n);if(-1!==e)e>s?t=e-1:p=e;else{h=n[r.$getParent]();p=h.contentArea.children.indexOf(n)}}}else flush(t)}this[r.$extra].pageNumber+=1;h&&(h[r.$isUsable]()?h[r.$extra].numberOfUse+=1:h=null);n=h||n[r.$getNextPage]();yield null}}}t.Template=Template;class Text extends r.ContentObject{constructor(e){super(d,"text");this.id=e.id||"";this.maxChars=(0,o.getInteger)({data:e.maxChars,defaultValue:0,validate:e=>e>=0});this.name=e.name||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$acceptWhitespace](){return!0}[r.$onChild](e){if(e[r.$namespaceId]===n.NamespaceIds.xhtml.id){this[r.$content]=e;return!0}(0,c.warn)(`XFA - Invalid content in Text: ${e[r.$nodeName]}.`);return!1}[r.$onText](e){this[r.$content]instanceof r.XFAObject||super[r.$onText](e)}[r.$finalize](){"string"==typeof this[r.$content]&&(this[r.$content]=this[r.$content].replace(/\r\n/g,"\n"))}[r.$getExtra](){return"string"==typeof this[r.$content]?this[r.$content].split(/[\u2029\u2028\n]/).reduce(((e,t)=>{t&&e.push(t);return e}),[]).join("\n"):this[r.$content][r.$text]()}[r.$toHTML](e){if("string"==typeof this[r.$content]){const e=valueToHtml(this[r.$content]).html;if(this[r.$content].includes("\u2029")){e.name="div";e.children=[];this[r.$content].split("\u2029").map((e=>e.split(/[\u2028\n]/).reduce(((e,t)=>{e.push({name:"span",value:t},{name:"br"});return e}),[]))).forEach((t=>{e.children.push({name:"p",children:t})}))}else if(/[\u2028\n]/.test(this[r.$content])){e.name="div";e.children=[];this[r.$content].split(/[\u2028\n]/).forEach((t=>{e.children.push({name:"span",value:t},{name:"br"})}))}return o.HTMLResult.success(e)}return this[r.$content][r.$toHTML](e)}}t.Text=Text;class TextEdit extends r.XFAObject{constructor(e){super(d,"textEdit",!0);this.allowRichText=(0,o.getInteger)({data:e.allowRichText,defaultValue:0,validate:e=>1===e});this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.multiLine=(0,o.getInteger)({data:e.multiLine,defaultValue:"",validate:e=>0===e||1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.vScrollPolicy=(0,o.getStringOption)(e.vScrollPolicy,["auto","off","on"]);this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin");let a;const n=this[r.$getParent]()[r.$getParent]();""===this.multiLine&&(this.multiLine=n instanceof Draw?1:0);a=1===this.multiLine?{name:"textarea",attributes:{dataId:n[r.$data]&&n[r.$data][r.$uid]||n[r.$uid],fieldId:n[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:n[r.$data]&&n[r.$data][r.$uid]||n[r.$uid],fieldId:n[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}};if(isRequired(n)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Time extends r.StringObject{constructor(e){super(d,"time");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class TimeStamp extends r.XFAObject{constructor(e){super(d,"timeStamp");this.id=e.id||"";this.server=e.server||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class ToolTip extends r.StringObject{constructor(e){super(d,"toolTip");this.id=e.id||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Traversal extends r.XFAObject{constructor(e){super(d,"traversal",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.traverse=new r.XFAObjectArray}}class Traverse extends r.XFAObject{constructor(e){super(d,"traverse",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["next","back","down","first","left","right","up"]);this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.script=null}get name(){return this.operation}[r.$isTransparent](){return!1}}class Ui extends r.XFAObject{constructor(e){super(d,"ui",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null;this.barcode=null;this.button=null;this.checkButton=null;this.choiceList=null;this.dateTimeEdit=null;this.defaultUi=null;this.imageEdit=null;this.numericEdit=null;this.passwordEdit=null;this.signature=null;this.textEdit=null}[r.$getExtra](){if(void 0===this[r.$extra]){for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"picture"===e)continue;const t=this[e];if(t instanceof r.XFAObject){this[r.$extra]=t;return t}}this[r.$extra]=null}return this[r.$extra]}[r.$toHTML](e){const t=this[r.$getExtra]();return t?t[r.$toHTML](e):o.HTMLResult.EMPTY}}class Validate extends r.XFAObject{constructor(e){super(d,"validate",!0);this.formatTest=(0,o.getStringOption)(e.formatTest,["warning","disabled","error"]);this.id=e.id||"";this.nullTest=(0,o.getStringOption)(e.nullTest,["disabled","error","warning"]);this.scriptTest=(0,o.getStringOption)(e.scriptTest,["error","disabled","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.picture=null;this.script=null}}class Value extends r.XFAObject{constructor(e){super(d,"value",!0);this.id=e.id||"";this.override=(0,o.getInteger)({data:e.override,defaultValue:0,validate:e=>1===e});this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.arc=null;this.boolean=null;this.date=null;this.dateTime=null;this.decimal=null;this.exData=null;this.float=null;this.image=null;this.integer=null;this.line=null;this.rectangle=null;this.text=null;this.time=null}[r.$setValue](e){const t=this[r.$getParent]();if(t instanceof Field&&t.ui&&t.ui.imageEdit){if(!this.image){this.image=new Image({});this[r.$appendChild](this.image)}this.image[r.$content]=e[r.$content];return}const a=e[r.$nodeName];if(null===this[a]){for(const e of Object.getOwnPropertyNames(this)){const t=this[e];if(t instanceof r.XFAObject){this[e]=null;this[r.$removeChild](t)}}this[e[r.$nodeName]]=e;this[r.$appendChild](e)}else this[a][r.$content]=e[r.$content]}[r.$text](){if(this.exData)return"string"==typeof this.exData[r.$content]?this.exData[r.$content].trim():this.exData[r.$content][r.$text]().trim();for(const e of Object.getOwnPropertyNames(this)){if("image"===e)continue;const t=this[e];if(t instanceof r.XFAObject)return(t[r.$content]||"").toString().trim()}return null}[r.$toHTML](e){for(const t of Object.getOwnPropertyNames(this)){const a=this[t];if(a instanceof r.XFAObject)return a[r.$toHTML](e)}return o.HTMLResult.EMPTY}}t.Value=Value;class Variables extends r.XFAObject{constructor(e){super(d,"variables",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.manifest=new r.XFAObjectArray;this.script=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}[r.$isTransparent](){return!0}}class TemplateNamespace{static[n.$buildXFAObject](e,t){if(TemplateNamespace.hasOwnProperty(e)){const a=TemplateNamespace[e](t);a[r.$setSetAttributes](t);return a}}static appearanceFilter(e){return new AppearanceFilter(e)}static arc(e){return new Arc(e)}static area(e){return new Area(e)}static assist(e){return new Assist(e)}static barcode(e){return new Barcode(e)}static bind(e){return new Bind(e)}static bindItems(e){return new BindItems(e)}static bookend(e){return new Bookend(e)}static boolean(e){return new BooleanElement(e)}static border(e){return new Border(e)}static break(e){return new Break(e)}static breakAfter(e){return new BreakAfter(e)}static breakBefore(e){return new BreakBefore(e)}static button(e){return new Button(e)}static calculate(e){return new Calculate(e)}static caption(e){return new Caption(e)}static certificate(e){return new Certificate(e)}static certificates(e){return new Certificates(e)}static checkButton(e){return new CheckButton(e)}static choiceList(e){return new ChoiceList(e)}static color(e){return new Color(e)}static comb(e){return new Comb(e)}static connect(e){return new Connect(e)}static contentArea(e){return new ContentArea(e)}static corner(e){return new Corner(e)}static date(e){return new DateElement(e)}static dateTime(e){return new DateTime(e)}static dateTimeEdit(e){return new DateTimeEdit(e)}static decimal(e){return new Decimal(e)}static defaultUi(e){return new DefaultUi(e)}static desc(e){return new Desc(e)}static digestMethod(e){return new DigestMethod(e)}static digestMethods(e){return new DigestMethods(e)}static draw(e){return new Draw(e)}static edge(e){return new Edge(e)}static encoding(e){return new Encoding(e)}static encodings(e){return new Encodings(e)}static encrypt(e){return new Encrypt(e)}static encryptData(e){return new EncryptData(e)}static encryption(e){return new Encryption(e)}static encryptionMethod(e){return new EncryptionMethod(e)}static encryptionMethods(e){return new EncryptionMethods(e)}static event(e){return new Event(e)}static exData(e){return new ExData(e)}static exObject(e){return new ExObject(e)}static exclGroup(e){return new ExclGroup(e)}static execute(e){return new Execute(e)}static extras(e){return new Extras(e)}static field(e){return new Field(e)}static fill(e){return new Fill(e)}static filter(e){return new Filter(e)}static float(e){return new Float(e)}static font(e){return new Font(e)}static format(e){return new Format(e)}static handler(e){return new Handler(e)}static hyphenation(e){return new Hyphenation(e)}static image(e){return new Image(e)}static imageEdit(e){return new ImageEdit(e)}static integer(e){return new Integer(e)}static issuers(e){return new Issuers(e)}static items(e){return new Items(e)}static keep(e){return new Keep(e)}static keyUsage(e){return new KeyUsage(e)}static line(e){return new Line(e)}static linear(e){return new Linear(e)}static lockDocument(e){return new LockDocument(e)}static manifest(e){return new Manifest(e)}static margin(e){return new Margin(e)}static mdp(e){return new Mdp(e)}static medium(e){return new Medium(e)}static message(e){return new Message(e)}static numericEdit(e){return new NumericEdit(e)}static occur(e){return new Occur(e)}static oid(e){return new Oid(e)}static oids(e){return new Oids(e)}static overflow(e){return new Overflow(e)}static pageArea(e){return new PageArea(e)}static pageSet(e){return new PageSet(e)}static para(e){return new Para(e)}static passwordEdit(e){return new PasswordEdit(e)}static pattern(e){return new Pattern(e)}static picture(e){return new Picture(e)}static proto(e){return new Proto(e)}static radial(e){return new Radial(e)}static reason(e){return new Reason(e)}static reasons(e){return new Reasons(e)}static rectangle(e){return new Rectangle(e)}static ref(e){return new RefElement(e)}static script(e){return new Script(e)}static setProperty(e){return new SetProperty(e)}static signData(e){return new SignData(e)}static signature(e){return new Signature(e)}static signing(e){return new Signing(e)}static solid(e){return new Solid(e)}static speak(e){return new Speak(e)}static stipple(e){return new Stipple(e)}static subform(e){return new Subform(e)}static subformSet(e){return new SubformSet(e)}static subjectDN(e){return new SubjectDN(e)}static subjectDNs(e){return new SubjectDNs(e)}static submit(e){return new Submit(e)}static template(e){return new Template(e)}static text(e){return new Text(e)}static textEdit(e){return new TextEdit(e)}static time(e){return new Time(e)}static timeStamp(e){return new TimeStamp(e)}static toolTip(e){return new ToolTip(e)}static traversal(e){return new Traversal(e)}static traverse(e){return new Traverse(e)}static ui(e){return new Ui(e)}static validate(e){return new Validate(e)}static value(e){return new Value(e)}static variables(e){return new Variables(e)}}t.TemplateNamespace=TemplateNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.addHTML=function addHTML(e,t,a){const i=e[r.$extra],s=i.availableSpace,[o,c,l,h]=a;switch(e.layout){case"position":i.width=Math.max(i.width,o+l);i.height=Math.max(i.height,c+h);i.children.push(t);break;case"lr-tb":case"rl-tb":if(!i.line||1===i.attempt){i.line=createLine(e,[]);i.children.push(i.line);i.numberInLine=0}i.numberInLine+=1;i.line.children.push(t);if(0===i.attempt){i.currentWidth+=l;i.height=Math.max(i.height,i.prevHeight+h)}else{i.currentWidth=l;i.prevHeight=i.height;i.height+=h;i.attempt=0}i.width=Math.max(i.width,i.currentWidth);break;case"rl-row":case"row":{i.children.push(t);i.width+=l;i.height=Math.max(i.height,h);const e=(0,n.measureToString)(i.height);for(const t of i.children)t.attributes.style.height=e;break}case"table":case"tb":i.width=Math.min(s.width,Math.max(i.width,l));i.height+=h;i.children.push(t)}};t.checkDimensions=function checkDimensions(e,t){if(null===e[r.$getTemplateRoot]()[r.$extra].firstUnsplittable)return!0;if(0===e.w||0===e.h)return!0;const a=e[r.$getSubformParent](),n=a[r.$extra]&&a[r.$extra].attempt||0,[,i,s,o]=function getTransformedBBox(e){let t,a,r=""===e.w?NaN:e.w,n=""===e.h?NaN:e.h,[i,s]=[0,0];switch(e.anchorType||""){case"bottomCenter":[i,s]=[r/2,n];break;case"bottomLeft":[i,s]=[0,n];break;case"bottomRight":[i,s]=[r,n];break;case"middleCenter":[i,s]=[r/2,n/2];break;case"middleLeft":[i,s]=[0,n/2];break;case"middleRight":[i,s]=[r,n/2];break;case"topCenter":[i,s]=[r/2,0];break;case"topRight":[i,s]=[r,0]}switch(e.rotate||0){case 0:[t,a]=[-i,-s];break;case 90:[t,a]=[-s,i];[r,n]=[n,-r];break;case 180:[t,a]=[i,s];[r,n]=[-r,-n];break;case 270:[t,a]=[s,-i];[r,n]=[-n,r]}return[e.x+t+Math.min(0,r),e.y+a+Math.min(0,n),Math.abs(r),Math.abs(n)]}(e);switch(a.layout){case"lr-tb":case"rl-tb":return 0===n?e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure?""!==e.w?Math.round(s-t.width)<=2:t.width>2:!(""!==e.h&&Math.round(o-t.height)>2)&&(""!==e.w?Math.round(s-t.width)<=2||0===a[r.$extra].numberInLine&&t.height>2:t.width>2):!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||!(""!==e.h&&Math.round(o-t.height)>2)&&((""===e.w||Math.round(s-t.width)<=2||!a[r.$isThereMoreWidth]())&&t.height>2);case"table":case"tb":return!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||(""===e.h||e[r.$isSplittable]()?(""===e.w||Math.round(s-t.width)<=2||!a[r.$isThereMoreWidth]())&&t.height>2:Math.round(o-t.height)<=2);case"position":if(e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure)return!0;if(""===e.h||Math.round(o+i-t.height)<=2)return!0;const c=e[r.$getTemplateRoot]()[r.$extra].currentContentArea;return o+i>c.h;case"rl-row":case"row":return!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||(""===e.h||Math.round(o-t.height)<=2);default:return!0}};t.flushHTML=function flushHTML(e){if(!e[r.$extra])return null;const t={name:"div",attributes:e[r.$extra].attributes,children:e[r.$extra].children};if(e[r.$extra].failingNode){const a=e[r.$extra].failingNode[r.$flushHTML]();a&&(e.layout.endsWith("-tb")?t.children.push(createLine(e,[a])):t.children.push(a))}if(0===t.children.length)return null;return t};t.getAvailableSpace=function getAvailableSpace(e){const t=e[r.$extra].availableSpace,a=e.margin?e.margin.topInset+e.margin.bottomInset:0,n=e.margin?e.margin.leftInset+e.margin.rightInset:0;switch(e.layout){case"lr-tb":case"rl-tb":return 0===e[r.$extra].attempt?{width:t.width-n-e[r.$extra].currentWidth,height:t.height-a-e[r.$extra].prevHeight}:{width:t.width-n,height:t.height-a-e[r.$extra].height};case"rl-row":case"row":return{width:e[r.$extra].columnWidths.slice(e[r.$extra].currentColumn).reduce(((e,t)=>e+t)),height:t.height-n};case"table":case"tb":return{width:t.width-n,height:t.height-a-e[r.$extra].height};default:return t}};var r=a(77),n=a(84);function createLine(e,t){return{name:"div",attributes:{class:["lr-tb"===e.layout?"xfaLr":"xfaRl"]},children:t}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.computeBbox=function computeBbox(e,t,a){let n;if(""!==e.w&&""!==e.h)n=[e.x,e.y,e.w,e.h];else{if(!a)return null;let i=e.w;if(""===i){if(0===e.maxW){const t=e[r.$getSubformParent]();i="position"===t.layout&&""!==t.w?0:e.minW}else i=Math.min(e.maxW,a.width);t.attributes.style.width=measureToString(i)}let s=e.h;if(""===s){if(0===e.maxH){const t=e[r.$getSubformParent]();s="position"===t.layout&&""!==t.h?0:e.minH}else s=Math.min(e.maxH,a.height);t.attributes.style.height=measureToString(s)}n=[e.x,e.y,i,s]}return n};t.createWrapper=function createWrapper(e,t){const{attributes:a}=t,{style:n}=a,i={name:"div",attributes:{class:["xfaWrapper"],style:Object.create(null)},children:[]};a.class.push("xfaWrapped");if(e.border){const{widths:a,insets:s}=e.border[r.$extra];let o,c,l=s[0],h=s[3];const u=s[0]+s[2],d=s[1]+s[3];switch(e.border.hand){case"even":l-=a[0]/2;h-=a[3]/2;o=`calc(100% + ${(a[1]+a[3])/2-d}px)`;c=`calc(100% + ${(a[0]+a[2])/2-u}px)`;break;case"left":l-=a[0];h-=a[3];o=`calc(100% + ${a[1]+a[3]-d}px)`;c=`calc(100% + ${a[0]+a[2]-u}px)`;break;case"right":o=d?`calc(100% - ${d}px)`:"100%";c=u?`calc(100% - ${u}px)`:"100%"}const f=["xfaBorder"];isPrintOnly(e.border)&&f.push("xfaPrintOnly");const g={name:"div",attributes:{class:f,style:{top:`${l}px`,left:`${h}px`,width:o,height:c}},children:[]};for(const e of["border","borderWidth","borderColor","borderRadius","borderStyle"])if(void 0!==n[e]){g.attributes.style[e]=n[e];delete n[e]}i.children.push(g,t)}else i.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==n[e]){i.attributes.style[e]=n[e];delete n[e]}"absolute"===n.position?i.attributes.style.position="absolute":i.attributes.style.position="relative";delete n.position;if(n.alignSelf){i.attributes.style.alignSelf=n.alignSelf;delete n.alignSelf}return i};t.fixDimensions=function fixDimensions(e){const t=e[r.$getSubformParent]();if(t.layout&&t.layout.includes("row")){const a=t[r.$extra],n=e.colSpan;let i;i=-1===n?a.columnWidths.slice(a.currentColumn).reduce(((e,t)=>e+t),0):a.columnWidths.slice(a.currentColumn,a.currentColumn+n).reduce(((e,t)=>e+t),0);isNaN(i)||(e.w=i)}t.layout&&"position"!==t.layout&&(e.x=e.y=0);"table"===e.layout&&""===e.w&&Array.isArray(e.columnWidths)&&(e.w=e.columnWidths.reduce(((e,t)=>e+t),0))};t.fixTextIndent=function fixTextIndent(e){const t=(0,i.getMeasurement)(e.textIndent,"0px");if(t>=0)return;const a="padding"+("left"==("right"===e.textAlign?"right":"left")?"Left":"Right"),r=(0,i.getMeasurement)(e[a],"0px");e[a]=r-t+"px"};t.fixURL=function fixURL(e){const t=(0,n.createValidAbsoluteUrl)(e,null,{addDefaultProtocol:!0,tryConvertEncoding:!0});return t?t.href:null};t.isPrintOnly=isPrintOnly;t.layoutClass=function layoutClass(e){switch(e.layout){case"position":default:return"xfaPosition";case"lr-tb":return"xfaLrTb";case"rl-row":return"xfaRlRow";case"rl-tb":return"xfaRlTb";case"row":return"xfaRow";case"table":return"xfaTable";case"tb":return"xfaTb"}};t.layoutNode=function layoutNode(e,t){let a=null,n=null,i=!1;if((!e.w||!e.h)&&e.value){let s=0,o=0;if(e.margin){s=e.margin.leftInset+e.margin.rightInset;o=e.margin.topInset+e.margin.bottomInset}let c=null,l=null;if(e.para){l=Object.create(null);c=""===e.para.lineHeight?null:e.para.lineHeight;l.top=""===e.para.spaceAbove?0:e.para.spaceAbove;l.bottom=""===e.para.spaceBelow?0:e.para.spaceBelow;l.left=""===e.para.marginLeft?0:e.para.marginLeft;l.right=""===e.para.marginRight?0:e.para.marginRight}let h=e.font;if(!h){const t=e[r.$getTemplateRoot]();let a=e[r.$getParent]();for(;a&&a!==t;){if(a.font){h=a.font;break}a=a[r.$getParent]()}}const u=(e.w||t.width)-s,d=e[r.$globalData].fontFinder;if(e.value.exData&&e.value.exData[r.$content]&&"text/html"===e.value.exData.contentType){const t=layoutText(e.value.exData[r.$content],h,l,c,d,u);n=t.width;a=t.height;i=t.isBroken}else{const t=e.value[r.$text]();if(t){const e=layoutText(t,h,l,c,d,u);n=e.width;a=e.height;i=e.isBroken}}null===n||e.w||(n+=s);null===a||e.h||(a+=o)}return{w:n,h:a,isBroken:i}};t.measureToString=measureToString;t.setAccess=function setAccess(e,t){switch(e.access){case"nonInteractive":t.push("xfaNonInteractive");break;case"readOnly":t.push("xfaReadOnly");break;case"protected":t.push("xfaDisabled")}};t.setFontFamily=function setFontFamily(e,t,a,r){if(!a){delete r.fontFamily;return}const n=(0,i.stripQuotes)(e.typeface);r.fontFamily=`"${n}"`;const o=a.find(n);if(o){const{fontFamily:a}=o.regular.cssFontInfo;a!==n&&(r.fontFamily=`"${a}"`);const i=getCurrentPara(t);if(i&&""!==i.lineHeight)return;if(r.lineHeight)return;const c=(0,s.selectFont)(e,o);c&&(r.lineHeight=Math.max(1.2,c.lineHeight))}};t.setMinMaxDimensions=function setMinMaxDimensions(e,t){if("position"===e[r.$getSubformParent]().layout){e.minW>0&&(t.minWidth=measureToString(e.minW));e.maxW>0&&(t.maxWidth=measureToString(e.maxW));e.minH>0&&(t.minHeight=measureToString(e.minH));e.maxH>0&&(t.maxHeight=measureToString(e.maxH))}};t.setPara=function setPara(e,t,a){if(a.attributes.class&&a.attributes.class.includes("xfaRich")){if(t){""===e.h&&(t.height="auto");""===e.w&&(t.width="auto")}const n=getCurrentPara(e);if(n){const e=a.attributes.style;e.display="flex";e.flexDirection="column";switch(n.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=n[r.$toStyle]();for(const[a,r]of Object.entries(t))a in e||(e[a]=r)}}};t.toStyle=function toStyle(e,...t){const a=Object.create(null);for(const i of t){const t=e[i];if(null!==t)if(c.hasOwnProperty(i))c[i](e,a);else if(t instanceof r.XFAObject){const e=t[r.$toStyle]();e?Object.assign(a,e):(0,n.warn)(`(DEBUG) - XFA - style for ${i} not implemented yet`)}}return a};var r=a(77),n=a(2),i=a(78),s=a(85),o=a(86);function measureToString(e){return"string"==typeof e?"0px":Number.isInteger(e)?`${e}px`:`${e.toFixed(2)}px`}const c={anchorType(e,t){const a=e[r.$getSubformParent]();if(a&&(!a.layout||"position"===a.layout)){"transform"in t||(t.transform="");switch(e.anchorType){case"bottomCenter":t.transform+="translate(-50%, -100%)";break;case"bottomLeft":t.transform+="translate(0,-100%)";break;case"bottomRight":t.transform+="translate(-100%,-100%)";break;case"middleCenter":t.transform+="translate(-50%,-50%)";break;case"middleLeft":t.transform+="translate(0,-50%)";break;case"middleRight":t.transform+="translate(-100%,-50%)";break;case"topCenter":t.transform+="translate(-50%,0)";break;case"topRight":t.transform+="translate(-100%,0)"}}},dimensions(e,t){const a=e[r.$getSubformParent]();let n=e.w;const i=e.h;if(a.layout&&a.layout.includes("row")){const t=a[r.$extra],i=e.colSpan;let s;if(-1===i){s=t.columnWidths.slice(t.currentColumn).reduce(((e,t)=>e+t),0);t.currentColumn=0}else{s=t.columnWidths.slice(t.currentColumn,t.currentColumn+i).reduce(((e,t)=>e+t),0);t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(s)||(n=e.w=s)}t.width=""!==n?measureToString(n):"auto";t.height=""!==i?measureToString(i):"auto"},position(e,t){const a=e[r.$getSubformParent]();if(!a||!a.layout||"position"===a.layout){t.position="absolute";t.left=measureToString(e.x);t.top=measureToString(e.y)}},rotate(e,t){if(e.rotate){"transform"in t||(t.transform="");t.transform+=`rotate(-${e.rotate}deg)`;t.transformOrigin="top left"}},presence(e,t){switch(e.presence){case"invisible":t.visibility="hidden";break;case"hidden":case"inactive":t.display="none"}},hAlign(e,t){if("para"===e[r.$nodeName])switch(e.hAlign){case"justifyAll":t.textAlign="justify-all";break;case"radix":t.textAlign="left";break;default:t.textAlign=e.hAlign}else switch(e.hAlign){case"left":t.alignSelf="start";break;case"center":t.alignSelf="center";break;case"right":t.alignSelf="end"}},margin(e,t){e.margin&&(t.margin=e.margin[r.$toStyle]().margin)}};function layoutText(e,t,a,n,i,s){const c=new o.TextMeasure(t,a,n,i);"string"==typeof e?c.addString(e):e[r.$pushGlyphs](c);return c.compute(s)}function isPrintOnly(e){return e.relevant.length>0&&!e.relevant[0].excluded&&"print"===e.relevant[0].viewname}function getCurrentPara(e){const t=e[r.$getTemplateRoot]()[r.$extra].paraStack;return t.length?t.at(-1):null}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FontFinder=void 0;t.getMetrics=function getMetrics(e,t=!1){let a=null;if(e){const t=(0,n.stripQuotes)(e.typeface),i=e[r.$globalData].fontFinder.find(t);a=selectFont(e,i)}if(!a)return{lineHeight:12,lineGap:2,lineNoGap:10};const i=e.size||10,s=a.lineHeight?Math.max(t?0:1.2,a.lineHeight):1.2,o=void 0===a.lineGap?.2:a.lineGap;return{lineHeight:s*i,lineGap:o*i,lineNoGap:Math.max(1,s-o)*i}};t.selectFont=selectFont;var r=a(77),n=a(78),i=a(2);t.FontFinder=class FontFinder{constructor(e){this.fonts=new Map;this.cache=new Map;this.warned=new Set;this.defaultFont=null;this.add(e)}add(e,t=null){for(const t of e)this.addPdfFont(t);for(const e of this.fonts.values())e.regular||(e.regular=e.italic||e.bold||e.bolditalic);if(!t||0===t.size)return;const a=this.fonts.get("PdfJS-Fallback-PdfJS-XFA");for(const e of t)this.fonts.set(e,a)}addPdfFont(e){const t=e.cssFontInfo,a=t.fontFamily;let r=this.fonts.get(a);if(!r){r=Object.create(null);this.fonts.set(a,r);this.defaultFont||(this.defaultFont=r)}let n="";const i=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?n=i>=700?"bolditalic":"italic":i>=700&&(n="bold");if(!n){(e.name.includes("Bold")||e.psName&&e.psName.includes("Bold"))&&(n="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName&&(e.psName.includes("Italic")||e.psName.endsWith("It")))&&(n+="italic")}n||(n="regular");r[n]=e}getDefault(){return this.defaultFont}find(e,t=!0){let a=this.fonts.get(e)||this.cache.get(e);if(a)return a;const r=/,|-|_| |bolditalic|bold|italic|regular|it/gi;let n=e.replace(r,"");a=this.fonts.get(n);if(a){this.cache.set(e,a);return a}n=n.toLowerCase();const s=[];for(const[e,t]of this.fonts.entries())e.replace(r,"").toLowerCase().startsWith(n)&&s.push(t);if(0===s.length)for(const[,e]of this.fonts.entries())e.regular.name&&e.regular.name.replace(r,"").toLowerCase().startsWith(n)&&s.push(e);if(0===s.length){n=n.replace(/psmt|mt/gi,"");for(const[e,t]of this.fonts.entries())e.replace(r,"").toLowerCase().startsWith(n)&&s.push(t)}if(0===s.length)for(const e of this.fonts.values())e.regular.name&&e.regular.name.replace(r,"").toLowerCase().startsWith(n)&&s.push(e);if(s.length>=1){1!==s.length&&t&&(0,i.warn)(`XFA - Too many choices to guess the correct font: ${e}`);this.cache.set(e,s[0]);return s[0]}if(t&&!this.warned.has(e)){this.warned.add(e);(0,i.warn)(`XFA - Cannot find the font: ${e}`)}return null}};function selectFont(e,t){return"italic"===e.posture?"bold"===e.weight?t.bolditalic:t.italic:"bold"===e.weight?t.bold:t.regular}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.TextMeasure=void 0;var r=a(85);class FontInfo{constructor(e,t,a,n){this.lineHeight=a;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(n);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const i=n.find(e.typeface);if(i){this.pdfFont=(0,r.selectFont)(e,i);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(n))}else[this.pdfFont,this.xfaFont]=this.defaultFont(n)}defaultFont(e){const t=e.find("Helvetica",!1)||e.find("Myriad Pro",!1)||e.find("Arial",!1)||e.getDefault();if(t&&t.regular){const e=t.regular;return[e,{typeface:e.cssFontInfo.fontFamily,posture:"normal",weight:"normal",size:10,letterSpacing:0}]}return[null,{typeface:"Courier",posture:"normal",weight:"normal",size:10,letterSpacing:0}]}}class FontSelector{constructor(e,t,a,r){this.fontFinder=r;this.stack=[new FontInfo(e,t,a,r)]}pushData(e,t,a){const r=this.stack.at(-1);for(const t of["typeface","posture","weight","size","letterSpacing"])e[t]||(e[t]=r.xfaFont[t]);for(const e of["top","bottom","left","right"])isNaN(t[e])&&(t[e]=r.paraMargin[e]);const n=new FontInfo(e,t,a||r.lineHeight,this.fontFinder);n.pdfFont||(n.pdfFont=r.pdfFont);this.stack.push(n)}popFont(){this.stack.pop()}topFont(){return this.stack.at(-1)}}t.TextMeasure=class TextMeasure{constructor(e,t,a,r){this.glyphs=[];this.fontSelector=new FontSelector(e,t,a,r);this.extraHeight=0}pushData(e,t,a){this.fontSelector.pushData(e,t,a)}popFont(e){return this.fontSelector.popFont()}addPara(){const e=this.fontSelector.topFont();this.extraHeight+=e.paraMargin.top+e.paraMargin.bottom}addString(e){if(!e)return;const t=this.fontSelector.topFont(),a=t.xfaFont.size;if(t.pdfFont){const r=t.xfaFont.letterSpacing,n=t.pdfFont,i=n.lineHeight||1.2,s=t.lineHeight||Math.max(1.2,i)*a,o=i-(void 0===n.lineGap?.2:n.lineGap),c=Math.max(1,o)*a,l=a/1e3,h=n.defaultWidth||n.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=n.encodeString(t).join(""),a=n.charsToGlyphs(e);for(const e of a){const t=e.width||h;this.glyphs.push([t*l+r,s,c,e.unicode,!1])}this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}else{for(const t of e.split(/[\u2029\n]/)){for(const e of t.split(""))this.glyphs.push([a,1.2*a,a,e,!1]);this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}}compute(e){let t=-1,a=0,r=0,n=0,i=0,s=0,o=!1,c=!0;for(let l=0,h=this.glyphs.length;le){r=Math.max(r,i);i=0;n+=s;s=m;t=-1;a=0;o=!0;c=!1}else{s=Math.max(m,s);a=i;i+=h;t=l}else if(i+h>e){n+=s;s=m;if(-1!==t){l=t;r=Math.max(r,a);i=0;t=-1;a=0}else{r=Math.max(r,i);i=h}o=!0;c=!1}else{i+=h;s=Math.max(m,s)}}r=Math.max(r,i);n+=s+this.extraHeight;return{width:1.02*r,height:n,isBroken:o}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DataHandler=void 0;var r=a(77);t.DataHandler=class DataHandler{constructor(e,t){this.data=t;this.dataset=e.datasets||null}serialize(e){const t=[[-1,this.data[r.$getChildren]()]];for(;t.length>0;){const a=t.at(-1),[n,i]=a;if(n+1===i.length){t.pop();continue}const s=i[++a[0]],o=e.get(s[r.$uid]);if(o)s[r.$setValue](o);else{const t=s[r.$getAttributes]();for(const a of t.values()){const t=e.get(a[r.$uid]);if(t){a[r.$setValue](t);break}}}const c=s[r.$getChildren]();c.length>0&&t.push([-1,c])}const a=[''];if(this.dataset)for(const e of this.dataset[r.$getChildren]())"data"!==e[r.$nodeName]&&e[r.$toString](a);this.data[r.$toString](a);a.push("");return a.join("")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XFAParser=void 0;var r=a(77),n=a(66),i=a(89),s=a(2);class XFAParser extends n.XMLParserBase{constructor(e=null,t=!1){super();this._builder=new i.Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=n.XMLParserErrorCode.NoError;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===n.XMLParserErrorCode.NoError){this._current[r.$finalize]();return this._current.element}}onText(e){e=e.replace(this._nbsps,(e=>e.slice(1)+" "));this._richText||this._current[r.$acceptWhitespace]()?this._current[r.$onText](e,this._richText):this._whiteRegex.test(e)||this._current[r.$onText](e.trim())}onCdata(e){this._current[r.$onText](e)}_mkAttributes(e,t){let a=null,n=null;const i=Object.create({});for(const{name:o,value:c}of e)if("xmlns"===o)a?(0,s.warn)(`XFA - multiple namespace definition in <${t}>`):a=c;else if(o.startsWith("xmlns:")){const e=o.substring("xmlns:".length);n||(n=[]);n.push({prefix:e,value:c})}else{const e=o.indexOf(":");if(-1===e)i[o]=c;else{let t=i[r.$nsAttributes];t||(t=i[r.$nsAttributes]=Object.create(null));const[a,n]=[o.slice(0,e),o.slice(e+1)];let s=t[a];s||(s=t[a]=Object.create(null));s[n]=c}}return[a,n,i]}_getNameAndPrefix(e,t){const a=e.indexOf(":");return-1===a?[e,null]:[e.substring(a+1),t?"":e.substring(0,a)]}onBeginElement(e,t,a){const[n,i,s]=this._mkAttributes(t,e),[o,c]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),l=this._builder.build({nsPrefix:c,name:o,attributes:s,namespace:n,prefixes:i});l[r.$globalData]=this._globalData;if(a){l[r.$finalize]();this._current[r.$onChild](l)&&l[r.$setId](this._ids);l[r.$clean](this._builder)}else{this._stack.push(this._current);this._current=l}}onEndElement(e){const t=this._current;if(t[r.$isCDATAXml]()&&"string"==typeof t[r.$content]){const e=new XFAParser;e._globalData=this._globalData;const a=e.parse(t[r.$content]);t[r.$content]=null;t[r.$onChild](a)}t[r.$finalize]();this._current=this._stack.pop();this._current[r.$onChild](t)&&t[r.$setId](this._ids);t[r.$clean](this._builder)}onError(e){this._errorCode=e}}t.XFAParser=XFAParser},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Builder=void 0;var r=a(79),n=a(77),i=a(90),s=a(82),o=a(99),c=a(2);class Root extends n.XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[n.$ids]=e}[n.$onChild](e){this.element=e;return!0}[n.$finalize](){super[n.$finalize]();if(this.element.template instanceof s.Template){this[n.$ids].set(n.$root,this.element);this.element.template[n.$resolvePrototypes](this[n.$ids]);this.element.template[n.$ids]=this[n.$ids]}}}class Empty extends n.XFAObject{constructor(){super(-1,"",Object.create(null))}[n.$onChild](e){return!1}}t.Builder=class Builder{constructor(e=null){this._namespaceStack=[];this._nsAgnosticLevel=0;this._namespacePrefixes=new Map;this._namespaces=new Map;this._nextNsId=Math.max(...Object.values(r.NamespaceIds).map((({id:e})=>e)));this._currentNamespace=e||new o.UnknownNamespace(++this._nextNsId)}buildRoot(e){return new Root(e)}build({nsPrefix:e,name:t,attributes:a,namespace:s,prefixes:o}){const c=null!==s;if(c){this._namespaceStack.push(this._currentNamespace);this._currentNamespace=this._searchNamespace(s)}o&&this._addNamespacePrefix(o);if(a.hasOwnProperty(n.$nsAttributes)){const e=i.NamespaceSetUp.datasets,t=a[n.$nsAttributes];let r=null;for(const[a,n]of Object.entries(t)){if(this._getNamespaceToUse(a)===e){r={xfa:n};break}}r?a[n.$nsAttributes]=r:delete a[n.$nsAttributes]}const l=this._getNamespaceToUse(e),h=l&&l[r.$buildXFAObject](t,a)||new Empty;h[n.$isNsAgnostic]()&&this._nsAgnosticLevel++;(c||o||h[n.$isNsAgnostic]())&&(h[n.$cleanup]={hasNamespace:c,prefixes:o,nsAgnostic:h[n.$isNsAgnostic]()});return h}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[a,{check:n}]of Object.entries(r.NamespaceIds))if(n(e)){t=i.NamespaceSetUp[a];if(t){this._namespaces.set(e,t);return t}break}t=new o.UnknownNamespace(++this._nextNsId);this._namespaces.set(e,t);return t}_addNamespacePrefix(e){for(const{prefix:t,value:a}of e){const e=this._searchNamespace(a);let r=this._namespacePrefixes.get(t);if(!r){r=[];this._namespacePrefixes.set(t,r)}r.push(e)}}_getNamespaceToUse(e){if(!e)return this._currentNamespace;const t=this._namespacePrefixes.get(e);if(t&&t.length>0)return t.at(-1);(0,c.warn)(`Unknown namespace prefix: ${e}.`);return null}clean(e){const{hasNamespace:t,prefixes:a,nsAgnostic:r}=e;t&&(this._currentNamespace=this._namespaceStack.pop());a&&a.forEach((({prefix:e})=>{this._namespacePrefixes.get(e).pop()}));r&&this._nsAgnosticLevel--}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NamespaceSetUp=void 0;var r=a(91),n=a(92),i=a(93),s=a(94),o=a(95),c=a(96),l=a(82),h=a(97),u=a(98);const d={config:r.ConfigNamespace,connection:n.ConnectionSetNamespace,datasets:i.DatasetsNamespace,localeSet:s.LocaleSetNamespace,signature:o.SignatureNamespace,stylesheet:c.StylesheetNamespace,template:l.TemplateNamespace,xdp:h.XdpNamespace,xhtml:u.XhtmlNamespace};t.NamespaceSetUp=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ConfigNamespace=void 0;var r=a(79),n=a(77),i=a(78),s=a(2);const o=r.NamespaceIds.config.id;class Acrobat extends n.XFAObject{constructor(e){super(o,"acrobat",!0);this.acrobat7=null;this.autoSave=null;this.common=null;this.validate=null;this.validateApprovalSignatures=null;this.submitUrl=new n.XFAObjectArray}}class Acrobat7 extends n.XFAObject{constructor(e){super(o,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends n.OptionObject{constructor(e){super(o,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends n.OptionObject{constructor(e){super(o,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends n.Option01{constructor(e){super(o,"addSilentPrint")}}class AddViewerPreferences extends n.Option01{constructor(e){super(o,"addViewerPreferences")}}class AdjustData extends n.Option10{constructor(e){super(o,"adjustData")}}class AdobeExtensionLevel extends n.IntegerObject{constructor(e){super(o,"adobeExtensionLevel",0,(e=>e>=1&&e<=8))}}class Agent extends n.XFAObject{constructor(e){super(o,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new n.XFAObjectArray}}class AlwaysEmbed extends n.ContentObject{constructor(e){super(o,"alwaysEmbed")}}class Amd extends n.StringObject{constructor(e){super(o,"amd")}}class Area extends n.XFAObject{constructor(e){super(o,"area");this.level=(0,i.getInteger)({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=(0,i.getStringOption)(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends n.OptionObject{constructor(e){super(o,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends n.OptionObject{constructor(e){super(o,"autoSave",["disabled","enabled"])}}class Base extends n.StringObject{constructor(e){super(o,"base")}}class BatchOutput extends n.XFAObject{constructor(e){super(o,"batchOutput");this.format=(0,i.getStringOption)(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends n.ContentObject{constructor(e){super(o,"behaviorOverride")}[n.$finalize](){this[n.$content]=new Map(this[n.$content].trim().split(/\s+/).filter((e=>e.includes(":"))).map((e=>e.split(":",2))))}}class Cache extends n.XFAObject{constructor(e){super(o,"cache",!0);this.templateCache=null}}class Change extends n.Option01{constructor(e){super(o,"change")}}class Common extends n.XFAObject{constructor(e){super(o,"common",!0);this.data=null;this.locale=null;this.localeSet=null;this.messaging=null;this.suppressBanner=null;this.template=null;this.validationMessaging=null;this.versionControl=null;this.log=new n.XFAObjectArray}}class Compress extends n.XFAObject{constructor(e){super(o,"compress");this.scope=(0,i.getStringOption)(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends n.Option01{constructor(e){super(o,"compressLogicalStructure")}}class CompressObjectStream extends n.Option10{constructor(e){super(o,"compressObjectStream")}}class Compression extends n.XFAObject{constructor(e){super(o,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends n.XFAObject{constructor(e){super(o,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new n.XFAObjectArray}}class Conformance extends n.OptionObject{constructor(e){super(o,"conformance",["A","B"])}}class ContentCopy extends n.Option01{constructor(e){super(o,"contentCopy")}}class Copies extends n.IntegerObject{constructor(e){super(o,"copies",1,(e=>e>=1))}}class Creator extends n.StringObject{constructor(e){super(o,"creator")}}class CurrentPage extends n.IntegerObject{constructor(e){super(o,"currentPage",0,(e=>e>=0))}}class Data extends n.XFAObject{constructor(e){super(o,"data",!0);this.adjustData=null;this.attributes=null;this.incrementalLoad=null;this.outputXSL=null;this.range=null;this.record=null;this.startNode=null;this.uri=null;this.window=null;this.xsl=null;this.excludeNS=new n.XFAObjectArray;this.transform=new n.XFAObjectArray}}class Debug extends n.XFAObject{constructor(e){super(o,"debug",!0);this.uri=null}}class DefaultTypeface extends n.ContentObject{constructor(e){super(o,"defaultTypeface");this.writingScript=(0,i.getStringOption)(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends n.OptionObject{constructor(e){super(o,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends n.Option01{constructor(e){super(o,"documentAssembly")}}class Driver extends n.XFAObject{constructor(e){super(o,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends n.OptionObject{constructor(e){super(o,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends n.OptionObject{constructor(e){super(o,"dynamicRender",["forbidden","required"])}}class Embed extends n.Option01{constructor(e){super(o,"embed")}}class Encrypt extends n.Option01{constructor(e){super(o,"encrypt")}}class Encryption extends n.XFAObject{constructor(e){super(o,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends n.OptionObject{constructor(e){super(o,"encryptionLevel",["40bit","128bit"])}}class Enforce extends n.StringObject{constructor(e){super(o,"enforce")}}class Equate extends n.XFAObject{constructor(e){super(o,"equate");this.force=(0,i.getInteger)({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends n.XFAObject{constructor(e){super(o,"equateRange");this.from=e.from||"";this.to=e.to||"";this._unicodeRange=e.unicodeRange||""}get unicodeRange(){const e=[],t=/U\+([0-9a-fA-F]+)/,a=this._unicodeRange;for(let r of a.split(",").map((e=>e.trim())).filter((e=>!!e))){r=r.split("-",2).map((e=>{const a=e.match(t);return a?parseInt(a[1],16):0}));1===r.length&&r.push(r[0]);e.push(r)}return(0,s.shadow)(this,"unicodeRange",e)}}class Exclude extends n.ContentObject{constructor(e){super(o,"exclude")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e)))}}class ExcludeNS extends n.StringObject{constructor(e){super(o,"excludeNS")}}class FlipLabel extends n.OptionObject{constructor(e){super(o,"flipLabel",["usePrinterSetting","on","off"])}}class FontInfo extends n.XFAObject{constructor(e){super(o,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new n.XFAObjectArray;this.defaultTypeface=new n.XFAObjectArray;this.neverEmbed=new n.XFAObjectArray}}class FormFieldFilling extends n.Option01{constructor(e){super(o,"formFieldFilling")}}class GroupParent extends n.StringObject{constructor(e){super(o,"groupParent")}}class IfEmpty extends n.OptionObject{constructor(e){super(o,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends n.StringObject{constructor(e){super(o,"includeXDPContent")}}class IncrementalLoad extends n.OptionObject{constructor(e){super(o,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends n.Option01{constructor(e){super(o,"incrementalMerge")}}class Interactive extends n.Option01{constructor(e){super(o,"interactive")}}class Jog extends n.OptionObject{constructor(e){super(o,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends n.XFAObject{constructor(e){super(o,"labelPrinter",!0);this.name=(0,i.getStringOption)(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends n.OptionObject{constructor(e){super(o,"layout",["paginate","panel"])}}class Level extends n.IntegerObject{constructor(e){super(o,"level",0,(e=>e>0))}}class Linearized extends n.Option01{constructor(e){super(o,"linearized")}}class Locale extends n.StringObject{constructor(e){super(o,"locale")}}class LocaleSet extends n.StringObject{constructor(e){super(o,"localeSet")}}class Log extends n.XFAObject{constructor(e){super(o,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends n.XFAObject{constructor(e){super(o,"map",!0);this.equate=new n.XFAObjectArray;this.equateRange=new n.XFAObjectArray}}class MediumInfo extends n.XFAObject{constructor(e){super(o,"mediumInfo",!0);this.map=null}}class Message extends n.XFAObject{constructor(e){super(o,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends n.XFAObject{constructor(e){super(o,"messaging",!0);this.message=new n.XFAObjectArray}}class Mode extends n.OptionObject{constructor(e){super(o,"mode",["append","overwrite"])}}class ModifyAnnots extends n.Option01{constructor(e){super(o,"modifyAnnots")}}class MsgId extends n.IntegerObject{constructor(e){super(o,"msgId",1,(e=>e>=1))}}class NameAttr extends n.StringObject{constructor(e){super(o,"nameAttr")}}class NeverEmbed extends n.ContentObject{constructor(e){super(o,"neverEmbed")}}class NumberOfCopies extends n.IntegerObject{constructor(e){super(o,"numberOfCopies",null,(e=>e>=2&&e<=5))}}class OpenAction extends n.XFAObject{constructor(e){super(o,"openAction",!0);this.destination=null}}class Output extends n.XFAObject{constructor(e){super(o,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends n.StringObject{constructor(e){super(o,"outputBin")}}class OutputXSL extends n.XFAObject{constructor(e){super(o,"outputXSL",!0);this.uri=null}}class Overprint extends n.OptionObject{constructor(e){super(o,"overprint",["none","both","draw","field"])}}class Packets extends n.StringObject{constructor(e){super(o,"packets")}[n.$finalize](){"*"!==this[n.$content]&&(this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>["config","datasets","template","xfdf","xslt"].includes(e))))}}class PageOffset extends n.XFAObject{constructor(e){super(o,"pageOffset");this.x=(0,i.getInteger)({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=(0,i.getInteger)({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends n.StringObject{constructor(e){super(o,"pageRange")}[n.$finalize](){const e=this[n.$content].trim().split(/\s+/).map((e=>parseInt(e,10))),t=[];for(let a=0,r=e.length;a!1))}}class Pcl extends n.XFAObject{constructor(e){super(o,"pcl",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.pageOffset=null;this.staple=null;this.xdc=null}}class Pdf extends n.XFAObject{constructor(e){super(o,"pdf",!0);this.name=e.name||"";this.adobeExtensionLevel=null;this.batchOutput=null;this.compression=null;this.creator=null;this.encryption=null;this.fontInfo=null;this.interactive=null;this.linearized=null;this.openAction=null;this.pdfa=null;this.producer=null;this.renderPolicy=null;this.scriptModel=null;this.silentPrint=null;this.submitFormat=null;this.tagged=null;this.version=null;this.viewerPreferences=null;this.xdc=null}}class Pdfa extends n.XFAObject{constructor(e){super(o,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends n.XFAObject{constructor(e){super(o,"permissions",!0);this.accessibleContent=null;this.change=null;this.contentCopy=null;this.documentAssembly=null;this.formFieldFilling=null;this.modifyAnnots=null;this.plaintextMetadata=null;this.print=null;this.printHighQuality=null}}class PickTrayByPDFSize extends n.Option01{constructor(e){super(o,"pickTrayByPDFSize")}}class Picture extends n.StringObject{constructor(e){super(o,"picture")}}class PlaintextMetadata extends n.Option01{constructor(e){super(o,"plaintextMetadata")}}class Presence extends n.OptionObject{constructor(e){super(o,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends n.XFAObject{constructor(e){super(o,"present",!0);this.behaviorOverride=null;this.cache=null;this.common=null;this.copies=null;this.destination=null;this.incrementalMerge=null;this.layout=null;this.output=null;this.overprint=null;this.pagination=null;this.paginationOverride=null;this.script=null;this.validate=null;this.xdp=null;this.driver=new n.XFAObjectArray;this.labelPrinter=new n.XFAObjectArray;this.pcl=new n.XFAObjectArray;this.pdf=new n.XFAObjectArray;this.ps=new n.XFAObjectArray;this.submitUrl=new n.XFAObjectArray;this.webClient=new n.XFAObjectArray;this.zpl=new n.XFAObjectArray}}class Print extends n.Option01{constructor(e){super(o,"print")}}class PrintHighQuality extends n.Option01{constructor(e){super(o,"printHighQuality")}}class PrintScaling extends n.OptionObject{constructor(e){super(o,"printScaling",["appdefault","noScaling"])}}class PrinterName extends n.StringObject{constructor(e){super(o,"printerName")}}class Producer extends n.StringObject{constructor(e){super(o,"producer")}}class Ps extends n.XFAObject{constructor(e){super(o,"ps",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.staple=null;this.xdc=null}}class Range extends n.ContentObject{constructor(e){super(o,"range")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s*,\s*/,2).map((e=>e.split("-").map((e=>parseInt(e.trim(),10))))).filter((e=>e.every((e=>!isNaN(e))))).map((e=>{1===e.length&&e.push(e[0]);return e}))}}class Record extends n.ContentObject{constructor(e){super(o,"record")}[n.$finalize](){this[n.$content]=this[n.$content].trim();const e=parseInt(this[n.$content],10);!isNaN(e)&&e>=0&&(this[n.$content]=e)}}class Relevant extends n.ContentObject{constructor(e){super(o,"relevant")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/)}}class Rename extends n.ContentObject{constructor(e){super(o,"rename")}[n.$finalize](){this[n.$content]=this[n.$content].trim();(this[n.$content].toLowerCase().startsWith("xml")||this[n.$content].match(new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u")))&&(0,s.warn)("XFA - Rename: invalid XFA name")}}class RenderPolicy extends n.OptionObject{constructor(e){super(o,"renderPolicy",["server","client"])}}class RunScripts extends n.OptionObject{constructor(e){super(o,"runScripts",["both","client","none","server"])}}class Script extends n.XFAObject{constructor(e){super(o,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends n.OptionObject{constructor(e){super(o,"scriptModel",["XFA","none"])}}class Severity extends n.OptionObject{constructor(e){super(o,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends n.XFAObject{constructor(e){super(o,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends n.XFAObject{constructor(e){super(o,"staple");this.mode=(0,i.getStringOption)(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends n.StringObject{constructor(e){super(o,"startNode")}}class StartPage extends n.IntegerObject{constructor(e){super(o,"startPage",0,(e=>!0))}}class SubmitFormat extends n.OptionObject{constructor(e){super(o,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends n.StringObject{constructor(e){super(o,"submitUrl")}}class SubsetBelow extends n.IntegerObject{constructor(e){super(o,"subsetBelow",100,(e=>e>=0&&e<=100))}}class SuppressBanner extends n.Option01{constructor(e){super(o,"suppressBanner")}}class Tagged extends n.Option01{constructor(e){super(o,"tagged")}}class Template extends n.XFAObject{constructor(e){super(o,"template",!0);this.base=null;this.relevant=null;this.startPage=null;this.uri=null;this.xsl=null}}class Threshold extends n.OptionObject{constructor(e){super(o,"threshold",["trace","error","information","warning"])}}class To extends n.OptionObject{constructor(e){super(o,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends n.XFAObject{constructor(e){super(o,"templateCache");this.maxEntries=(0,i.getInteger)({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends n.XFAObject{constructor(e){super(o,"trace",!0);this.area=new n.XFAObjectArray}}class Transform extends n.XFAObject{constructor(e){super(o,"transform",!0);this.groupParent=null;this.ifEmpty=null;this.nameAttr=null;this.picture=null;this.presence=null;this.rename=null;this.whitespace=null}}class Type extends n.OptionObject{constructor(e){super(o,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends n.StringObject{constructor(e){super(o,"uri")}}class Validate extends n.OptionObject{constructor(e){super(o,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends n.ContentObject{constructor(e){super(o,"validateApprovalSignatures")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>["docReady","postSign"].includes(e)))}}class ValidationMessaging extends n.OptionObject{constructor(e){super(o,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends n.OptionObject{constructor(e){super(o,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends n.XFAObject{constructor(e){super(o,"VersionControl");this.outputBelow=(0,i.getStringOption)(e.outputBelow,["warn","error","update"]);this.sourceAbove=(0,i.getStringOption)(e.sourceAbove,["warn","error"]);this.sourceBelow=(0,i.getStringOption)(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends n.XFAObject{constructor(e){super(o,"viewerPreferences",!0);this.ADBE_JSConsole=null;this.ADBE_JSDebugger=null;this.addViewerPreferences=null;this.duplexOption=null;this.enforce=null;this.numberOfCopies=null;this.pageRange=null;this.pickTrayByPDFSize=null;this.printScaling=null}}class WebClient extends n.XFAObject{constructor(e){super(o,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends n.OptionObject{constructor(e){super(o,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends n.ContentObject{constructor(e){super(o,"window")}[n.$finalize](){const e=this[n.$content].trim().split(/\s*,\s*/,2).map((e=>parseInt(e,10)));if(e.some((e=>isNaN(e))))this[n.$content]=[0,0];else{1===e.length&&e.push(e[0]);this[n.$content]=e}}}class Xdc extends n.XFAObject{constructor(e){super(o,"xdc",!0);this.uri=new n.XFAObjectArray;this.xsl=new n.XFAObjectArray}}class Xdp extends n.XFAObject{constructor(e){super(o,"xdp",!0);this.packets=null}}class Xsl extends n.XFAObject{constructor(e){super(o,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends n.XFAObject{constructor(e){super(o,"zpl",!0);this.name=e.name?e.name.trim():"";this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class ConfigNamespace{static[r.$buildXFAObject](e,t){if(ConfigNamespace.hasOwnProperty(e))return ConfigNamespace[e](t)}static acrobat(e){return new Acrobat(e)}static acrobat7(e){return new Acrobat7(e)}static ADBE_JSConsole(e){return new ADBE_JSConsole(e)}static ADBE_JSDebugger(e){return new ADBE_JSDebugger(e)}static addSilentPrint(e){return new AddSilentPrint(e)}static addViewerPreferences(e){return new AddViewerPreferences(e)}static adjustData(e){return new AdjustData(e)}static adobeExtensionLevel(e){return new AdobeExtensionLevel(e)}static agent(e){return new Agent(e)}static alwaysEmbed(e){return new AlwaysEmbed(e)}static amd(e){return new Amd(e)}static area(e){return new Area(e)}static attributes(e){return new Attributes(e)}static autoSave(e){return new AutoSave(e)}static base(e){return new Base(e)}static batchOutput(e){return new BatchOutput(e)}static behaviorOverride(e){return new BehaviorOverride(e)}static cache(e){return new Cache(e)}static change(e){return new Change(e)}static common(e){return new Common(e)}static compress(e){return new Compress(e)}static compressLogicalStructure(e){return new CompressLogicalStructure(e)}static compressObjectStream(e){return new CompressObjectStream(e)}static compression(e){return new Compression(e)}static config(e){return new Config(e)}static conformance(e){return new Conformance(e)}static contentCopy(e){return new ContentCopy(e)}static copies(e){return new Copies(e)}static creator(e){return new Creator(e)}static currentPage(e){return new CurrentPage(e)}static data(e){return new Data(e)}static debug(e){return new Debug(e)}static defaultTypeface(e){return new DefaultTypeface(e)}static destination(e){return new Destination(e)}static documentAssembly(e){return new DocumentAssembly(e)}static driver(e){return new Driver(e)}static duplexOption(e){return new DuplexOption(e)}static dynamicRender(e){return new DynamicRender(e)}static embed(e){return new Embed(e)}static encrypt(e){return new Encrypt(e)}static encryption(e){return new Encryption(e)}static encryptionLevel(e){return new EncryptionLevel(e)}static enforce(e){return new Enforce(e)}static equate(e){return new Equate(e)}static equateRange(e){return new EquateRange(e)}static exclude(e){return new Exclude(e)}static excludeNS(e){return new ExcludeNS(e)}static flipLabel(e){return new FlipLabel(e)}static fontInfo(e){return new FontInfo(e)}static formFieldFilling(e){return new FormFieldFilling(e)}static groupParent(e){return new GroupParent(e)}static ifEmpty(e){return new IfEmpty(e)}static includeXDPContent(e){return new IncludeXDPContent(e)}static incrementalLoad(e){return new IncrementalLoad(e)}static incrementalMerge(e){return new IncrementalMerge(e)}static interactive(e){return new Interactive(e)}static jog(e){return new Jog(e)}static labelPrinter(e){return new LabelPrinter(e)}static layout(e){return new Layout(e)}static level(e){return new Level(e)}static linearized(e){return new Linearized(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static log(e){return new Log(e)}static map(e){return new MapElement(e)}static mediumInfo(e){return new MediumInfo(e)}static message(e){return new Message(e)}static messaging(e){return new Messaging(e)}static mode(e){return new Mode(e)}static modifyAnnots(e){return new ModifyAnnots(e)}static msgId(e){return new MsgId(e)}static nameAttr(e){return new NameAttr(e)}static neverEmbed(e){return new NeverEmbed(e)}static numberOfCopies(e){return new NumberOfCopies(e)}static openAction(e){return new OpenAction(e)}static output(e){return new Output(e)}static outputBin(e){return new OutputBin(e)}static outputXSL(e){return new OutputXSL(e)}static overprint(e){return new Overprint(e)}static packets(e){return new Packets(e)}static pageOffset(e){return new PageOffset(e)}static pageRange(e){return new PageRange(e)}static pagination(e){return new Pagination(e)}static paginationOverride(e){return new PaginationOverride(e)}static part(e){return new Part(e)}static pcl(e){return new Pcl(e)}static pdf(e){return new Pdf(e)}static pdfa(e){return new Pdfa(e)}static permissions(e){return new Permissions(e)}static pickTrayByPDFSize(e){return new PickTrayByPDFSize(e)}static picture(e){return new Picture(e)}static plaintextMetadata(e){return new PlaintextMetadata(e)}static presence(e){return new Presence(e)}static present(e){return new Present(e)}static print(e){return new Print(e)}static printHighQuality(e){return new PrintHighQuality(e)}static printScaling(e){return new PrintScaling(e)}static printerName(e){return new PrinterName(e)}static producer(e){return new Producer(e)}static ps(e){return new Ps(e)}static range(e){return new Range(e)}static record(e){return new Record(e)}static relevant(e){return new Relevant(e)}static rename(e){return new Rename(e)}static renderPolicy(e){return new RenderPolicy(e)}static runScripts(e){return new RunScripts(e)}static script(e){return new Script(e)}static scriptModel(e){return new ScriptModel(e)}static severity(e){return new Severity(e)}static silentPrint(e){return new SilentPrint(e)}static staple(e){return new Staple(e)}static startNode(e){return new StartNode(e)}static startPage(e){return new StartPage(e)}static submitFormat(e){return new SubmitFormat(e)}static submitUrl(e){return new SubmitUrl(e)}static subsetBelow(e){return new SubsetBelow(e)}static suppressBanner(e){return new SuppressBanner(e)}static tagged(e){return new Tagged(e)}static template(e){return new Template(e)}static templateCache(e){return new TemplateCache(e)}static threshold(e){return new Threshold(e)}static to(e){return new To(e)}static trace(e){return new Trace(e)}static transform(e){return new Transform(e)}static type(e){return new Type(e)}static uri(e){return new Uri(e)}static validate(e){return new Validate(e)}static validateApprovalSignatures(e){return new ValidateApprovalSignatures(e)}static validationMessaging(e){return new ValidationMessaging(e)}static version(e){return new Version(e)}static versionControl(e){return new VersionControl(e)}static viewerPreferences(e){return new ViewerPreferences(e)}static webClient(e){return new WebClient(e)}static whitespace(e){return new Whitespace(e)}static window(e){return new Window(e)}static xdc(e){return new Xdc(e)}static xdp(e){return new Xdp(e)}static xsl(e){return new Xsl(e)}static zpl(e){return new Zpl(e)}}t.ConfigNamespace=ConfigNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ConnectionSetNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.connectionSet.id;class ConnectionSet extends n.XFAObject{constructor(e){super(i,"connectionSet",!0);this.wsdlConnection=new n.XFAObjectArray;this.xmlConnection=new n.XFAObjectArray;this.xsdConnection=new n.XFAObjectArray}}class EffectiveInputPolicy extends n.XFAObject{constructor(e){super(i,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends n.XFAObject{constructor(e){super(i,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends n.StringObject{constructor(e){super(i,"operation");this.id=e.id||"";this.input=e.input||"";this.name=e.name||"";this.output=e.output||"";this.use=e.use||"";this.usehref=e.usehref||""}}class RootElement extends n.StringObject{constructor(e){super(i,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends n.StringObject{constructor(e){super(i,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends n.StringObject{constructor(e){super(i,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Uri extends n.StringObject{constructor(e){super(i,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends n.StringObject{constructor(e){super(i,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends n.XFAObject{constructor(e){super(i,"wsdlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.effectiveInputPolicy=null;this.effectiveOutputPolicy=null;this.operation=null;this.soapAction=null;this.soapAddress=null;this.wsdlAddress=null}}class XmlConnection extends n.XFAObject{constructor(e){super(i,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends n.XFAObject{constructor(e){super(i,"xsdConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.rootElement=null;this.uri=null}}class ConnectionSetNamespace{static[r.$buildXFAObject](e,t){if(ConnectionSetNamespace.hasOwnProperty(e))return ConnectionSetNamespace[e](t)}static connectionSet(e){return new ConnectionSet(e)}static effectiveInputPolicy(e){return new EffectiveInputPolicy(e)}static effectiveOutputPolicy(e){return new EffectiveOutputPolicy(e)}static operation(e){return new Operation(e)}static rootElement(e){return new RootElement(e)}static soapAction(e){return new SoapAction(e)}static soapAddress(e){return new SoapAddress(e)}static uri(e){return new Uri(e)}static wsdlAddress(e){return new WsdlAddress(e)}static wsdlConnection(e){return new WsdlConnection(e)}static xmlConnection(e){return new XmlConnection(e)}static xsdConnection(e){return new XsdConnection(e)}}t.ConnectionSetNamespace=ConnectionSetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DatasetsNamespace=void 0;var r=a(77),n=a(79);const i=n.NamespaceIds.datasets.id;class Data extends r.XmlObject{constructor(e){super(i,"data",e)}[r.$isNsAgnostic](){return!0}}class Datasets extends r.XFAObject{constructor(e){super(i,"datasets",!0);this.data=null;this.Signature=null}[r.$onChild](e){const t=e[r.$nodeName];("data"===t&&e[r.$namespaceId]===i||"Signature"===t&&e[r.$namespaceId]===n.NamespaceIds.signature.id)&&(this[t]=e);this[r.$appendChild](e)}}class DatasetsNamespace{static[n.$buildXFAObject](e,t){if(DatasetsNamespace.hasOwnProperty(e))return DatasetsNamespace[e](t)}static datasets(e){return new Datasets(e)}static data(e){return new Data(e)}}t.DatasetsNamespace=DatasetsNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LocaleSetNamespace=void 0;var r=a(79),n=a(77),i=a(78);const s=r.NamespaceIds.localeSet.id;class CalendarSymbols extends n.XFAObject{constructor(e){super(s,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new n.XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new n.XFAObjectArray(2)}}class CurrencySymbol extends n.StringObject{constructor(e){super(s,"currencySymbol");this.name=(0,i.getStringOption)(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends n.XFAObject{constructor(e){super(s,"currencySymbols",!0);this.currencySymbol=new n.XFAObjectArray(3)}}class DatePattern extends n.StringObject{constructor(e){super(s,"datePattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class DatePatterns extends n.XFAObject{constructor(e){super(s,"datePatterns",!0);this.datePattern=new n.XFAObjectArray(4)}}class DateTimeSymbols extends n.ContentObject{constructor(e){super(s,"dateTimeSymbols")}}class Day extends n.StringObject{constructor(e){super(s,"day")}}class DayNames extends n.XFAObject{constructor(e){super(s,"dayNames",!0);this.abbr=(0,i.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new n.XFAObjectArray(7)}}class Era extends n.StringObject{constructor(e){super(s,"era")}}class EraNames extends n.XFAObject{constructor(e){super(s,"eraNames",!0);this.era=new n.XFAObjectArray(2)}}class Locale extends n.XFAObject{constructor(e){super(s,"locale",!0);this.desc=e.desc||"";this.name="isoname";this.calendarSymbols=null;this.currencySymbols=null;this.datePatterns=null;this.dateTimeSymbols=null;this.numberPatterns=null;this.numberSymbols=null;this.timePatterns=null;this.typeFaces=null}}class LocaleSet extends n.XFAObject{constructor(e){super(s,"localeSet",!0);this.locale=new n.XFAObjectArray}}class Meridiem extends n.StringObject{constructor(e){super(s,"meridiem")}}class MeridiemNames extends n.XFAObject{constructor(e){super(s,"meridiemNames",!0);this.meridiem=new n.XFAObjectArray(2)}}class Month extends n.StringObject{constructor(e){super(s,"month")}}class MonthNames extends n.XFAObject{constructor(e){super(s,"monthNames",!0);this.abbr=(0,i.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new n.XFAObjectArray(12)}}class NumberPattern extends n.StringObject{constructor(e){super(s,"numberPattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class NumberPatterns extends n.XFAObject{constructor(e){super(s,"numberPatterns",!0);this.numberPattern=new n.XFAObjectArray(4)}}class NumberSymbol extends n.StringObject{constructor(e){super(s,"numberSymbol");this.name=(0,i.getStringOption)(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends n.XFAObject{constructor(e){super(s,"numberSymbols",!0);this.numberSymbol=new n.XFAObjectArray(5)}}class TimePattern extends n.StringObject{constructor(e){super(s,"timePattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class TimePatterns extends n.XFAObject{constructor(e){super(s,"timePatterns",!0);this.timePattern=new n.XFAObjectArray(4)}}class TypeFace extends n.XFAObject{constructor(e){super(s,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends n.XFAObject{constructor(e){super(s,"typeFaces",!0);this.typeFace=new n.XFAObjectArray}}class LocaleSetNamespace{static[r.$buildXFAObject](e,t){if(LocaleSetNamespace.hasOwnProperty(e))return LocaleSetNamespace[e](t)}static calendarSymbols(e){return new CalendarSymbols(e)}static currencySymbol(e){return new CurrencySymbol(e)}static currencySymbols(e){return new CurrencySymbols(e)}static datePattern(e){return new DatePattern(e)}static datePatterns(e){return new DatePatterns(e)}static dateTimeSymbols(e){return new DateTimeSymbols(e)}static day(e){return new Day(e)}static dayNames(e){return new DayNames(e)}static era(e){return new Era(e)}static eraNames(e){return new EraNames(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static meridiem(e){return new Meridiem(e)}static meridiemNames(e){return new MeridiemNames(e)}static month(e){return new Month(e)}static monthNames(e){return new MonthNames(e)}static numberPattern(e){return new NumberPattern(e)}static numberPatterns(e){return new NumberPatterns(e)}static numberSymbol(e){return new NumberSymbol(e)}static numberSymbols(e){return new NumberSymbols(e)}static timePattern(e){return new TimePattern(e)}static timePatterns(e){return new TimePatterns(e)}static typeFace(e){return new TypeFace(e)}static typeFaces(e){return new TypeFaces(e)}}t.LocaleSetNamespace=LocaleSetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SignatureNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.signature.id;class Signature extends n.XFAObject{constructor(e){super(i,"signature",!0)}}class SignatureNamespace{static[r.$buildXFAObject](e,t){if(SignatureNamespace.hasOwnProperty(e))return SignatureNamespace[e](t)}static signature(e){return new Signature(e)}}t.SignatureNamespace=SignatureNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StylesheetNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.stylesheet.id;class Stylesheet extends n.XFAObject{constructor(e){super(i,"stylesheet",!0)}}class StylesheetNamespace{static[r.$buildXFAObject](e,t){if(StylesheetNamespace.hasOwnProperty(e))return StylesheetNamespace[e](t)}static stylesheet(e){return new Stylesheet(e)}}t.StylesheetNamespace=StylesheetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XdpNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.xdp.id;class Xdp extends n.XFAObject{constructor(e){super(i,"xdp",!0);this.uuid=e.uuid||"";this.timeStamp=e.timeStamp||"";this.config=null;this.connectionSet=null;this.datasets=null;this.localeSet=null;this.stylesheet=new n.XFAObjectArray;this.template=null}[n.$onChildCheck](e){const t=r.NamespaceIds[e[n.$nodeName]];return t&&e[n.$namespaceId]===t.id}}class XdpNamespace{static[r.$buildXFAObject](e,t){if(XdpNamespace.hasOwnProperty(e))return XdpNamespace[e](t)}static xdp(e){return new Xdp(e)}}t.XdpNamespace=XdpNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XhtmlNamespace=void 0;var r=a(77),n=a(79),i=a(84),s=a(78);const o=n.NamespaceIds.xhtml.id,c=Symbol(),l=new Set(["color","font","font-family","font-size","font-stretch","font-style","font-weight","margin","margin-bottom","margin-left","margin-right","margin-top","letter-spacing","line-height","orphans","page-break-after","page-break-before","page-break-inside","tab-interval","tab-stop","text-align","text-decoration","text-indent","vertical-align","widows","kerning-mode","xfa-font-horizontal-scale","xfa-font-vertical-scale","xfa-spacerun","xfa-tab-stops"]),h=new Map([["page-break-after","breakAfter"],["page-break-before","breakBefore"],["page-break-inside","breakInside"],["kerning-mode",e=>"none"===e?"none":"normal"],["xfa-font-horizontal-scale",e=>`scaleX(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-font-vertical-scale",e=>`scaleY(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-spacerun",""],["xfa-tab-stops",""],["font-size",(e,t)=>{e=t.fontSize=(0,s.getMeasurement)(e);return(0,i.measureToString)(.99*e)}],["letter-spacing",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["line-height",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-bottom",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-left",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-right",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-top",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["text-indent",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["font-family",e=>e],["vertical-align",e=>(0,i.measureToString)((0,s.getMeasurement)(e))]]),u=/\s+/g,d=/[\r\n]+/g,f=/\r\n?/g;function mapStyle(e,t,a){const n=Object.create(null);if(!e)return n;const o=Object.create(null);for(const[t,a]of e.split(";").map((e=>e.split(":",2)))){const e=h.get(t);if(""===e)continue;let r=a;e&&(r="string"==typeof e?e:e(a,o));t.endsWith("scale")?n.transform?n.transform=`${n[t]} ${r}`:n.transform=r:n[t.replaceAll(/-([a-zA-Z])/g,((e,t)=>t.toUpperCase()))]=r}n.fontFamily&&(0,i.setFontFamily)({typeface:n.fontFamily,weight:n.fontWeight||"normal",posture:n.fontStyle||"normal",size:o.fontSize||0},t,t[r.$globalData].fontFinder,n);if(a&&n.verticalAlign&&"0px"!==n.verticalAlign&&n.fontSize){const e=.583,t=.333,a=(0,s.getMeasurement)(n.fontSize);n.fontSize=(0,i.measureToString)(a*e);n.verticalAlign=(0,i.measureToString)(Math.sign((0,s.getMeasurement)(n.verticalAlign))*a*t)}a&&n.fontSize&&(n.fontSize=`calc(${n.fontSize} * var(--scale-factor))`);(0,i.fixTextIndent)(n);return n}const g=new Set(["body","html"]);class XhtmlObject extends r.XmlObject{constructor(e,t){super(o,t);this[c]=!1;this.style=e.style||""}[r.$clean](e){super[r.$clean](e);this.style=function checkStyle(e){return e.style?e.style.trim().split(/\s*;\s*/).filter((e=>!!e)).map((e=>e.split(/\s*:\s*/,2))).filter((([t,a])=>{"font-family"===t&&e[r.$globalData].usedTypefaces.add(a);return l.has(t)})).map((e=>e.join(":"))).join(";"):""}(this)}[r.$acceptWhitespace](){return!g.has(this[r.$nodeName])}[r.$onText](e,t=!1){if(t)this[c]=!0;else{e=e.replace(d,"");this.style.includes("xfa-spacerun:yes")||(e=e.replace(u," "))}e&&(this[r.$content]+=e)}[r.$pushGlyphs](e,t=!0){const a=Object.create(null),n={top:NaN,bottom:NaN,left:NaN,right:NaN};let i=null;for(const[e,t]of this.style.split(";").map((e=>e.split(":",2))))switch(e){case"font-family":a.typeface=(0,s.stripQuotes)(t);break;case"font-size":a.size=(0,s.getMeasurement)(t);break;case"font-weight":a.weight=t;break;case"font-style":a.posture=t;break;case"letter-spacing":a.letterSpacing=(0,s.getMeasurement)(t);break;case"margin":const e=t.split(/ \t/).map((e=>(0,s.getMeasurement)(e)));switch(e.length){case 1:n.top=n.bottom=n.left=n.right=e[0];break;case 2:n.top=n.bottom=e[0];n.left=n.right=e[1];break;case 3:n.top=e[0];n.bottom=e[2];n.left=n.right=e[1];break;case 4:n.top=e[0];n.left=e[1];n.bottom=e[2];n.right=e[3]}break;case"margin-top":n.top=(0,s.getMeasurement)(t);break;case"margin-bottom":n.bottom=(0,s.getMeasurement)(t);break;case"margin-left":n.left=(0,s.getMeasurement)(t);break;case"margin-right":n.right=(0,s.getMeasurement)(t);break;case"line-height":i=(0,s.getMeasurement)(t)}e.pushData(a,n,i);if(this[r.$content])e.addString(this[r.$content]);else for(const t of this[r.$getChildren]())"#text"!==t[r.$nodeName]?t[r.$pushGlyphs](e):e.addString(t[r.$content]);t&&e.popFont()}[r.$toHTML](e){const t=[];this[r.$extra]={children:t};this[r.$childrenToHTML]({});if(0===t.length&&!this[r.$content])return s.HTMLResult.EMPTY;let a;a=this[c]?this[r.$content]?this[r.$content].replace(f,"\n"):void 0:this[r.$content]||void 0;return s.HTMLResult.success({name:this[r.$nodeName],attributes:{href:this.href,style:mapStyle(this.style,this,this[c])},children:t,value:a})}}class A extends XhtmlObject{constructor(e){super(e,"a");this.href=(0,i.fixURL)(e.href)||""}}class B extends XhtmlObject{constructor(e){super(e,"b")}[r.$pushGlyphs](e){e.pushFont({weight:"bold"});super[r.$pushGlyphs](e);e.popFont()}}class Body extends XhtmlObject{constructor(e){super(e,"body")}[r.$toHTML](e){const t=super[r.$toHTML](e),{html:a}=t;if(!a)return s.HTMLResult.EMPTY;a.name="div";a.attributes.class=["xfaRich"];return t}}class Br extends XhtmlObject{constructor(e){super(e,"br")}[r.$text](){return"\n"}[r.$pushGlyphs](e){e.addString("\n")}[r.$toHTML](e){return s.HTMLResult.success({name:"br"})}}class Html extends XhtmlObject{constructor(e){super(e,"html")}[r.$toHTML](e){const t=[];this[r.$extra]={children:t};this[r.$childrenToHTML]({});if(0===t.length)return s.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},value:this[r.$content]||""});if(1===t.length){const e=t[0];if(e.attributes&&e.attributes.class.includes("xfaRich"))return s.HTMLResult.success(e)}return s.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},children:t})}}class I extends XhtmlObject{constructor(e){super(e,"i")}[r.$pushGlyphs](e){e.pushFont({posture:"italic"});super[r.$pushGlyphs](e);e.popFont()}}class Li extends XhtmlObject{constructor(e){super(e,"li")}}class Ol extends XhtmlObject{constructor(e){super(e,"ol")}}class P extends XhtmlObject{constructor(e){super(e,"p")}[r.$pushGlyphs](e){super[r.$pushGlyphs](e,!1);e.addString("\n");e.addPara();e.popFont()}[r.$text](){return this[r.$getParent]()[r.$getChildren]().at(-1)===this?super[r.$text]():super[r.$text]()+"\n"}}class Span extends XhtmlObject{constructor(e){super(e,"span")}}class Sub extends XhtmlObject{constructor(e){super(e,"sub")}}class Sup extends XhtmlObject{constructor(e){super(e,"sup")}}class Ul extends XhtmlObject{constructor(e){super(e,"ul")}}class XhtmlNamespace{static[n.$buildXFAObject](e,t){if(XhtmlNamespace.hasOwnProperty(e))return XhtmlNamespace[e](t)}static a(e){return new A(e)}static b(e){return new B(e)}static body(e){return new Body(e)}static br(e){return new Br(e)}static html(e){return new Html(e)}static i(e){return new I(e)}static li(e){return new Li(e)}static ol(e){return new Ol(e)}static p(e){return new P(e)}static span(e){return new Span(e)}static sub(e){return new Sub(e)}static sup(e){return new Sup(e)}static ul(e){return new Ul(e)}}t.XhtmlNamespace=XhtmlNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.UnknownNamespace=void 0;var r=a(79),n=a(77);class UnknownNamespace{constructor(e){this.namespaceId=e}[r.$buildXFAObject](e,t){return new n.XmlObject(this.namespaceId,e,t)}}t.UnknownNamespace=UnknownNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DatasetReader=void 0;var r=a(2),n=a(6),i=a(66);function decodeString(e){try{return(0,r.stringToUTF8String)(e)}catch(t){(0,r.warn)(`UTF-8 decoding failed: "${t}".`);return e}}class DatasetXMLParser extends i.SimpleXMLParser{constructor(e){super(e);this.node=null}onEndElement(e){const t=super.onEndElement(e);if(t&&"xfa:datasets"===e){this.node=t;throw new Error("Aborting DatasetXMLParser.")}}}t.DatasetReader=class DatasetReader{constructor(e){if(e.datasets)this.node=new i.SimpleXMLParser({hasAttributes:!0}).parseFromString(e.datasets).documentElement;else{const t=new DatasetXMLParser({hasAttributes:!0});try{t.parseFromString(e["xdp:xdp"])}catch(e){}this.node=t.node}}getValue(e){if(!this.node||!e)return"";const t=this.node.searchNode((0,n.parseXFAPath)(e),0);if(!t)return"";const a=t.firstChild;return a&&"value"===a.nodeName?t.children.map((e=>decodeString(e.textContent))):decodeString(t.textContent)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XRef=void 0;var r=a(2),n=a(5),i=a(6),s=a(17),o=a(7),c=a(67);t.XRef=class XRef{constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this.xrefstms=Object.create(null);this._cacheMap=new Map;this._pendingRefs=new n.RefSet;this.stats=new i.DocStats(t.msgHandler);this._newRefNum=null}getNewRef(){null===this._newRefNum&&(this._newRefNum=this.entries.length||1);return n.Ref.get(this._newRefNum++,0)}resetNewRef(){this._newRefNum=null}setStartXRef(e){this.startXRefQueue=[e]}parse(e=!1){let t,a,s;if(e){(0,r.warn)("Indexing all PDF objects");t=this.indexObjects()}else t=this.readXRef();t.assignXref(this);this.trailer=t;try{a=t.get("Encrypt")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Encrypt" reference: "${e}".`)}if(a instanceof n.Dict){const e=t.get("ID"),r=e&&e.length?e[0]:"";a.suppressEncryption=!0;this.encrypt=new c.CipherTransformFactory(a,r,this.pdfManager.password)}try{s=t.get("Root")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Root" reference: "${e}".`)}if(s instanceof n.Dict)try{if(s.get("Pages")instanceof n.Dict){this.root=s;return}}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Pages" reference: "${e}".`)}if(!e)throw new i.XRefParseException;throw new r.InvalidPDFException("Invalid Root reference.")}processXRefTable(e){"tableState"in this||(this.tableState={entryNum:0,streamPos:e.lexer.stream.pos,parserBuf1:e.buf1,parserBuf2:e.buf2});const t=this.readXRefTable(e);if(!(0,n.isCmd)(t,"trailer"))throw new r.FormatError("Invalid XRef table: could not find trailer dictionary");let a=e.getObj();a instanceof n.Dict||!a.dict||(a=a.dict);if(!(a instanceof n.Dict))throw new r.FormatError("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return a}readXRefTable(e){const t=e.lexer.stream,a=this.tableState;t.pos=a.streamPos;e.buf1=a.parserBuf1;e.buf2=a.parserBuf2;let i;for(;;){if(!("firstEntryNum"in a)||!("entryCount"in a)){if((0,n.isCmd)(i=e.getObj(),"trailer"))break;a.firstEntryNum=i;a.entryCount=e.getObj()}let s=a.firstEntryNum;const o=a.entryCount;if(!Number.isInteger(s)||!Number.isInteger(o))throw new r.FormatError("Invalid XRef table: wrong types in subsection header");for(let i=a.entryNum;i0;){const[o,c]=s;if(!Number.isInteger(o)||!Number.isInteger(c))throw new r.FormatError(`Invalid XRef range fields: ${o}, ${c}`);if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(i))throw new r.FormatError(`Invalid XRef entry fields length: ${o}, ${c}`);for(let s=t.entryNum;s=e.length);){a+=String.fromCharCode(r);r=e[t]}return a}function skipUntil(e,t,a){const r=a.length,n=e.length;let i=0;for(;t=r)break;t++;i++}return i}const e=/^(\d+)\s+(\d+)\s+obj\b/,t=/\bendobj[\b\s]$/,a=/\s+(\d+\s+\d+\s+obj[\b\s<])$/,o=new Uint8Array([116,114,97,105,108,101,114]),c=new Uint8Array([115,116,97,114,116,120,114,101,102]),l=new Uint8Array([111,98,106]),h=new Uint8Array([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const u=this.stream;u.pos=0;const d=u.getBytes(),f=d.length;let g=u.start;const p=[],m=[];for(;g=f)break;n=d[g]}while(10!==n&&13!==n);continue}const b=readToken(d,g);let y;if(b.startsWith("xref")&&(4===b.length||/\s/.test(b[4]))){g+=skipUntil(d,g,o);p.push(g);g+=skipUntil(d,g,c)}else if(y=e.exec(b)){const e=0|y[1],n=0|y[2];let o,c=g+b.length,f=!1;if(this.entries[e]){if(this.entries[e].gen===n)try{new s.Parser({lexer:new s.Lexer(u.makeSubStream(c))}).getObj();f=!0}catch(e){e instanceof i.ParserEOFException?(0,r.warn)(`indexObjects -- checking object (${b}): "${e}".`):f=!0}}else f=!0;f&&(this.entries[e]={offset:g-u.start,gen:n,uncompressed:!0});for(;c{Object.defineProperty(t,"__esModule",{value:!0});t.MessageHandler=void 0;var r=a(2);const n=1,i=2,s=1,o=2,c=3,l=4,h=5,u=6,d=7,f=8;function wrapReason(e){e instanceof Error||"object"==typeof e&&null!==e||(0,r.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(e.name){case"AbortException":return new r.AbortException(e.message);case"MissingPDFException":return new r.MissingPDFException(e.message);case"PasswordException":return new r.PasswordException(e.message,e.code);case"UnexpectedResponseException":return new r.UnexpectedResponseException(e.message,e.status);case"UnknownErrorException":return new r.UnknownErrorException(e.message,e.details);default:return new r.UnknownErrorException(e.message,e.toString())}}t.MessageHandler=class MessageHandler{constructor(e,t,a){this.sourceName=e;this.targetName=t;this.comObj=a;this.callbackId=1;this.streamId=1;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);this._onComObjOnMessage=e=>{const t=e.data;if(t.targetName!==this.sourceName)return;if(t.stream){this._processStreamMessage(t);return}if(t.callback){const e=t.callbackId,a=this.callbackCapabilities[e];if(!a)throw new Error(`Cannot resolve callback ${e}`);delete this.callbackCapabilities[e];if(t.callback===n)a.resolve(t.data);else{if(t.callback!==i)throw new Error("Unexpected callback case");a.reject(wrapReason(t.reason))}return}const r=this.actionHandler[t.action];if(!r)throw new Error(`Unknown action from worker: ${t.action}`);if(t.callbackId){const e=this.sourceName,s=t.sourceName;new Promise((function(e){e(r(t.data))})).then((function(r){a.postMessage({sourceName:e,targetName:s,callback:n,callbackId:t.callbackId,data:r})}),(function(r){a.postMessage({sourceName:e,targetName:s,callback:i,callbackId:t.callbackId,reason:wrapReason(r)})}))}else t.streamId?this._createStreamSink(t):r(t.data)};a.addEventListener("message",this._onComObjOnMessage)}on(e,t){const a=this.actionHandler;if(a[e])throw new Error(`There is already an actionName called "${e}"`);a[e]=t}send(e,t,a){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},a)}sendWithPromise(e,t,a){const n=this.callbackId++,i=(0,r.createPromiseCapability)();this.callbackCapabilities[n]=i;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:n,data:t},a)}catch(e){i.reject(e)}return i.promise}sendWithStream(e,t,a,n){const i=this.streamId++,o=this.sourceName,c=this.targetName,l=this.comObj;return new ReadableStream({start:a=>{const s=(0,r.createPromiseCapability)();this.streamControllers[i]={controller:a,startCall:s,pullCall:null,cancelCall:null,isClosed:!1};l.postMessage({sourceName:o,targetName:c,action:e,streamId:i,data:t,desiredSize:a.desiredSize},n);return s.promise},pull:e=>{const t=(0,r.createPromiseCapability)();this.streamControllers[i].pullCall=t;l.postMessage({sourceName:o,targetName:c,stream:u,streamId:i,desiredSize:e.desiredSize});return t.promise},cancel:e=>{(0,r.assert)(e instanceof Error,"cancel must have a valid reason");const t=(0,r.createPromiseCapability)();this.streamControllers[i].cancelCall=t;this.streamControllers[i].isClosed=!0;l.postMessage({sourceName:o,targetName:c,stream:s,streamId:i,reason:wrapReason(e)});return t.promise}},a)}_createStreamSink(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,i=this.comObj,s=this,o=this.actionHandler[e.action],u={enqueue(e,s=1,o){if(this.isCancelled)return;const c=this.desiredSize;this.desiredSize-=s;if(c>0&&this.desiredSize<=0){this.sinkCapability=(0,r.createPromiseCapability)();this.ready=this.sinkCapability.promise}i.postMessage({sourceName:a,targetName:n,stream:l,streamId:t,chunk:e},o)},close(){if(!this.isCancelled){this.isCancelled=!0;i.postMessage({sourceName:a,targetName:n,stream:c,streamId:t});delete s.streamSinks[t]}},error(e){(0,r.assert)(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;i.postMessage({sourceName:a,targetName:n,stream:h,streamId:t,reason:wrapReason(e)})}},sinkCapability:(0,r.createPromiseCapability)(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};u.sinkCapability.resolve();u.ready=u.sinkCapability.promise;this.streamSinks[t]=u;new Promise((function(t){t(o(e.data,u))})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:f,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:f,streamId:t,reason:wrapReason(e)})}))}_processStreamMessage(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,i=this.comObj,g=this.streamControllers[t],p=this.streamSinks[t];switch(e.stream){case f:e.success?g.startCall.resolve():g.startCall.reject(wrapReason(e.reason));break;case d:e.success?g.pullCall.resolve():g.pullCall.reject(wrapReason(e.reason));break;case u:if(!p){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,success:!0});break}p.desiredSize<=0&&e.desiredSize>0&&p.sinkCapability.resolve();p.desiredSize=e.desiredSize;new Promise((function(e){e(p.onPull&&p.onPull())})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,reason:wrapReason(e)})}));break;case l:(0,r.assert)(g,"enqueue should have stream controller");if(g.isClosed)break;g.controller.enqueue(e.chunk);break;case c:(0,r.assert)(g,"close should have stream controller");if(g.isClosed)break;g.isClosed=!0;g.controller.close();this._deleteStreamController(g,t);break;case h:(0,r.assert)(g,"error should have stream controller");g.controller.error(wrapReason(e.reason));this._deleteStreamController(g,t);break;case o:e.success?g.cancelCall.resolve():g.cancelCall.reject(wrapReason(e.reason));this._deleteStreamController(g,t);break;case s:if(!p)break;new Promise((function(t){t(p.onCancel&&p.onCancel(wrapReason(e.reason)))})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:o,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:o,streamId:t,reason:wrapReason(e)})}));p.sinkCapability.reject(wrapReason(e.reason));p.isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async _deleteStreamController(e,t){await Promise.allSettled([e.startCall&&e.startCall.promise,e.pullCall&&e.pullCall.promise,e.cancelCall&&e.cancelCall.promise]);delete this.streamControllers[t]}destroy(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PDFWorkerStream=void 0;var r=a(2);t.PDFWorkerStream=class PDFWorkerStream{constructor(e){this._msgHandler=e;this._contentLength=null;this._fullRequestReader=null;this._rangeRequestReaders=[]}getFullReader(){(0,r.assert)(!this._fullRequestReader,"PDFWorkerStream.getFullReader can only be called once.");this._fullRequestReader=new PDFWorkerStreamReader(this._msgHandler);return this._fullRequestReader}getRangeReader(e,t){const a=new PDFWorkerStreamRangeReader(e,t,this._msgHandler);this._rangeRequestReaders.push(a);return a}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);for(const t of this._rangeRequestReaders.slice(0))t.cancel(e)}};class PDFWorkerStreamReader{constructor(e){this._msgHandler=e;this.onProgress=null;this._contentLength=null;this._isRangeSupported=!1;this._isStreamingSupported=!1;const t=this._msgHandler.sendWithStream("GetReader");this._reader=t.getReader();this._headersReady=this._msgHandler.sendWithPromise("ReaderHeadersReady").then((e=>{this._isStreamingSupported=e.isStreamingSupported;this._isRangeSupported=e.isRangeSupported;this._contentLength=e.contentLength}))}get headersReady(){return this._headersReady}get contentLength(){return this._contentLength}get isStreamingSupported(){return this._isStreamingSupported}get isRangeSupported(){return this._isRangeSupported}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class PDFWorkerStreamRangeReader{constructor(e,t,a){this._msgHandler=a;this.onProgress=null;const r=this._msgHandler.sendWithStream("GetRangeReader",{begin:e,end:t});this._reader=r.getReader()}get isStreamingSupported(){return!1}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}}],t={};function __w_pdfjs_require__(a){var r=t[a];if(void 0!==r)return r.exports;var n=t[a]={exports:{}};e[a](n,n.exports,__w_pdfjs_require__);return n.exports}__w_pdfjs_require__.d=(e,t)=>{for(var a in t)__w_pdfjs_require__.o(t,a)&&!__w_pdfjs_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})};__w_pdfjs_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);__w_pdfjs_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{var e=a;Object.defineProperty(e,"__esModule",{value:!0});Object.defineProperty(e,"WorkerMessageHandler",{enumerable:!0,get:function(){return t.WorkerMessageHandler}});var t=__w_pdfjs_require__(1)})();return a})())); \ No newline at end of file diff --git a/public/pdf.worker.min.js b/public/pdf.worker.min.js new file mode 100644 index 00000000..34588aa1 --- /dev/null +++ b/public/pdf.worker.min.js @@ -0,0 +1,22 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ +!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pdfjs-dist/build/pdf.worker",[],t):"object"==typeof exports?exports["pdfjs-dist/build/pdf.worker"]=t():e["pdfjs-dist/build/pdf.worker"]=e.pdfjsWorker=t()}(globalThis,(()=>(()=>{"use strict";var e=[,(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.WorkerTask=t.WorkerMessageHandler=void 0;var r=a(2),n=a(5),i=a(6),s=a(8),o=a(71),c=a(65),l=a(4),h=a(102),u=a(103);class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=(0,r.createPromiseCapability)()}get finished(){return this._capability.promise}finish(){this._capability.resolve()}terminate(){this.terminated=!0}ensureNotTerminated(){if(this.terminated)throw new Error("Worker task was terminated")}}t.WorkerTask=WorkerTask;class WorkerMessageHandler{static setup(e,t){let a=!1;e.on("test",(function wphSetupTest(t){if(!a){a=!0;e.send("test",t instanceof Uint8Array)}}));e.on("configure",(function wphConfigure(e){(0,r.setVerbosityLevel)(e.verbosity)}));e.on("GetDocRequest",(function wphSetupDoc(e){return WorkerMessageHandler.createDocumentHandler(e,t)}))}static createDocumentHandler(e,t){let a,d=!1,f=null;const g=[],p=(0,r.getVerbosityLevel)(),m=e.apiVersion,b="2.16.105";if(m!==b)throw new Error(`The API version "${m}" does not match the Worker version "2.16.105".`);const y=[];for(const e in[])y.push(e);if(y.length)throw new Error("The `Array.prototype` contains unexpected enumerable properties: "+y.join(", ")+"; thus breaking e.g. `for...in` iteration of `Array`s.");if("undefined"==typeof ReadableStream){const e="The browser/environment lacks native support for critical functionality used by the PDF.js library (e.g. `ReadableStream`); ";if(l.isNodeJS)throw new Error(e+"please use a `legacy`-build instead.");throw new Error(e+"please update to a supported browser.")}const w=e.docId,S=e.docBaseUrl,x=e.docId+"_worker";let k=new h.MessageHandler(x,w,t);function ensureNotTerminated(){if(d)throw new Error("Worker was terminated")}function startWorkerTask(e){g.push(e)}function finishWorkerTask(e){e.finish();const t=g.indexOf(e);g.splice(t,1)}async function loadDocument(e){await a.ensureDoc("checkHeader");await a.ensureDoc("parseStartXRef");await a.ensureDoc("parse",[e]);await a.ensureDoc("checkFirstPage",[e]);await a.ensureDoc("checkLastPage",[e]);const t=await a.ensureDoc("isPureXfa");if(t){const e=new WorkerTask("loadXfaFonts");startWorkerTask(e);await Promise.all([a.loadXfaFonts(k,e).catch((e=>{})).then((()=>finishWorkerTask(e))),a.loadXfaImages()])}const[r,n]=await Promise.all([a.ensureDoc("numPages"),a.ensureDoc("fingerprints")]);return{numPages:r,fingerprints:n,htmlForXfa:t?await a.ensureDoc("htmlForXfa"):null}}function getPdfManager(e,t,a){const n=(0,r.createPromiseCapability)();let i;const o=e.source;if(o.data){try{i=new s.LocalPdfManager(w,o.data,o.password,k,t,a,S);n.resolve(i)}catch(e){n.reject(e)}return n.promise}let c,l=[];try{c=new u.PDFWorkerStream(k)}catch(e){n.reject(e);return n.promise}const h=c.getFullReader();h.headersReady.then((function(){if(!h.isRangeSupported)return;const e=o.disableAutoFetch||h.isStreamingSupported;i=new s.NetworkPdfManager(w,c,{msgHandler:k,password:o.password,length:h.contentLength,disableAutoFetch:e,rangeChunkSize:o.rangeChunkSize},t,a,S);for(const e of l)i.sendProgressiveData(e);l=[];n.resolve(i);f=null})).catch((function(e){n.reject(e);f=null}));let d=0;new Promise((function(e,c){const readChunk=function({value:e,done:u}){try{ensureNotTerminated();if(u){i||function(){const e=(0,r.arraysToBytes)(l);o.length&&e.length!==o.length&&(0,r.warn)("reported HTTP length is different from actual");try{i=new s.LocalPdfManager(w,e,o.password,k,t,a,S);n.resolve(i)}catch(e){n.reject(e)}l=[]}();f=null;return}d+=(0,r.arrayByteLength)(e);h.isStreamingSupported||k.send("DocProgress",{loaded:d,total:Math.max(d,h.contentLength||0)});i?i.sendProgressiveData(e):l.push(e);h.read().then(readChunk,c)}catch(e){c(e)}};h.read().then(readChunk,c)})).catch((function(e){n.reject(e);f=null}));f=function(e){c.cancelAllRequests(e)};return n.promise}k.on("GetPage",(function wphSetupGetPage(e){return a.getPage(e.pageIndex).then((function(e){return Promise.all([a.ensure(e,"rotate"),a.ensure(e,"ref"),a.ensure(e,"userUnit"),a.ensure(e,"view")]).then((function([e,t,a,r]){return{rotate:e,ref:t,userUnit:a,view:r}}))}))}));k.on("GetPageIndex",(function wphSetupGetPageIndex(e){const t=n.Ref.get(e.num,e.gen);return a.ensureCatalog("getPageIndex",[t])}));k.on("GetDestinations",(function wphSetupGetDestinations(e){return a.ensureCatalog("destinations")}));k.on("GetDestination",(function wphSetupGetDestination(e){return a.ensureCatalog("getDestination",[e.id])}));k.on("GetPageLabels",(function wphSetupGetPageLabels(e){return a.ensureCatalog("pageLabels")}));k.on("GetPageLayout",(function wphSetupGetPageLayout(e){return a.ensureCatalog("pageLayout")}));k.on("GetPageMode",(function wphSetupGetPageMode(e){return a.ensureCatalog("pageMode")}));k.on("GetViewerPreferences",(function(e){return a.ensureCatalog("viewerPreferences")}));k.on("GetOpenAction",(function(e){return a.ensureCatalog("openAction")}));k.on("GetAttachments",(function wphSetupGetAttachments(e){return a.ensureCatalog("attachments")}));k.on("GetJavaScript",(function wphSetupGetJavaScript(e){return a.ensureCatalog("javaScript")}));k.on("GetDocJSActions",(function wphSetupGetDocJSActions(e){return a.ensureCatalog("jsActions")}));k.on("GetPageJSActions",(function({pageIndex:e}){return a.getPage(e).then((function(e){return a.ensure(e,"jsActions")}))}));k.on("GetOutline",(function wphSetupGetOutline(e){return a.ensureCatalog("documentOutline")}));k.on("GetOptionalContentConfig",(function(e){return a.ensureCatalog("optionalContentConfig")}));k.on("GetPermissions",(function(e){return a.ensureCatalog("permissions")}));k.on("GetMetadata",(function wphSetupGetMetadata(e){return Promise.all([a.ensureDoc("documentInfo"),a.ensureCatalog("metadata")])}));k.on("GetMarkInfo",(function wphSetupGetMarkInfo(e){return a.ensureCatalog("markInfo")}));k.on("GetData",(function wphSetupGetData(e){a.requestLoadedStream();return a.onLoadedStream().then((function(e){return e.bytes}))}));k.on("GetAnnotations",(function({pageIndex:e,intent:t}){return a.getPage(e).then((function(a){const r=new WorkerTask(`GetAnnotations: page ${e}`);startWorkerTask(r);return a.getAnnotationsData(k,r,t).then((e=>{finishWorkerTask(r);return e}),(e=>{finishWorkerTask(r)}))}))}));k.on("GetFieldObjects",(function(e){return a.ensureDoc("fieldObjects")}));k.on("HasJSActions",(function(e){return a.ensureDoc("hasJSActions")}));k.on("GetCalculationOrderIds",(function(e){return a.ensureDoc("calculationOrderIds")}));k.on("SaveDocument",(function({isPureXfa:e,numPages:t,annotationStorage:s,filename:o}){a.requestLoadedStream();const l=e?null:(0,i.getNewAnnotationsMap)(s),h=[a.onLoadedStream(),a.ensureCatalog("acroForm"),a.ensureCatalog("acroFormRef"),a.ensureDoc("xref"),a.ensureDoc("startXRef")];if(l)for(const[e,t]of l)h.push(a.getPage(e).then((a=>{const r=new WorkerTask(`Save (editor): page ${e}`);return a.saveNewAnnotations(k,r,t).finally((function(){finishWorkerTask(r)}))})));if(e)h.push(a.serializeXfaData(s));else for(let e=0;e{"string"==typeof a&&(e[t]=(0,r.stringToPDFString)(a))}));m={rootRef:s.trailer.getRaw("Root")||null,encryptRef:s.trailer.getRaw("Encrypt")||null,newRef:s.getNewRef(),infoRef:s.trailer.getRaw("Info")||null,info:e,fileIds:s.trailer.get("ID")||null,startXRef:l,filename:o}}s.resetNewRef();return(0,c.incrementalUpdate)({originalData:t.bytes,xrefInfo:m,newRefs:u,xref:s,hasXfa:!!f,xfaDatasetsRef:g,hasXfaDatasetsEntry:p,acroFormRef:i,acroForm:a,xfaData:d})}))}));k.on("GetOperatorList",(function wphSetupRenderPage(e,t){const n=e.pageIndex;a.getPage(n).then((function(a){const i=new WorkerTask(`GetOperatorList: page ${n}`);startWorkerTask(i);const s=p>=r.VerbosityLevel.INFOS?Date.now():0;a.getOperatorList({handler:k,sink:t,task:i,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage}).then((function(e){finishWorkerTask(i);s&&(0,r.info)(`page=${n+1} - getOperatorList: time=${Date.now()-s}ms, len=${e.length}`);t.close()}),(function(e){finishWorkerTask(i);if(!i.terminated){k.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorOperatorList});t.error(e)}}))}))}));k.on("GetTextContent",(function wphExtractText(e,t){const n=e.pageIndex;a.getPage(n).then((function(a){const i=new WorkerTask("GetTextContent: page "+n);startWorkerTask(i);const s=p>=r.VerbosityLevel.INFOS?Date.now():0;a.extractTextContent({handler:k,task:i,sink:t,includeMarkedContent:e.includeMarkedContent,combineTextItems:e.combineTextItems}).then((function(){finishWorkerTask(i);s&&(0,r.info)(`page=${n+1} - getTextContent: time=`+(Date.now()-s)+"ms");t.close()}),(function(e){finishWorkerTask(i);i.terminated||t.error(e)}))}))}));k.on("GetStructTree",(function wphGetStructTree(e){return a.getPage(e.pageIndex).then((function(e){return a.ensure(e,"getStructTree")}))}));k.on("FontFallback",(function(e){return a.fontFallback(e.id,k)}));k.on("Cleanup",(function wphCleanup(e){return a.cleanup(!0)}));k.on("Terminate",(function wphTerminate(e){d=!0;const t=[];if(a){a.terminate(new r.AbortException("Worker was terminated."));const e=a.cleanup();t.push(e);a=null}else(0,o.clearGlobalCaches)();f&&f(new r.AbortException("Worker was terminated."));for(const e of g){t.push(e.finished);e.terminate()}return Promise.all(t).then((function(){k.destroy();k=null}))}));k.on("Ready",(function wphReady(t){!function setupDoc(e){function onSuccess(e){ensureNotTerminated();k.send("GetDoc",{pdfInfo:e})}function onFailure(e){ensureNotTerminated();if(e instanceof r.PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);k.sendWithPromise("PasswordRequest",e).then((function({password:e}){finishWorkerTask(t);a.updatePassword(e);pdfManagerReady()})).catch((function(){finishWorkerTask(t);k.send("DocException",e)}))}else e instanceof r.InvalidPDFException||e instanceof r.MissingPDFException||e instanceof r.UnexpectedResponseException||e instanceof r.UnknownErrorException?k.send("DocException",e):k.send("DocException",new r.UnknownErrorException(e.message,e.toString()))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,(function(e){ensureNotTerminated();if(e instanceof i.XRefParseException){a.requestLoadedStream();a.onLoadedStream().then((function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)}))}else onFailure(e)}))}ensureNotTerminated();getPdfManager(e,{maxImageSize:e.maxImageSize,disableFontFace:e.disableFontFace,ignoreErrors:e.ignoreErrors,isEvalSupported:e.isEvalSupported,fontExtraProperties:e.fontExtraProperties,useSystemFonts:e.useSystemFonts,cMapUrl:e.cMapUrl,standardFontDataUrl:e.standardFontDataUrl},e.enableXfa).then((function(e){if(d){e.terminate(new r.AbortException("Worker was terminated."));throw new Error("Worker was terminated")}a=e;a.onLoadedStream().then((function(e){k.send("DataLoaded",{length:e.bytes.byteLength})}))})).then(pdfManagerReady,onFailure)}(e);e=null}));return x}static initializeFromPort(e){const t=new h.MessageHandler("worker","main",e);WorkerMessageHandler.setup(t,e);t.send("ready",null)}}t.WorkerMessageHandler=WorkerMessageHandler;"undefined"==typeof window&&!l.isNodeJS&&"undefined"!=typeof self&&function isMessagePort(e){return"function"==typeof e.postMessage&&"onmessage"in e}(self)&&WorkerMessageHandler.initializeFromPort(self)},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.VerbosityLevel=t.Util=t.UnknownErrorException=t.UnexpectedResponseException=t.UNSUPPORTED_FEATURES=t.TextRenderingMode=t.StreamType=t.RenderingIntentFlag=t.PermissionFlag=t.PasswordResponses=t.PasswordException=t.PageActionEventType=t.OPS=t.MissingPDFException=t.LINE_FACTOR=t.LINE_DESCENT_FACTOR=t.InvalidPDFException=t.ImageKind=t.IDENTITY_MATRIX=t.FormatError=t.FontType=t.FeatureTest=t.FONT_IDENTITY_MATRIX=t.DocumentActionEventType=t.CMapCompressionType=t.BaseException=t.AnnotationType=t.AnnotationStateModelType=t.AnnotationReviewState=t.AnnotationReplyType=t.AnnotationMode=t.AnnotationMarkedState=t.AnnotationFlag=t.AnnotationFieldFlag=t.AnnotationEditorType=t.AnnotationEditorPrefix=t.AnnotationEditorParamsType=t.AnnotationBorderStyleType=t.AnnotationActionEventType=t.AbortException=void 0;t.arrayByteLength=arrayByteLength;t.arraysToBytes=function arraysToBytes(e){const t=e.length;if(1===t&&e[0]instanceof Uint8Array)return e[0];let a=0;for(let r=0;rt});e.promise=new Promise((function(a,r){e.resolve=function(e){t=!0;a(e)};e.reject=function(e){t=!0;r(e)}}));return e};t.createValidAbsoluteUrl=function createValidAbsoluteUrl(e,t=null,a=null){if(!e)return null;try{if(a&&"string"==typeof e){if(a.addDefaultProtocol&&e.startsWith("www.")){const t=e.match(/\./g);t&&t.length>=2&&(e=`http://${e}`)}if(a.tryConvertEncoding)try{e=stringToUTF8String(e)}catch(e){}}const r=t?new URL(e,t):new URL(e);if(function _isValidProtocol(e){if(!e)return!1;switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(r))return r}catch(e){}return null};t.escapeString=function escapeString(e){return e.replace(/([()\\\n\r])/g,(e=>"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`))};t.getModificationDate=function getModificationDate(e=new Date){return[e.getUTCFullYear().toString(),(e.getUTCMonth()+1).toString().padStart(2,"0"),e.getUTCDate().toString().padStart(2,"0"),e.getUTCHours().toString().padStart(2,"0"),e.getUTCMinutes().toString().padStart(2,"0"),e.getUTCSeconds().toString().padStart(2,"0")].join("")};t.getVerbosityLevel=function getVerbosityLevel(){return n};t.info=function info(e){n>=r.INFOS&&console.log(`Info: ${e}`)};t.isArrayBuffer=function isArrayBuffer(e){return"object"==typeof e&&null!==e&&void 0!==e.byteLength};t.isArrayEqual=function isArrayEqual(e,t){if(e.length!==t.length)return!1;for(let a=0,r=e.length;a>24&255,e>>16&255,e>>8&255,255&e)};t.stringToBytes=stringToBytes;t.stringToPDFString=function stringToPDFString(e){if(e[0]>="ï"){let t;"þ"===e[0]&&"ÿ"===e[1]?t="utf-16be":"ÿ"===e[0]&&"þ"===e[1]?t="utf-16le":"ï"===e[0]&&"»"===e[1]&&"¿"===e[2]&&(t="utf-8");if(t)try{const a=new TextDecoder(t,{fatal:!0}),r=stringToBytes(e);return a.decode(r)}catch(e){warn(`stringToPDFString: "${e}".`)}}const t=[];for(let a=0,r=e.length;a>8&255),String.fromCharCode(255&r))}return t.join("")};t.stringToUTF8String=stringToUTF8String;t.unreachable=unreachable;t.utf8StringToString=function utf8StringToString(e){return unescape(encodeURIComponent(e))};t.warn=warn;a(3);t.IDENTITY_MATRIX=[1,0,0,1,0,0];t.FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];t.LINE_FACTOR=1.35;t.LINE_DESCENT_FACTOR=.35;t.RenderingIntentFlag={ANY:1,DISPLAY:2,PRINT:4,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,OPLIST:256};t.AnnotationMode={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3};t.AnnotationEditorPrefix="pdfjs_internal_editor_";t.AnnotationEditorType={DISABLE:-1,NONE:0,FREETEXT:3,INK:15};t.AnnotationEditorParamsType={FREETEXT_SIZE:1,FREETEXT_COLOR:2,FREETEXT_OPACITY:3,INK_COLOR:11,INK_THICKNESS:12,INK_OPACITY:13};t.PermissionFlag={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048};t.TextRenderingMode={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};t.ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};t.AnnotationType={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26};t.AnnotationStateModelType={MARKED:"Marked",REVIEW:"Review"};t.AnnotationMarkedState={MARKED:"Marked",UNMARKED:"Unmarked"};t.AnnotationReviewState={ACCEPTED:"Accepted",REJECTED:"Rejected",CANCELLED:"Cancelled",COMPLETED:"Completed",NONE:"None"};t.AnnotationReplyType={GROUP:"Group",REPLY:"R"};t.AnnotationFlag={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};t.AnnotationFieldFlag={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};t.AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};t.AnnotationActionEventType={E:"Mouse Enter",X:"Mouse Exit",D:"Mouse Down",U:"Mouse Up",Fo:"Focus",Bl:"Blur",PO:"PageOpen",PC:"PageClose",PV:"PageVisible",PI:"PageInvisible",K:"Keystroke",F:"Format",V:"Validate",C:"Calculate"};t.DocumentActionEventType={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"};t.PageActionEventType={O:"PageOpen",C:"PageClose"};t.StreamType={UNKNOWN:"UNKNOWN",FLATE:"FLATE",LZW:"LZW",DCT:"DCT",JPX:"JPX",JBIG:"JBIG",A85:"A85",AHX:"AHX",CCF:"CCF",RLX:"RLX"};t.FontType={UNKNOWN:"UNKNOWN",TYPE1:"TYPE1",TYPE1STANDARD:"TYPE1STANDARD",TYPE1C:"TYPE1C",CIDFONTTYPE0:"CIDFONTTYPE0",CIDFONTTYPE0C:"CIDFONTTYPE0C",TRUETYPE:"TRUETYPE",CIDFONTTYPE2:"CIDFONTTYPE2",TYPE3:"TYPE3",OPENTYPE:"OPENTYPE",TYPE0:"TYPE0",MMTYPE1:"MMTYPE1"};const r={ERRORS:0,WARNINGS:1,INFOS:5};t.VerbosityLevel=r;t.CMapCompressionType={NONE:0,BINARY:1,STREAM:2};t.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};t.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",signatures:"signatures",smask:"smask",shadingPattern:"shadingPattern",font:"font",errorTilingPattern:"errorTilingPattern",errorExtGState:"errorExtGState",errorXObject:"errorXObject",errorFontLoadType3:"errorFontLoadType3",errorFontState:"errorFontState",errorFontMissing:"errorFontMissing",errorFontTranslate:"errorFontTranslate",errorColorSpace:"errorColorSpace",errorOperatorList:"errorOperatorList",errorFontToUnicode:"errorFontToUnicode",errorFontLoadNative:"errorFontLoadNative",errorFontBuildPath:"errorFontBuildPath",errorFontGetPath:"errorFontGetPath",errorMarkedContent:"errorMarkedContent",errorContentSubStream:"errorContentSubStream"};t.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let n=r.WARNINGS;function warn(e){n>=r.WARNINGS&&console.log(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function shadow(e,t,a){Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!1});return a}const i=function BaseExceptionClosure(){function BaseException(e,t){this.constructor===BaseException&&unreachable("Cannot initialize BaseException.");this.message=e;this.name=t}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();t.BaseException=i;t.PasswordException=class PasswordException extends i{constructor(e,t){super(e,"PasswordException");this.code=t}};t.UnknownErrorException=class UnknownErrorException extends i{constructor(e,t){super(e,"UnknownErrorException");this.details=t}};t.InvalidPDFException=class InvalidPDFException extends i{constructor(e){super(e,"InvalidPDFException")}};t.MissingPDFException=class MissingPDFException extends i{constructor(e){super(e,"MissingPDFException")}};t.UnexpectedResponseException=class UnexpectedResponseException extends i{constructor(e,t){super(e,"UnexpectedResponseException");this.status=t}};t.FormatError=class FormatError extends i{constructor(e){super(e,"FormatError")}};t.AbortException=class AbortException extends i{constructor(e){super(e,"AbortException")}};function stringToBytes(e){"string"!=typeof e&&unreachable("Invalid argument for stringToBytes");const t=e.length,a=new Uint8Array(t);for(let r=0;re.toString(16).padStart(2,"0")));class Util{static makeHexColor(e,t,a){return`#${s[e]}${s[t]}${s[a]}`}static scaleMinMax(e,t){let a;if(e[0]){if(e[0]<0){a=t[0];t[0]=t[1];t[1]=a}t[0]*=e[0];t[1]*=e[0];if(e[3]<0){a=t[2];t[2]=t[3];t[3]=a}t[2]*=e[3];t[3]*=e[3]}else{a=t[0];t[0]=t[2];t[2]=a;a=t[1];t[1]=t[3];t[3]=a;if(e[1]<0){a=t[2];t[2]=t[3];t[3]=a}t[2]*=e[1];t[3]*=e[1];if(e[2]<0){a=t[0];t[0]=t[1];t[1]=a}t[0]*=e[2];t[1]*=e[2]}t[0]+=e[4];t[1]+=e[4];t[2]+=e[5];t[3]+=e[5]}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static applyTransform(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]}static applyInverseTransform(e,t){const a=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/a,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/a]}static getAxialAlignedBoundingBox(e,t){const a=Util.applyTransform(e,t),r=Util.applyTransform(e.slice(2,4),t),n=Util.applyTransform([e[0],e[3]],t),i=Util.applyTransform([e[2],e[1]],t);return[Math.min(a[0],r[0],n[0],i[0]),Math.min(a[1],r[1],n[1],i[1]),Math.max(a[0],r[0],n[0],i[0]),Math.max(a[1],r[1],n[1],i[1])]}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static apply3dTransform(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2],e[3]*t[0]+e[4]*t[1]+e[5]*t[2],e[6]*t[0]+e[7]*t[1]+e[8]*t[2]]}static singularValueDecompose2dScale(e){const t=[e[0],e[2],e[1],e[3]],a=e[0]*t[0]+e[1]*t[2],r=e[0]*t[1]+e[1]*t[3],n=e[2]*t[0]+e[3]*t[2],i=e[2]*t[1]+e[3]*t[3],s=(a+i)/2,o=Math.sqrt((a+i)**2-4*(a*i-n*r))/2,c=s+o||1,l=s-o||1;return[Math.sqrt(c),Math.sqrt(l)]}static normalizeRect(e){const t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t}static intersect(e,t){const a=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),r=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(a>r)return null;const n=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),i=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return n>i?null:[a,n,r,i]}static bezierBoundingBox(e,t,a,r,n,i,s,o){const c=[],l=[[],[]];let h,u,d,f,g,p,m,b;for(let l=0;l<2;++l){if(0===l){u=6*e-12*a+6*n;h=-3*e+9*a-9*n+3*s;d=3*a-3*e}else{u=6*t-12*r+6*i;h=-3*t+9*r-9*i+3*o;d=3*r-3*t}if(Math.abs(h)<1e-12){if(Math.abs(u)<1e-12)continue;f=-d/u;0{a(4)},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.isNodeJS=void 0;const a=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type);t.isNodeJS=a},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.RefSetCache=t.RefSet=t.Ref=t.Name=t.EOF=t.Dict=t.Cmd=t.CIRCULAR_REF=void 0;t.clearPrimitiveCaches=function clearPrimitiveCaches(){o._clearCache();s._clearCache();l._clearCache()};t.isCmd=function isCmd(e,t){return e instanceof o&&(void 0===t||e.cmd===t)};t.isDict=function isDict(e,t){return e instanceof Dict&&(void 0===t||isName(e.get("Type"),t))};t.isName=isName;t.isRefsEqual=function isRefsEqual(e,t){return e.num===t.num&&e.gen===t.gen};var r=a(2);const n=Symbol("CIRCULAR_REF");t.CIRCULAR_REF=n;const i=Symbol("EOF");t.EOF=i;const s=function NameClosure(){let e=Object.create(null);class Name{constructor(e){this.name=e}static get(t){return e[t]||(e[t]=new Name(t))}static _clearCache(){e=Object.create(null)}}return Name}();t.Name=s;const o=function CmdClosure(){let e=Object.create(null);class Cmd{constructor(e){this.cmd=e}static get(t){return e[t]||(e[t]=new Cmd(t))}static _clearCache(){e=Object.create(null)}}return Cmd}();t.Cmd=o;const c=function nonSerializableClosure(){return c};class Dict{constructor(e=null){this._map=Object.create(null);this.xref=e;this.objId=null;this.suppressEncryption=!1;this.__nonSerializable__=c}assignXref(e){this.xref=e}get size(){return Object.keys(this._map).length}get(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}return r instanceof l&&this.xref?this.xref.fetch(r,this.suppressEncryption):r}async getAsync(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}return r instanceof l&&this.xref?this.xref.fetchAsync(r,this.suppressEncryption):r}getArray(e,t,a){let r=this._map[e];if(void 0===r&&void 0!==t){r=this._map[t];void 0===r&&void 0!==a&&(r=this._map[a])}r instanceof l&&this.xref&&(r=this.xref.fetch(r,this.suppressEncryption));if(Array.isArray(r)){r=r.slice();for(let e=0,t=r.length;e{(0,r.unreachable)("Should not call `set` on the empty dictionary.")};return(0,r.shadow)(this,"empty",e)}static merge({xref:e,dictArray:t,mergeSubDicts:a=!1}){const r=new Dict(e),n=new Map;for(const e of t)if(e instanceof Dict)for(const[t,r]of Object.entries(e._map)){let e=n.get(t);if(void 0===e){e=[];n.set(t,e)}else if(!(a&&r instanceof Dict))continue;e.push(r)}for(const[t,a]of n){if(1===a.length||!(a[0]instanceof Dict)){r._map[t]=a[0];continue}const n=new Dict(e);for(const e of a)for(const[t,a]of Object.entries(e._map))void 0===n._map[t]&&(n._map[t]=a);n.size>0&&(r._map[t]=n)}n.clear();return r.size>0?r:Dict.empty}}t.Dict=Dict;const l=function RefClosure(){let e=Object.create(null);class Ref{constructor(e,t){this.num=e;this.gen=t}toString(){return 0===this.gen?`${this.num}R`:`${this.num}R${this.gen}`}static get(t,a){const r=0===a?`${t}R`:`${t}R${a}`;return e[r]||(e[r]=new Ref(t,a))}static _clearCache(){e=Object.create(null)}}return Ref}();t.Ref=l;class RefSet{constructor(e=null){this._set=new Set(e&&e._set)}has(e){return this._set.has(e.toString())}put(e){this._set.add(e.toString())}remove(e){this._set.delete(e.toString())}[Symbol.iterator](){return this._set.values()}clear(){this._set.clear()}}t.RefSet=RefSet;class RefSetCache{constructor(){this._map=new Map}get size(){return this._map.size}get(e){return this._map.get(e.toString())}has(e){return this._map.has(e.toString())}put(e,t){this._map.set(e.toString(),t)}putAlias(e,t){this._map.set(e.toString(),this.get(t))}[Symbol.iterator](){return this._map.values()}clear(){this._map.clear()}}t.RefSetCache=RefSetCache;function isName(e,t){return e instanceof s&&(void 0===t||e.name===t)}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XRefParseException=t.XRefEntryException=t.ParserEOFException=t.MissingDataException=t.DocStats=void 0;t.collectActions=function collectActions(e,t,a){const i=Object.create(null),s=getInheritableProperty({dict:t,key:"AA",stopWhenFound:!1});if(s)for(let t=s.length-1;t>=0;t--){const r=s[t];if(r instanceof n.Dict)for(const t of r.getKeys()){const s=a[t];if(!s)continue;const o=r.getRaw(t),c=new n.RefSet,l=[];_collectJS(o,e,l,c);l.length>0&&(i[s]=l)}}if(t.has("A")){const a=t.get("A"),r=new n.RefSet,s=[];_collectJS(a,e,s,r);s.length>0&&(i.Action=s)}return(0,r.objectSize)(i)>0?i:null};t.encodeToXmlString=function encodeToXmlString(e){const t=[];let a=0;for(let r=0,n=e.length;r55295&&(n<57344||n>65533)&&r++;a=r+1}}if(0===t.length)return e;a126||35===n||40===n||41===n||60===n||62===n||91===n||93===n||123===n||125===n||47===n||37===n){a0?t:null};t.isWhiteSpace=function isWhiteSpace(e){return 32===e||9===e||13===e||10===e};t.log2=function log2(e){if(e<=0)return 0;return Math.ceil(Math.log2(e))};t.numberToString=function numberToString(e){if(Number.isInteger(e))return e.toString();const t=Math.round(100*e);if(t%100==0)return(t/100).toString();if(t%10==0)return e.toFixed(1);return e.toFixed(2)};t.parseXFAPath=function parseXFAPath(e){const t=/(.+)\[(\d+)\]$/;return e.split(".").map((e=>{const a=e.match(t);return a?{name:a[1],pos:parseInt(a[2],10)}:{name:e,pos:0}}))};t.readInt8=function readInt8(e,t){return e[t]<<24>>24};t.readUint16=function readUint16(e,t){return e[t]<<8|e[t+1]};t.readUint32=function readUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0};t.recoverJsURL=function recoverJsURL(e){const t=new RegExp("^\\s*("+["app.launchURL","window.open","xfa.host.gotoURL"].join("|").split(".").join("\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec(e);if(t&&t[2]){const e=t[2];let a=!1;"true"===t[3]&&"app.launchURL"===t[1]&&(a=!0);return{url:e,newWindow:a}}return null};t.toRomanNumerals=function toRomanNumerals(e,t=!1){(0,r.assert)(Number.isInteger(e)&&e>0,"The number should be a positive integer.");const a=[];let n;for(;e>=1e3;){e-=1e3;a.push("M")}n=e/100|0;e%=100;a.push(s[n]);n=e/10|0;e%=10;a.push(s[10+n]);a.push(s[20+e]);const i=a.join("");return t?i.toLowerCase():i};t.validateCSSFont=function validateCSSFont(e){const t=new Set(["100","200","300","400","500","600","700","800","900","1000","normal","bold","bolder","lighter"]),{fontFamily:a,fontWeight:n,italicAngle:i}=e;if(/^".*"$/.test(a)){if(/[^\\]"/.test(a.slice(1,a.length-1))){(0,r.warn)(`XFA - FontFamily contains some unescaped ": ${a}.`);return!1}}else if(/^'.*'$/.test(a)){if(/[^\\]'/.test(a.slice(1,a.length-1))){(0,r.warn)(`XFA - FontFamily contains some unescaped ': ${a}.`);return!1}}else for(const e of a.split(/[ \t]+/))if(/^(\d|(-(\d|-)))/.test(e)||!/^[\w-\\]+$/.test(e)){(0,r.warn)(`XFA - FontFamily contains some invalid : ${a}.`);return!1}const s=n?n.toString():"";e.fontWeight=t.has(s)?s:"400";const o=parseFloat(i);e.italicAngle=isNaN(o)||o<-90||o>90?"14":i.toString();return!0};var r=a(2),n=a(5),i=a(7);class MissingDataException extends r.BaseException{constructor(e,t){super(`Missing data [${e}, ${t})`,"MissingDataException");this.begin=e;this.end=t}}t.MissingDataException=MissingDataException;class ParserEOFException extends r.BaseException{constructor(e){super(e,"ParserEOFException")}}t.ParserEOFException=ParserEOFException;class XRefEntryException extends r.BaseException{constructor(e){super(e,"XRefEntryException")}}t.XRefEntryException=XRefEntryException;class XRefParseException extends r.BaseException{constructor(e){super(e,"XRefParseException")}}t.XRefParseException=XRefParseException;t.DocStats=class DocStats{constructor(e){this._handler=e;this._streamTypes=new Set;this._fontTypes=new Set}_send(){const e=Object.create(null),t=Object.create(null);for(const t of this._streamTypes)e[t]=!0;for(const e of this._fontTypes)t[e]=!0;this._handler.send("DocStats",{streamTypes:e,fontTypes:t})}addStreamType(e){if(!this._streamTypes.has(e)){this._streamTypes.add(e);this._send()}}addFontType(e){if(!this._fontTypes.has(e)){this._fontTypes.add(e);this._send()}}};function getInheritableProperty({dict:e,key:t,getArray:a=!1,stopWhenFound:r=!0}){let i;const s=new n.RefSet;for(;e instanceof n.Dict&&(!e.objId||!s.has(e.objId));){e.objId&&s.put(e.objId);const n=a?e.getArray(t):e.get(t);if(void 0!==n){if(r)return n;i||(i=[]);i.push(n)}e=e.get("Parent")}return i}const s=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];function _collectJS(e,t,a,s){if(!e)return;let o=null;if(e instanceof n.Ref){if(s.has(e))return;o=e;s.put(o);e=t.fetch(e)}if(Array.isArray(e))for(const r of e)_collectJS(r,t,a,s);else if(e instanceof n.Dict){if((0,n.isName)(e.get("S"),"JavaScript")){const t=e.get("JS");let n;t instanceof i.BaseStream?n=t.getString():"string"==typeof t&&(n=t);n=n&&(0,r.stringToPDFString)(n).replace(/\u0000/g,"");n&&a.push(n)}_collectJS(e.getRaw("Next"),t,a,s)}o&&s.remove(o)}const o={60:"<",62:">",38:"&",34:""",39:"'"}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.BaseStream=void 0;var r=a(2);class BaseStream{constructor(){this.constructor===BaseStream&&(0,r.unreachable)("Cannot initialize BaseStream.")}get length(){(0,r.unreachable)("Abstract getter `length` accessed")}get isEmpty(){(0,r.unreachable)("Abstract getter `isEmpty` accessed")}get isDataLoaded(){return(0,r.shadow)(this,"isDataLoaded",!0)}getByte(){(0,r.unreachable)("Abstract method `getByte` called")}getBytes(e){(0,r.unreachable)("Abstract method `getBytes` called")}peekByte(){const e=this.getByte();-1!==e&&this.pos--;return e}peekBytes(e){const t=this.getBytes(e);this.pos-=t.length;return t}getUint16(){const e=this.getByte(),t=this.getByte();return-1===e||-1===t?-1:(e<<8)+t}getInt32(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()}getByteRange(e,t){(0,r.unreachable)("Abstract method `getByteRange` called")}getString(e){return(0,r.bytesToString)(this.getBytes(e))}skip(e){this.pos+=e||1}reset(){(0,r.unreachable)("Abstract method `reset` called")}moveStart(){(0,r.unreachable)("Abstract method `moveStart` called")}makeSubStream(e,t,a=null){(0,r.unreachable)("Abstract method `makeSubStream` called")}getBaseStreams(){return null}}t.BaseStream=BaseStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NetworkPdfManager=t.LocalPdfManager=void 0;var r=a(2),n=a(9),i=a(6),s=a(11),o=a(10);function parseDocBaseUrl(e){if(e){const t=(0,r.createValidAbsoluteUrl)(e);if(t)return t.href;(0,r.warn)(`Invalid absolute docBaseUrl: "${e}".`)}return null}class BasePdfManager{constructor(){this.constructor===BasePdfManager&&(0,r.unreachable)("Cannot initialize BasePdfManager.")}get docId(){return this._docId}get password(){return this._password}get docBaseUrl(){const e=this.pdfDocument.catalog;return(0,r.shadow)(this,"docBaseUrl",e.baseUrl||this._docBaseUrl)}onLoadedStream(){(0,r.unreachable)("Abstract method `onLoadedStream` called")}ensureDoc(e,t){return this.ensure(this.pdfDocument,e,t)}ensureXRef(e,t){return this.ensure(this.pdfDocument.xref,e,t)}ensureCatalog(e,t){return this.ensure(this.pdfDocument.catalog,e,t)}getPage(e){return this.pdfDocument.getPage(e)}fontFallback(e,t){return this.pdfDocument.fontFallback(e,t)}loadXfaFonts(e,t){return this.pdfDocument.loadXfaFonts(e,t)}loadXfaImages(){return this.pdfDocument.loadXfaImages()}serializeXfaData(e){return this.pdfDocument.serializeXfaData(e)}cleanup(e=!1){return this.pdfDocument.cleanup(e)}async ensure(e,t,a){(0,r.unreachable)("Abstract method `ensure` called")}requestRange(e,t){(0,r.unreachable)("Abstract method `requestRange` called")}requestLoadedStream(){(0,r.unreachable)("Abstract method `requestLoadedStream` called")}sendProgressiveData(e){(0,r.unreachable)("Abstract method `sendProgressiveData` called")}updatePassword(e){this._password=e}terminate(e){(0,r.unreachable)("Abstract method `terminate` called")}}t.LocalPdfManager=class LocalPdfManager extends BasePdfManager{constructor(e,t,a,r,n,i,c){super();this._docId=e;this._password=a;this._docBaseUrl=parseDocBaseUrl(c);this.msgHandler=r;this.evaluatorOptions=n;this.enableXfa=i;const l=new o.Stream(t);this.pdfDocument=new s.PDFDocument(this,l);this._loadedStreamPromise=Promise.resolve(l)}async ensure(e,t,a){const r=e[t];return"function"==typeof r?r.apply(e,a):r}requestRange(e,t){return Promise.resolve()}requestLoadedStream(){}onLoadedStream(){return this._loadedStreamPromise}terminate(e){}};t.NetworkPdfManager=class NetworkPdfManager extends BasePdfManager{constructor(e,t,a,r,i,o){super();this._docId=e;this._password=a.password;this._docBaseUrl=parseDocBaseUrl(o);this.msgHandler=a.msgHandler;this.evaluatorOptions=r;this.enableXfa=i;this.streamManager=new n.ChunkedStreamManager(t,{msgHandler:a.msgHandler,length:a.length,disableAutoFetch:a.disableAutoFetch,rangeChunkSize:a.rangeChunkSize});this.pdfDocument=new s.PDFDocument(this,this.streamManager.getStream())}async ensure(e,t,a){try{const r=e[t];return"function"==typeof r?r.apply(e,a):r}catch(r){if(!(r instanceof i.MissingDataException))throw r;await this.requestRange(r.begin,r.end);return this.ensure(e,t,a)}}requestRange(e,t){return this.streamManager.requestRange(e,t)}requestLoadedStream(){this.streamManager.requestAllChunks()}sendProgressiveData(e){this.streamManager.onReceiveData({chunk:e})}onLoadedStream(){return this.streamManager.onLoadedStream()}terminate(e){this.streamManager.abort(e)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ChunkedStreamManager=t.ChunkedStream=void 0;var r=a(2),n=a(6),i=a(10);class ChunkedStream extends i.Stream{constructor(e,t,a){super(new Uint8Array(e),0,e,null);this.chunkSize=t;this._loadedChunks=new Set;this.numChunks=Math.ceil(e/t);this.manager=a;this.progressiveDataLength=0;this.lastSuccessfulEnsureByteChunk=-1}getMissingChunks(){const e=[];for(let t=0,a=this.numChunks;t=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(let e=a;ethis.numChunks)&&t!==this.lastSuccessfulEnsureByteChunk){if(!this._loadedChunks.has(t))throw new n.MissingDataException(e,e+1);this.lastSuccessfulEnsureByteChunk=t}}ensureRange(e,t){if(e>=t)return;if(t<=this.progressiveDataLength)return;const a=Math.floor(e/this.chunkSize);if(a>this.numChunks)return;const r=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let i=a;i=this.end)return-1;e>=this.progressiveDataLength&&this.ensureByte(e);return this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,r=this.end;if(!e){r>this.progressiveDataLength&&this.ensureRange(a,r);return t.subarray(a,r)}let n=a+e;n>r&&(n=r);n>this.progressiveDataLength&&this.ensureRange(a,n);this.pos=n;return t.subarray(a,n)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);t>this.progressiveDataLength&&this.ensureRange(e,t);return this.bytes.subarray(e,t)}makeSubStream(e,t,a=null){t?e+t>this.progressiveDataLength&&this.ensureRange(e,e+t):e>=this.progressiveDataLength&&this.ensureByte(e);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){const e=this.chunkSize,t=Math.floor(this.start/e),a=Math.floor((this.end-1)/e)+1,r=[];for(let e=t;e{const readChunk=s=>{try{if(!s.done){const e=s.value;n.push(e);i+=(0,r.arrayByteLength)(e);a.isStreamingSupported&&this.onProgress({loaded:i});a.read().then(readChunk,t);return}const o=(0,r.arraysToBytes)(n);n=null;e(o)}catch(e){t(e)}};a.read().then(readChunk,t)})).then((t=>{this.aborted||this.onReceiveData({chunk:t,begin:e})}))}requestAllChunks(){const e=this.stream.getMissingChunks();this._requestChunks(e);return this._loadedStreamCapability.promise}_requestChunks(e){const t=this.currRequestId++,a=new Set;this._chunksNeededByRequest.set(t,a);for(const t of e)this.stream.hasChunk(t)||a.add(t);if(0===a.size)return Promise.resolve();const n=(0,r.createPromiseCapability)();this._promisesByRequest.set(t,n);const i=[];for(const e of a){let a=this._requestsByChunk.get(e);if(!a){a=[];this._requestsByChunk.set(e,a);i.push(e)}a.push(t)}if(i.length>0){const e=this.groupChunks(i);for(const t of e){const e=t.beginChunk*this.chunkSize,a=Math.min(t.endChunk*this.chunkSize,this.length);this.sendRequest(e,a).catch(n.reject)}}return n.promise.catch((e=>{if(!this.aborted)throw e}))}getStream(){return this.stream}requestRange(e,t){t=Math.min(t,this.length);const a=this.getBeginChunk(e),r=this.getEndChunk(t),n=[];for(let e=a;e=0&&r+1!==i){t.push({beginChunk:a,endChunk:r+1});a=i}n+1===e.length&&t.push({beginChunk:a,endChunk:i+1});r=i}return t}onProgress(e){this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize+e.loaded,total:this.length})}onReceiveData(e){const t=e.chunk,a=void 0===e.begin,r=a?this.progressiveDataLength:e.begin,n=r+t.byteLength,i=Math.floor(r/this.chunkSize),s=n0||o.push(a)}}}if(!this.disableAutoFetch&&0===this._requestsByChunk.size){let e;if(1===this.stream.numChunksLoaded){const t=this.stream.numChunks-1;this.stream.hasChunk(t)||(e=t)}else e=this.stream.nextEmptyChunk(s);Number.isInteger(e)&&this._requestChunks([e])}for(const e of o){const t=this._promisesByRequest.get(e);this._promisesByRequest.delete(e);t.resolve()}this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})}onError(e){this._loadedStreamCapability.reject(e)}getBeginChunk(e){return Math.floor(e/this.chunkSize)}getEndChunk(e){return Math.floor((e-1)/this.chunkSize)+1}abort(e){this.aborted=!0;this.pdfNetworkStream&&this.pdfNetworkStream.cancelAllRequests(e);for(const t of this._promisesByRequest.values())t.reject(e)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StringStream=t.Stream=t.NullStream=void 0;var r=a(7),n=a(2);class Stream extends r.BaseStream{constructor(e,t,a,r){super();this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+a||this.bytes.length;this.dict=r}get length(){return this.end-this.start}get isEmpty(){return 0===this.length}getByte(){return this.pos>=this.end?-1:this.bytes[this.pos++]}getBytes(e){const t=this.bytes,a=this.pos,r=this.end;if(!e)return t.subarray(a,r);let n=a+e;n>r&&(n=r);this.pos=n;return t.subarray(a,n)}getByteRange(e,t){e<0&&(e=0);t>this.end&&(t=this.end);return this.bytes.subarray(e,t)}reset(){this.pos=this.start}moveStart(){this.start=this.pos}makeSubStream(e,t,a=null){return new Stream(this.bytes.buffer,e,t,a)}}t.Stream=Stream;t.StringStream=class StringStream extends Stream{constructor(e){super((0,n.stringToBytes)(e))}};t.NullStream=class NullStream extends Stream{constructor(){super(new Uint8Array(0))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Page=t.PDFDocument=void 0;var r=a(12),n=a(2),i=a(6),s=a(5),o=a(51),c=a(7),l=a(67),h=a(69),u=a(71),d=a(100),f=a(17),g=a(10),p=a(75),m=a(62),b=a(15),y=a(19),w=a(74),S=a(65),x=a(76),k=a(101);const C=[0,0,612,792];class Page{constructor({pdfManager:e,xref:t,pageIndex:a,pageDict:r,ref:n,globalIdFactory:i,fontCache:s,builtInCMapCache:o,standardFontDataCache:c,globalImageCache:l,nonBlendModesSet:h,xfaFactory:u}){this.pdfManager=e;this.pageIndex=a;this.pageDict=r;this.xref=t;this.ref=n;this.fontCache=s;this.builtInCMapCache=o;this.standardFontDataCache=c;this.globalImageCache=l;this.nonBlendModesSet=h;this.evaluatorOptions=e.evaluatorOptions;this.resourcesPromise=null;this.xfaFactory=u;const d={obj:0};this._localIdFactory=class extends i{static createObjId(){return`p${a}_${++d.obj}`}static getPageObjId(){return`page${n.toString()}`}}}_getInheritableProperty(e,t=!1){const a=(0,i.getInheritableProperty)({dict:this.pageDict,key:e,getArray:t,stopWhenFound:!1});return Array.isArray(a)?1!==a.length&&a[0]instanceof s.Dict?s.Dict.merge({xref:this.xref,dictArray:a}):a[0]:a}get content(){return this.pageDict.getArray("Contents")}get resources(){const e=this._getInheritableProperty("Resources");return(0,n.shadow)(this,"resources",e instanceof s.Dict?e:s.Dict.empty)}_getBoundingBox(e){if(this.xfaData)return this.xfaData.bbox;const t=this._getInheritableProperty(e,!0);if(Array.isArray(t)&&4===t.length){if(t[2]-t[0]!=0&&t[3]-t[1]!=0)return t;(0,n.warn)(`Empty /${e} entry.`)}return null}get mediaBox(){return(0,n.shadow)(this,"mediaBox",this._getBoundingBox("MediaBox")||C)}get cropBox(){return(0,n.shadow)(this,"cropBox",this._getBoundingBox("CropBox")||this.mediaBox)}get userUnit(){let e=this.pageDict.get("UserUnit");("number"!=typeof e||e<=0)&&(e=1);return(0,n.shadow)(this,"userUnit",e)}get view(){const{cropBox:e,mediaBox:t}=this;let a;if(e===t||(0,n.isArrayEqual)(e,t))a=t;else{const r=n.Util.intersect(e,t);r&&r[2]-r[0]!=0&&r[3]-r[1]!=0?a=r:(0,n.warn)("Empty /CropBox and /MediaBox intersection.")}return(0,n.shadow)(this,"view",a||t)}get rotate(){let e=this._getInheritableProperty("Rotate")||0;e%90!=0?e=0:e>=360?e%=360:e<0&&(e=(e%360+360)%360);return(0,n.shadow)(this,"rotate",e)}_onSubStreamError(e,t,a){if(!this.evaluatorOptions.ignoreErrors)throw t;e.send("UnsupportedFeature",{featureId:n.UNSUPPORTED_FEATURES.errorContentSubStream});(0,n.warn)(`getContentStream - ignoring sub-stream (${a}): "${t}".`)}getContentStream(e){return this.pdfManager.ensure(this,"content").then((t=>t instanceof c.BaseStream?t:Array.isArray(t)?new y.StreamsSequenceStream(t,this._onSubStreamError.bind(this,e)):new g.NullStream))}get xfaData(){return(0,n.shadow)(this,"xfaData",this.xfaFactory?{bbox:this.xfaFactory.getBoundingBox(this.pageIndex)}:null)}async saveNewAnnotations(e,t,a){if(this.xfaFactory)throw new Error("XFA: Cannot save new annotations.");const n=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}),i=this.pageDict,s=this.annotations.slice(),o=await r.AnnotationFactory.saveNewAnnotations(n,t,a);for(const{ref:e}of o.annotations)s.push(e);const c=i.get("Annots");i.set("Annots",s);const l=[];let h=null;this.xref.encrypt&&(h=this.xref.encrypt.createCipherTransform(this.ref.num,this.ref.gen));(0,S.writeObject)(this.ref,i,l,h);c&&i.set("Annots",c);const u=o.dependencies;u.push({ref:this.ref,data:l.join("")},...o.annotations);return u}save(e,t,a){const r=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions});return this._parsedAnnotations.then((function(e){const i=[];for(const s of e)s.mustBePrinted(a)&&i.push(s.save(r,t,a).catch((function(e){(0,n.warn)(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null})));return Promise.all(i).then((function(e){return e.filter((e=>!!e))}))}))}loadResources(e){this.resourcesPromise||(this.resourcesPromise=this.pdfManager.ensure(this,"resources"));return this.resourcesPromise.then((()=>new p.ObjectLoader(this.resources,e,this.xref).load()))}getOperatorList({handler:e,sink:t,task:a,intent:s,cacheKey:o,annotationStorage:c=null}){const l=this.getContentStream(e),h=this.loadResources(["ColorSpace","ExtGState","Font","Pattern","Properties","Shading","XObject"]),u=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}),d=this.xfaFactory?null:(0,i.getNewAnnotationsMap)(c);let f=Promise.resolve(null);if(d){const e=d.get(this.pageIndex);e&&(f=r.AnnotationFactory.printNewAnnotations(u,a,e))}const g=Promise.all([l,h]).then((([r])=>{const n=new m.OperatorList(s,t);e.send("StartRenderPage",{transparency:u.hasBlendModes(this.resources,this.nonBlendModesSet),pageIndex:this.pageIndex,cacheKey:o});return u.getOperatorList({stream:r,task:a,resources:this.resources,operatorList:n}).then((function(){return n}))}));return Promise.all([g,this._parsedAnnotations,f]).then((function([e,t,r]){r&&(t=t.concat(r));if(0===t.length||s&n.RenderingIntentFlag.ANNOTATIONS_DISABLE){e.flush(!0);return{length:e.totalLength}}const i=!!(s&n.RenderingIntentFlag.ANNOTATIONS_FORMS),o=!!(s&n.RenderingIntentFlag.ANY),l=!!(s&n.RenderingIntentFlag.DISPLAY),h=!!(s&n.RenderingIntentFlag.PRINT),d=[];for(const e of t)(o||l&&e.mustBeViewed(c)||h&&e.mustBePrinted(c))&&d.push(e.getOperatorList(u,a,s,i,c).catch((function(e){(0,n.warn)(`getOperatorList - ignoring annotation data during "${a.name}" task: "${e}".`);return null})));return Promise.all(d).then((function(t){let a=!1,r=!1;for(const{opList:n,separateForm:i,separateCanvas:s}of t){e.addOpList(n);i&&(a=i);s&&(r=s)}e.flush(!0,{form:a,canvas:r});return{length:e.totalLength}}))}))}extractTextContent({handler:e,task:t,includeMarkedContent:a,sink:r,combineTextItems:n}){const i=this.getContentStream(e),s=this.loadResources(["ExtGState","Font","Properties","XObject"]);return Promise.all([i,s]).then((([i])=>new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}).getTextContent({stream:i,task:t,resources:this.resources,includeMarkedContent:a,combineTextItems:n,sink:r,viewBox:this.view})))}async getStructTree(){const e=await this.pdfManager.ensureCatalog("structTreeRoot");if(!e)return null;return(await this.pdfManager.ensure(this,"_parseStructTree",[e])).serializable}_parseStructTree(e){const t=new w.StructTreePage(e,this.pageDict);t.parse();return t}async getAnnotationsData(e,t,a){const r=await this._parsedAnnotations;if(0===r.length)return[];const i=[],s=[];let o;const c=!!(a&n.RenderingIntentFlag.ANY),l=!!(a&n.RenderingIntentFlag.DISPLAY),h=!!(a&n.RenderingIntentFlag.PRINT);for(const a of r){const r=c||l&&a.viewable;(r||h&&a.printable)&&s.push(a.data);if(a.hasTextContent&&r){o||(o=new b.PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,options:this.evaluatorOptions}));i.push(a.extractTextContent(o,t,this.view).catch((function(e){(0,n.warn)(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)})))}}await Promise.all(i);return s}get annotations(){const e=this._getInheritableProperty("Annots");return(0,n.shadow)(this,"annotations",Array.isArray(e)?e:[])}get _parsedAnnotations(){const e=this.pdfManager.ensure(this,"annotations").then((()=>{const e=[];for(const t of this.annotations)e.push(r.AnnotationFactory.create(this.xref,t,this.pdfManager,this._localIdFactory,!1).catch((function(e){(0,n.warn)(`_parsedAnnotations: "${e}".`);return null})));return Promise.all(e).then((function(e){if(0===e.length)return e;const t=[];let a;for(const n of e)if(n)if(n instanceof r.PopupAnnotation){a||(a=[]);a.push(n)}else t.push(n);a&&t.push(...a);return t}))}));return(0,n.shadow)(this,"_parsedAnnotations",e)}get jsActions(){const e=(0,i.collectActions)(this.xref,this.pageDict,n.PageActionEventType);return(0,n.shadow)(this,"jsActions",e)}}t.Page=Page;const v=new Uint8Array([37,80,68,70,45]),F=new Uint8Array([115,116,97,114,116,120,114,101,102]),O=new Uint8Array([101,110,100,111,98,106]),T=/^[1-9]\.\d$/;function find(e,t,a=1024,r=!1){const n=t.length,i=e.peekBytes(a),s=i.length-n;if(s<=0)return!1;if(r){const a=n-1;let r=i.length-1;for(;r>=a;){let s=0;for(;s=n){e.pos+=r-a;return!0}r--}}else{let a=0;for(;a<=s;){let r=0;for(;r=n){e.pos+=a;return!0}a++}}return!1}t.PDFDocument=class PDFDocument{constructor(e,t){if(t.length<=0)throw new n.InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new k.XRef(t,e);this._pagePromises=new Map;this._version=null;const a={font:0};this._globalIdFactory=class{static getDocId(){return`g_${e.docId}`}static createFontId(){return"f"+ ++a.font}static createObjId(){(0,n.unreachable)("Abstract method `createObjId` called.")}static getPageObjId(){(0,n.unreachable)("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new h.Catalog(this.pdfManager,this.xref);this.catalog.version&&(this._version=this.catalog.version)}get linearization(){let e=null;try{e=f.Linearization.create(this.stream)}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.info)(e)}return(0,n.shadow)(this,"linearization",e)}get startXRef(){const e=this.stream;let t=0;if(this.linearization){e.reset();find(e,O)&&(t=e.pos+6-e.start)}else{const a=1024,r=F.length;let n=!1,s=e.end;for(;!n&&s>0;){s-=a-r;s<0&&(s=0);e.pos=s;n=find(e,F,a,!0)}if(n){e.skip(9);let a;do{a=e.getByte()}while((0,i.isWhiteSpace)(a));let r="";for(;a>=32&&a<=57;){r+=String.fromCharCode(a);a=e.getByte()}t=parseInt(r,10);isNaN(t)&&(t=0)}}return(0,n.shadow)(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,v))return;e.moveStart();let t,a="";for(;(t=e.getByte())>32&&!(a.length>=12);)a+=String.fromCharCode(t);this._version||(this._version=a.substring(5))}parseStartXRef(){this.xref.setStartXRef(this.startXRef)}get numPages(){let e=0;e=this.catalog.hasActualNumPages?this.catalog.numPages:this.xfaFactory?this.xfaFactory.getNumPages():this.linearization?this.linearization.numPages:this.catalog.numPages;return(0,n.shadow)(this,"numPages",e)}_hasOnlyDocumentSignatures(e,t=0){return!!Array.isArray(e)&&e.every((e=>{if(!((e=this.xref.fetchIfRef(e))instanceof s.Dict))return!1;if(e.has("Kids")){if(++t>10){(0,n.warn)("_hasOnlyDocumentSignatures: maximum recursion depth reached");return!1}return this._hasOnlyDocumentSignatures(e.get("Kids"),t)}const a=(0,s.isName)(e.get("FT"),"Sig"),r=e.get("Rect"),i=Array.isArray(r)&&r.every((e=>0===e));return a&&i}))}get _xfaStreams(){const e=this.catalog.acroForm;if(!e)return null;const t=e.get("XFA"),a={"xdp:xdp":"",template:"",datasets:"",config:"",connectionSet:"",localeSet:"",stylesheet:"","/xdp:xdp":""};if(t instanceof c.BaseStream&&!t.isEmpty){a["xdp:xdp"]=t;return a}if(!Array.isArray(t)||0===t.length)return null;for(let e=0,r=t.length;e{y.set(e,t)}));const w=[];for(const[e,a]of y){const o=a.get("FontDescriptor");if(!(o instanceof s.Dict))continue;let c=o.get("FontFamily");c=c.replace(/[ ]+(\d)/g,"$1");const l={fontFamily:c,fontWeight:o.get("FontWeight"),italicAngle:-o.get("ItalicAngle")};(0,i.validateCSSFont)(l)&&w.push(u.handleSetFont(r,[s.Name.get(e),1],null,d,t,g,null,l).catch((function(e){(0,n.warn)(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(w);const S=this.xfaFactory.setFonts(f);if(!S)return;h.ignoreErrors=!0;w.length=0;f.length=0;const x=new Set;for(const e of S)(0,o.getXfaFontName)(`${e}-Regular`)||x.add(e);x.size&&S.push("PdfJS-Fallback");for(const e of S)if(!x.has(e))for(const a of[{name:"Regular",fontWeight:400,italicAngle:0},{name:"Bold",fontWeight:700,italicAngle:0},{name:"Italic",fontWeight:400,italicAngle:12},{name:"BoldItalic",fontWeight:700,italicAngle:12}]){const i=`${e}-${a.name}`,c=(0,o.getXfaFontDict)(i);w.push(u.handleSetFont(r,[s.Name.get(i),1],null,d,t,g,c,{fontFamily:e,fontWeight:a.fontWeight,italicAngle:a.italicAngle}).catch((function(e){(0,n.warn)(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(w);this.xfaFactory.appendFonts(f,x)}async serializeXfaData(e){return this.xfaFactory?this.xfaFactory.serializeData(e):null}get formInfo(){const e={hasFields:!1,hasAcroForm:!1,hasXfa:!1,hasSignatures:!1},t=this.catalog.acroForm;if(!t)return(0,n.shadow)(this,"formInfo",e);try{const a=t.get("Fields"),r=Array.isArray(a)&&a.length>0;e.hasFields=r;const n=t.get("XFA");e.hasXfa=Array.isArray(n)&&n.length>0||n instanceof c.BaseStream&&!n.isEmpty;const i=!!(1&t.get("SigFlags")),s=i&&this._hasOnlyDocumentSignatures(a);e.hasAcroForm=r&&!s;e.hasSignatures=i}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.warn)(`Cannot fetch form information: "${e}".`)}return(0,n.shadow)(this,"formInfo",e)}get documentInfo(){let e=this._version;if("string"!=typeof e||!T.test(e)){(0,n.warn)(`Invalid PDF header version number: ${e}`);e=null}const t={PDFFormatVersion:e,Language:this.catalog.lang,EncryptFilterName:this.xref.encrypt?this.xref.encrypt.filterName:null,IsLinearized:!!this.linearization,IsAcroFormPresent:this.formInfo.hasAcroForm,IsXFAPresent:this.formInfo.hasXfa,IsCollectionPresent:!!this.catalog.collection,IsSignaturesPresent:this.formInfo.hasSignatures};let a;try{a=this.xref.trailer.get("Info")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,n.info)("The document information dictionary is invalid.")}if(!(a instanceof s.Dict))return(0,n.shadow)(this,"documentInfo",t);for(const e of a.getKeys()){const r=a.get(e);switch(e){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof r){t[e]=(0,n.stringToPDFString)(r);continue}break;case"Trapped":if(r instanceof s.Name){t[e]=r;continue}break;default:let a;switch(typeof r){case"string":a=(0,n.stringToPDFString)(r);break;case"number":case"boolean":a=r;break;default:r instanceof s.Name&&(a=r)}if(void 0===a){(0,n.warn)(`Bad value, for custom key "${e}", in Info: ${r}.`);continue}t.Custom||(t.Custom=Object.create(null));t.Custom[e]=a;continue}(0,n.warn)(`Bad value, for key "${e}", in Info: ${r}.`)}return(0,n.shadow)(this,"documentInfo",t)}get fingerprints(){function validate(e){return"string"==typeof e&&e.length>0&&"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"!==e}function hexString(e){const t=[];for(let a=0,r=e.length;anew Page({pdfManager:this.pdfManager,xref:this.xref,pageIndex:e,pageDict:t,ref:r,globalIdFactory:this._globalIdFactory,fontCache:a.fontCache,builtInCMapCache:a.builtInCMapCache,standardFontDataCache:a.standardFontDataCache,globalImageCache:a.globalImageCache,nonBlendModesSet:a.nonBlendModesSet,xfaFactory:n})));this._pagePromises.set(e,i);return i}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof i.XRefEntryException){this._pagePromises.delete(0);await this.cleanup();throw new i.XRefParseException}}}async checkLastPage(e=!1){const{catalog:t,pdfManager:a}=this;t.setActualNumPages();let r;try{await Promise.all([a.ensureDoc("xfaFactory"),a.ensureDoc("linearization"),a.ensureCatalog("numPages")]);if(this.xfaFactory)return;r=this.linearization?this.linearization.numPages:t.numPages;if(!Number.isInteger(r))throw new n.FormatError("Page count is not an integer.");if(r<=1)return;await this.getPage(r-1)}catch(s){this._pagePromises.delete(r-1);await this.cleanup();if(s instanceof i.XRefEntryException&&!e)throw new i.XRefParseException;(0,n.warn)(`checkLastPage - invalid /Pages tree /Count: ${r}.`);let o;try{o=await t.getAllPageDicts(e)}catch(a){if(a instanceof i.XRefEntryException&&!e)throw new i.XRefParseException;t.setActualNumPages(1);return}for(const[e,[r,n]]of o){let i;if(r instanceof Error){i=Promise.reject(r);i.catch((()=>{}))}else i=Promise.resolve(new Page({pdfManager:a,xref:this.xref,pageIndex:e,pageDict:r,ref:n,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalImageCache:t.globalImageCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this._pagePromises.set(e,i)}t.setActualNumPages(o.size)}}fontFallback(e,t){return this.catalog.fontFallback(e,t)}async cleanup(e=!1){return this.catalog?this.catalog.cleanup(e):(0,u.clearGlobalCaches)()}_collectFieldObjects(e,t,a){const i=this.xref.fetchIfRef(t);if(i.has("T")){const t=(0,n.stringToPDFString)(i.get("T"));e=""===e?t:`${e}.${t}`}a.has(e)||a.set(e,[]);a.get(e).push(r.AnnotationFactory.create(this.xref,t,this.pdfManager,this._localIdFactory,!0).then((e=>e&&e.getFieldObject())).catch((function(e){(0,n.warn)(`_collectFieldObjects: "${e}".`);return null})));if(i.has("Kids")){const t=i.get("Kids");for(const r of t)this._collectFieldObjects(e,r,a)}}get fieldObjects(){if(!this.formInfo.hasFields)return(0,n.shadow)(this,"fieldObjects",Promise.resolve(null));const e=Object.create(null),t=new Map;for(const e of this.catalog.acroForm.get("Fields"))this._collectFieldObjects("",e,t);const a=[];for(const[r,n]of t)a.push(Promise.all(n).then((t=>{(t=t.filter((e=>!!e))).length>0&&(e[r]=t)})));return(0,n.shadow)(this,"fieldObjects",Promise.all(a).then((()=>e)))}get hasJSActions(){const e=this.pdfManager.ensureDoc("_parseHasJSActions");return(0,n.shadow)(this,"hasJSActions",e)}async _parseHasJSActions(){const[e,t]=await Promise.all([this.pdfManager.ensureCatalog("jsActions"),this.pdfManager.ensureDoc("fieldObjects")]);return!!e||!!t&&Object.values(t).some((e=>e.some((e=>null!==e.actions))))}get calculationOrderIds(){const e=this.catalog.acroForm;if(!e||!e.has("CO"))return(0,n.shadow)(this,"calculationOrderIds",null);const t=e.get("CO");if(!Array.isArray(t)||0===t.length)return(0,n.shadow)(this,"calculationOrderIds",null);const a=[];for(const e of t)e instanceof s.Ref&&a.push(e.toString());return 0===a.length?(0,n.shadow)(this,"calculationOrderIds",null):(0,n.shadow)(this,"calculationOrderIds",a)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PopupAnnotation=t.MarkupAnnotation=t.AnnotationFactory=t.AnnotationBorderStyle=t.Annotation=void 0;t.getQuadPoints=getQuadPoints;var r=a(2),n=a(6),i=a(13),s=a(5),o=a(65),c=a(7),l=a(60),h=a(69),u=a(14),d=a(72),f=a(75),g=a(62),p=a(10),m=a(76);t.AnnotationFactory=class AnnotationFactory{static create(e,t,a,r,n){return Promise.all([a.ensureCatalog("acroForm"),a.ensureCatalog("baseUrl"),a.ensureDoc("xfaDatasets"),n?this._getPageIndex(e,t,a):-1]).then((([i,s,o,c])=>a.ensure(this,"_create",[e,t,a,r,i,o,n,c])))}static _create(e,t,a,i,o,c,l,h=-1){const u=e.fetchIfRef(t);if(!(u instanceof s.Dict))return;const d=t instanceof s.Ref?t.toString():`annot_${i.createObjId()}`;let f=u.get("Subtype");f=f instanceof s.Name?f.name:null;const g={xref:e,ref:t,dict:u,subtype:f,id:d,pdfManager:a,acroForm:o instanceof s.Dict?o:s.Dict.empty,xfaDatasets:c,collectFields:l,pageIndex:h};switch(f){case"Link":return new LinkAnnotation(g);case"Text":return new TextAnnotation(g);case"Widget":let e=(0,n.getInheritableProperty)({dict:u,key:"FT"});e=e instanceof s.Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(g);case"Btn":return new ButtonWidgetAnnotation(g);case"Ch":return new ChoiceWidgetAnnotation(g);case"Sig":return new SignatureWidgetAnnotation(g)}(0,r.warn)(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(g);case"Popup":return new PopupAnnotation(g);case"FreeText":return new FreeTextAnnotation(g);case"Line":return new LineAnnotation(g);case"Square":return new SquareAnnotation(g);case"Circle":return new CircleAnnotation(g);case"PolyLine":return new PolylineAnnotation(g);case"Polygon":return new PolygonAnnotation(g);case"Caret":return new CaretAnnotation(g);case"Ink":return new InkAnnotation(g);case"Highlight":return new HighlightAnnotation(g);case"Underline":return new UnderlineAnnotation(g);case"Squiggly":return new SquigglyAnnotation(g);case"StrikeOut":return new StrikeOutAnnotation(g);case"Stamp":return new StampAnnotation(g);case"FileAttachment":return new FileAttachmentAnnotation(g);default:l||(f?(0,r.warn)(`Unimplemented annotation type "${f}", falling back to base annotation.`):(0,r.warn)("Annotation is missing the required /Subtype."));return new Annotation(g)}}static async _getPageIndex(e,t,a){try{const r=await e.fetchIfRefAsync(t);if(!(r instanceof s.Dict))return-1;const n=r.getRaw("P");if(!(n instanceof s.Ref))return-1;return await a.ensureCatalog("getPageIndex",[n])}catch(e){(0,r.warn)(`_getPageIndex: "${e}".`);return-1}}static async saveNewAnnotations(e,t,a){const n=e.xref;let i;const c=[],l=[];for(const h of a)switch(h.annotationType){case r.AnnotationEditorType.FREETEXT:if(!i){const e=new s.Dict(n);e.set("BaseFont",s.Name.get("Helvetica"));e.set("Type",s.Name.get("Font"));e.set("Subtype",s.Name.get("Type1"));e.set("Encoding",s.Name.get("WinAnsiEncoding"));const t=[];i=n.getNewRef();(0,o.writeObject)(i,e,t,null);c.push({ref:i,data:t.join("")})}l.push(FreeTextAnnotation.createNewAnnotation(n,h,c,{evaluator:e,task:t,baseFontRef:i}));break;case r.AnnotationEditorType.INK:l.push(InkAnnotation.createNewAnnotation(n,h,c))}return{annotations:await Promise.all(l),dependencies:c}}static async printNewAnnotations(e,t,a){if(!a)return null;const n=e.xref,i=[];for(const s of a)switch(s.annotationType){case r.AnnotationEditorType.FREETEXT:i.push(FreeTextAnnotation.createNewPrintAnnotation(n,s,{evaluator:e,task:t}));break;case r.AnnotationEditorType.INK:i.push(InkAnnotation.createNewPrintAnnotation(n,s))}return Promise.all(i)}};function getRgbColor(e,t=new Uint8ClampedArray(3)){if(!Array.isArray(e))return t;const a=t||new Uint8ClampedArray(3);switch(e.length){case 0:return null;case 1:u.ColorSpace.singletons.gray.getRgbItem(e,0,a,0);return a;case 3:u.ColorSpace.singletons.rgb.getRgbItem(e,0,a,0);return a;case 4:u.ColorSpace.singletons.cmyk.getRgbItem(e,0,a,0);return a;default:return t}}function getQuadPoints(e,t){if(!e.has("QuadPoints"))return null;const a=e.getArray("QuadPoints");if(!Array.isArray(a)||0===a.length||a.length%8>0)return null;const r=[];for(let e=0,n=a.length/8;et[2]||st[3]))return null;r[e].push({x:i,y:s})}}return r.map((e=>{const[t,a,r,n]=e.reduce((([e,t,a,r],n)=>[Math.min(e,n.x),Math.max(t,n.x),Math.min(a,n.y),Math.max(r,n.y)]),[Number.MAX_VALUE,Number.MIN_VALUE,Number.MAX_VALUE,Number.MIN_VALUE]);return[{x:t,y:n},{x:a,y:n},{x:t,y:r},{x:a,y:r}]}))}function getTransformMatrix(e,t,a){const[n,i,s,o]=r.Util.getAxialAlignedBoundingBox(t,a);if(n===s||i===o)return[1,0,0,1,e[0],e[1]];const c=(e[2]-e[0])/(s-n),l=(e[3]-e[1])/(o-i);return[c,0,0,l,e[0]-n*c,e[1]-i*l]}class Annotation{constructor(e){const t=e.dict;this.setTitle(t.get("T"));this.setContents(t.get("Contents"));this.setModificationDate(t.get("M"));this.setFlags(t.get("F"));this.setRectangle(t.getArray("Rect"));this.setColor(t.getArray("C"));this.setBorderStyle(t);this.setAppearance(t);this.setOptionalContent(t);const a=t.get("MK");this.setBorderAndBackgroundColors(a);this.setRotation(a);this._streams=[];this.appearance&&this._streams.push(this.appearance);this.data={annotationFlags:this.flags,borderStyle:this.borderStyle,color:this.color,backgroundColor:this.backgroundColor,borderColor:this.borderColor,rotation:this.rotation,contentsObj:this._contents,hasAppearance:!!this.appearance,id:e.id,modificationDate:this.modificationDate,rect:this.rectangle,subtype:e.subtype,hasOwnCanvas:!1};if(e.collectFields){const a=t.get("Kids");if(Array.isArray(a)){const e=[];for(const t of a)t instanceof s.Ref&&e.push(t.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=(0,n.collectActions)(e.xref,t,r.AnnotationActionEventType);this.data.fieldName=this._constructFieldName(t);this.data.pageIndex=e.pageIndex}this._fallbackFontDict=null}_hasFlag(e,t){return!!(e&t)}_isViewable(e){return!this._hasFlag(e,r.AnnotationFlag.INVISIBLE)&&!this._hasFlag(e,r.AnnotationFlag.NOVIEW)}_isPrintable(e){return this._hasFlag(e,r.AnnotationFlag.PRINT)&&!this._hasFlag(e,r.AnnotationFlag.INVISIBLE)}mustBeViewed(e){const t=e&&e.get(this.data.id);return t&&void 0!==t.hidden?!t.hidden:this.viewable&&!this._hasFlag(this.flags,r.AnnotationFlag.HIDDEN)}mustBePrinted(e){const t=e&&e.get(this.data.id);return t&&void 0!==t.print?t.print:this.printable}get viewable(){return null!==this.data.quadPoints&&(0===this.flags||this._isViewable(this.flags))}get printable(){return null!==this.data.quadPoints&&(0!==this.flags&&this._isPrintable(this.flags))}_parseStringHelper(e){const t="string"==typeof e?(0,r.stringToPDFString)(e):"";return{str:t,dir:t&&"rtl"===(0,l.bidi)(t).dir?"rtl":"ltr"}}setTitle(e){this._title=this._parseStringHelper(e)}setContents(e){this._contents=this._parseStringHelper(e)}setModificationDate(e){this.modificationDate="string"==typeof e?e:null}setFlags(e){this.flags=Number.isInteger(e)&&e>0?e:0}hasFlag(e){return this._hasFlag(this.flags,e)}setRectangle(e){Array.isArray(e)&&4===e.length?this.rectangle=r.Util.normalizeRect(e):this.rectangle=[0,0,0,0]}setColor(e){this.color=getRgbColor(e)}setLineEndings(e){this.lineEndings=["None","None"];if(Array.isArray(e)&&2===e.length)for(let t=0;t<2;t++){const a=e[t];if(a instanceof s.Name)switch(a.name){case"None":continue;case"Square":case"Circle":case"Diamond":case"OpenArrow":case"ClosedArrow":case"Butt":case"ROpenArrow":case"RClosedArrow":case"Slash":this.lineEndings[t]=a.name;continue}(0,r.warn)(`Ignoring invalid lineEnding: ${a}`)}}setRotation(e){this.rotation=0;if(e instanceof s.Dict){let t=e.get("R")||0;if(Number.isInteger(t)&&0!==t){t%=360;t<0&&(t+=360);t%90==0&&(this.rotation=t)}}}setBorderAndBackgroundColors(e){if(e instanceof s.Dict){this.borderColor=getRgbColor(e.getArray("BC"),null);this.backgroundColor=getRgbColor(e.getArray("BG"),null)}else this.borderColor=this.backgroundColor=null}setBorderStyle(e){this.borderStyle=new AnnotationBorderStyle;if(e instanceof s.Dict)if(e.has("BS")){const t=e.get("BS"),a=t.get("Type");if(!a||(0,s.isName)(a,"Border")){this.borderStyle.setWidth(t.get("W"),this.rectangle);this.borderStyle.setStyle(t.get("S"));this.borderStyle.setDashArray(t.getArray("D"))}}else if(e.has("Border")){const t=e.getArray("Border");if(Array.isArray(t)&&t.length>=3){this.borderStyle.setHorizontalCornerRadius(t[0]);this.borderStyle.setVerticalCornerRadius(t[1]);this.borderStyle.setWidth(t[2],this.rectangle);4===t.length&&this.borderStyle.setDashArray(t[3],!0)}}else this.borderStyle.setWidth(0)}setAppearance(e){this.appearance=null;const t=e.get("AP");if(!(t instanceof s.Dict))return;const a=t.get("N");if(a instanceof c.BaseStream){this.appearance=a;return}if(!(a instanceof s.Dict))return;const r=e.get("AS");r instanceof s.Name&&a.has(r.name)&&(this.appearance=a.get(r.name))}setOptionalContent(e){this.oc=null;const t=e.get("OC");t instanceof s.Name?(0,r.warn)("setOptionalContent: Support for /Name-entry is not implemented."):t instanceof s.Dict&&(this.oc=t)}loadResources(e,t){return t.dict.getAsync("Resources").then((t=>{if(!t)return;return new f.ObjectLoader(t,e,t.xref).load().then((function(){return t}))}))}async getOperatorList(e,t,a,n,i){const o=this.data;let c=this.appearance;const l=!!(this.data.hasOwnCanvas&&a&r.RenderingIntentFlag.DISPLAY);if(!c){if(!l)return{opList:new g.OperatorList,separateForm:!1,separateCanvas:!1};c=new p.StringStream("");c.dict=new s.Dict}const h=c.dict,u=await this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"],c),d=h.getArray("BBox")||[0,0,1,1],f=h.getArray("Matrix")||[1,0,0,1,0,0],m=getTransformMatrix(o.rect,d,f),b=new g.OperatorList;let y;this.oc&&(y=await e.parseMarkedContentProps(this.oc,null));void 0!==y&&b.addOp(r.OPS.beginMarkedContentProps,["OC",y]);b.addOp(r.OPS.beginAnnotation,[o.id,o.rect,m,f,l]);await e.getOperatorList({stream:c,task:t,resources:u,operatorList:b,fallbackFontDict:this._fallbackFontDict});b.addOp(r.OPS.endAnnotation,[]);void 0!==y&&b.addOp(r.OPS.endMarkedContent,[]);this.reset();return{opList:b,separateForm:!1,separateCanvas:l}}async save(e,t,a){return null}get hasTextContent(){return!1}async extractTextContent(e,t,a){if(!this.appearance)return;const r=await this.loadResources(["ExtGState","Font","Properties","XObject"],this.appearance),n=[],i=[],s={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items){i.push(t.str);if(t.hasEOL){n.push(i.join(""));i.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:r,includeMarkedContent:!0,combineTextItems:!0,sink:s,viewBox:a});this.reset();i.length&&n.push(i.join(""));n.length>0&&(this.data.textContent=n)}getFieldObject(){return this.data.kidIds?{id:this.data.id,actions:this.data.actions,name:this.data.fieldName,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,type:"",kidIds:this.data.kidIds,page:this.data.pageIndex,rotation:this.rotation}:null}reset(){for(const e of this._streams)e.reset()}_constructFieldName(e){if(!e.has("T")&&!e.has("Parent")){(0,r.warn)("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return(0,r.stringToPDFString)(e.get("T"));const t=[];e.has("T")&&t.unshift((0,r.stringToPDFString)(e.get("T")));let a=e;const n=new s.RefSet;e.objId&&n.put(e.objId);for(;a.has("Parent");){a=a.get("Parent");if(!(a instanceof s.Dict)||a.objId&&n.has(a.objId))break;a.objId&&n.put(a.objId);a.has("T")&&t.unshift((0,r.stringToPDFString)(a.get("T")))}return t.join(".")}}t.Annotation=Annotation;class AnnotationBorderStyle{constructor(){this.width=1;this.style=r.AnnotationBorderStyleType.SOLID;this.dashArray=[3];this.horizontalCornerRadius=0;this.verticalCornerRadius=0}setWidth(e,t=[0,0,0,0]){if(e instanceof s.Name)this.width=0;else if("number"==typeof e){if(e>0){const a=(t[2]-t[0])/2,n=(t[3]-t[1])/2;if(a>0&&n>0&&(e>a||e>n)){(0,r.warn)(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`);e=1}}this.width=e}}setStyle(e){if(e instanceof s.Name)switch(e.name){case"S":this.style=r.AnnotationBorderStyleType.SOLID;break;case"D":this.style=r.AnnotationBorderStyleType.DASHED;break;case"B":this.style=r.AnnotationBorderStyleType.BEVELED;break;case"I":this.style=r.AnnotationBorderStyleType.INSET;break;case"U":this.style=r.AnnotationBorderStyleType.UNDERLINE}}setDashArray(e,t=!1){if(Array.isArray(e)&&e.length>0){let a=!0,r=!0;for(const t of e){if(!(+t>=0)){a=!1;break}t>0&&(r=!1)}if(a&&!r){this.dashArray=e;t&&this.setStyle(s.Name.get("D"))}else this.width=0}else e&&(this.width=0)}setHorizontalCornerRadius(e){Number.isInteger(e)&&(this.horizontalCornerRadius=e)}setVerticalCornerRadius(e){Number.isInteger(e)&&(this.verticalCornerRadius=e)}}t.AnnotationBorderStyle=AnnotationBorderStyle;class MarkupAnnotation extends Annotation{constructor(e){super(e);const t=e.dict;if(t.has("IRT")){const e=t.getRaw("IRT");this.data.inReplyTo=e instanceof s.Ref?e.toString():null;const a=t.get("RT");this.data.replyType=a instanceof s.Name?a.name:r.AnnotationReplyType.REPLY}if(this.data.replyType===r.AnnotationReplyType.GROUP){const e=t.get("IRT");this.setTitle(e.get("T"));this.data.titleObj=this._title;this.setContents(e.get("Contents"));this.data.contentsObj=this._contents;if(e.has("CreationDate")){this.setCreationDate(e.get("CreationDate"));this.data.creationDate=this.creationDate}else this.data.creationDate=null;if(e.has("M")){this.setModificationDate(e.get("M"));this.data.modificationDate=this.modificationDate}else this.data.modificationDate=null;this.data.hasPopup=e.has("Popup");if(e.has("C")){this.setColor(e.getArray("C"));this.data.color=this.color}else this.data.color=null}else{this.data.titleObj=this._title;this.setCreationDate(t.get("CreationDate"));this.data.creationDate=this.creationDate;this.data.hasPopup=t.has("Popup");t.has("C")||(this.data.color=null)}t.has("RC")&&(this.data.richText=m.XFAFactory.getRichTextAsHtml(t.get("RC")))}setCreationDate(e){this.creationDate="string"==typeof e?e:null}_setDefaultAppearance({xref:e,extra:t,strokeColor:a,fillColor:r,blendMode:n,strokeAlpha:i,fillAlpha:o,pointsCallback:c}){let l=Number.MAX_VALUE,h=Number.MAX_VALUE,u=Number.MIN_VALUE,d=Number.MIN_VALUE;const f=["q"];t&&f.push(t);a&&f.push(`${a[0]} ${a[1]} ${a[2]} RG`);r&&f.push(`${r[0]} ${r[1]} ${r[2]} rg`);let g=this.data.quadPoints;g||(g=[[{x:this.rectangle[0],y:this.rectangle[3]},{x:this.rectangle[2],y:this.rectangle[3]},{x:this.rectangle[0],y:this.rectangle[1]},{x:this.rectangle[2],y:this.rectangle[1]}]]);for(const e of g){const[t,a,r,n]=c(f,e);l=Math.min(l,t);u=Math.max(u,a);h=Math.min(h,r);d=Math.max(d,n)}f.push("Q");const m=new s.Dict(e),b=new s.Dict(e);b.set("Subtype",s.Name.get("Form"));const y=new p.StringStream(f.join(" "));y.dict=b;m.set("Fm0",y);const w=new s.Dict(e);n&&w.set("BM",s.Name.get(n));"number"==typeof i&&w.set("CA",i);"number"==typeof o&&w.set("ca",o);const S=new s.Dict(e);S.set("GS0",w);const x=new s.Dict(e);x.set("ExtGState",S);x.set("XObject",m);const k=new s.Dict(e);k.set("Resources",x);const C=this.data.rect=[l,h,u,d];k.set("BBox",C);this.appearance=new p.StringStream("/GS0 gs /Fm0 Do");this.appearance.dict=k;this._streams.push(this.appearance,y)}static async createNewAnnotation(e,t,a,r){const n=e.getNewRef(),i=e.getNewRef(),s=this.createNewDict(t,e,{apRef:i}),c=await this.createNewAppearanceStream(t,e,r),l=[];let h=e.encrypt?e.encrypt.createCipherTransform(i.num,i.gen):null;(0,o.writeObject)(i,c,l,h);a.push({ref:i,data:l.join("")});l.length=0;h=e.encrypt?e.encrypt.createCipherTransform(n.num,n.gen):null;(0,o.writeObject)(n,s,l,h);return{ref:n,data:l.join("")}}static async createNewPrintAnnotation(e,t,a){const r=await this.createNewAppearanceStream(t,e,a),n=this.createNewDict(t,e,{ap:r});return new this.prototype.constructor({dict:n,xref:e})}}t.MarkupAnnotation=MarkupAnnotation;class WidgetAnnotation extends Annotation{constructor(e){super(e);const t=e.dict,a=this.data;this.ref=e.ref;a.annotationType=r.AnnotationType.WIDGET;void 0===a.fieldName&&(a.fieldName=this._constructFieldName(t));void 0===a.actions&&(a.actions=(0,n.collectActions)(e.xref,t,r.AnnotationActionEventType));let o=(0,n.getInheritableProperty)({dict:t,key:"V",getArray:!0});a.fieldValue=this._decodeFormValue(o);const c=(0,n.getInheritableProperty)({dict:t,key:"DV",getArray:!0});a.defaultFieldValue=this._decodeFormValue(c);if(void 0===o&&e.xfaDatasets){const t=this._title.str;if(t){this._hasValueFromXFA=!0;a.fieldValue=o=e.xfaDatasets.getValue(t)}}void 0===o&&null!==a.defaultFieldValue&&(a.fieldValue=a.defaultFieldValue);a.alternativeText=(0,r.stringToPDFString)(t.get("TU")||"");const l=(0,n.getInheritableProperty)({dict:t,key:"DA"})||e.acroForm.get("DA");this._defaultAppearance="string"==typeof l?l:"";a.defaultAppearanceData=(0,i.parseDefaultAppearance)(this._defaultAppearance);const h=(0,n.getInheritableProperty)({dict:t,key:"FT"});a.fieldType=h instanceof s.Name?h.name:null;const u=(0,n.getInheritableProperty)({dict:t,key:"DR"}),d=e.acroForm.get("DR"),f=this.appearance&&this.appearance.dict.get("Resources");this._fieldResources={localResources:u,acroFormResources:d,appearanceResources:f,mergedResources:s.Dict.merge({xref:e.xref,dictArray:[u,f,d],mergeSubDicts:!0})};a.fieldFlags=(0,n.getInheritableProperty)({dict:t,key:"Ff"});(!Number.isInteger(a.fieldFlags)||a.fieldFlags<0)&&(a.fieldFlags=0);a.readOnly=this.hasFieldFlag(r.AnnotationFieldFlag.READONLY);a.required=this.hasFieldFlag(r.AnnotationFieldFlag.REQUIRED);a.hidden=this._hasFlag(a.annotationFlags,r.AnnotationFlag.HIDDEN)}_decodeFormValue(e){return Array.isArray(e)?e.filter((e=>"string"==typeof e)).map((e=>(0,r.stringToPDFString)(e))):e instanceof s.Name?(0,r.stringToPDFString)(e.name):"string"==typeof e?(0,r.stringToPDFString)(e):null}hasFieldFlag(e){return!!(this.data.fieldFlags&e)}static _getRotationMatrix(e,t,a){switch(e){case 90:return[0,1,-1,0,t,0];case 180:return[-1,0,0,-1,t,a];case 270:return[0,-1,1,0,0,a];default:throw new Error("Invalid rotation")}}getRotationMatrix(e){const t=e?e.get(this.data.id):void 0;let a=t&&t.rotation;void 0===a&&(a=this.rotation);if(0===a)return r.IDENTITY_MATRIX;const n=this.data.rect[2]-this.data.rect[0],i=this.data.rect[3]-this.data.rect[1];return WidgetAnnotation._getRotationMatrix(a,n,i)}getBorderAndBackgroundAppearances(e){const t=e?e.get(this.data.id):void 0;let a=t&&t.rotation;void 0===a&&(a=this.rotation);if(!this.backgroundColor&&!this.borderColor)return"";const r=this.data.rect[2]-this.data.rect[0],n=this.data.rect[3]-this.data.rect[1],s=0===a||180===a?`0 0 ${r} ${n} re`:`0 0 ${n} ${r} re`;let o="";this.backgroundColor&&(o=`${(0,i.getPdfColor)(this.backgroundColor,!0)} ${s} f `);if(this.borderColor){o+=`${this.borderStyle.width||1} w ${(0,i.getPdfColor)(this.borderColor,!1)} ${s} S `}return o}async getOperatorList(e,t,a,n,i){if(n&&!(this instanceof SignatureWidgetAnnotation))return{opList:new g.OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,a,n,i);const s=await this._getAppearance(e,t,i);if(this.appearance&&null===s)return super.getOperatorList(e,t,a,n,i);const o=new g.OperatorList;if(!this._defaultAppearance||null===s)return{opList:o,separateForm:!1,separateCanvas:!1};const c=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],l=getTransformMatrix(this.data.rect,c,[1,0,0,1,0,0]);let h;this.oc&&(h=await e.parseMarkedContentProps(this.oc,null));void 0!==h&&o.addOp(r.OPS.beginMarkedContentProps,["OC",h]);o.addOp(r.OPS.beginAnnotation,[this.data.id,this.data.rect,l,this.getRotationMatrix(i),!1]);const u=new p.StringStream(s);await e.getOperatorList({stream:u,task:t,resources:this._fieldResources.mergedResources,operatorList:o});o.addOp(r.OPS.endAnnotation,[]);void 0!==h&&o.addOp(r.OPS.endMarkedContent,[]);return{opList:o,separateForm:!1,separateCanvas:!1}}_getMKDict(e){const t=new s.Dict(null);e&&t.set("R",e);this.borderColor&&t.set("BC",Array.from(this.borderColor).map((e=>e/255)));this.backgroundColor&&t.set("BG",Array.from(this.backgroundColor).map((e=>e/255)));return t.size>0?t:null}async save(e,t,a){const n=a?a.get(this.data.id):void 0;let i=n&&n.value,c=n&&n.rotation;if(i===this.data.fieldValue||void 0===i){if(!this._hasValueFromXFA&&void 0===c)return null;i=i||this.data.fieldValue}if(void 0===c&&!this._hasValueFromXFA&&Array.isArray(i)&&Array.isArray(this.data.fieldValue)&&i.length===this.data.fieldValue.length&&i.every(((e,t)=>e===this.data.fieldValue[t])))return null;void 0===c&&(c=this.rotation);let l=await this._getAppearance(e,t,a);if(null===l)return null;const{xref:h}=e,u=h.fetchIfRef(this.ref);if(!(u instanceof s.Dict))return null;const d=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],f={path:(0,r.stringToPDFString)(u.get("T")||""),value:i},g=h.getNewRef(),p=new s.Dict(h);p.set("N",g);const m=h.encrypt;let b=null,y=null;if(m){b=m.createCipherTransform(this.ref.num,this.ref.gen);y=m.createCipherTransform(g.num,g.gen);l=y.encryptString(l)}const encoder=e=>(0,r.isAscii)(e)?e:(0,r.stringToUTF16BEString)(e);u.set("V",Array.isArray(i)?i.map(encoder):encoder(i));u.set("AP",p);u.set("M",`D:${(0,r.getModificationDate)()}`);const w=this._getMKDict(c);w&&u.set("MK",w);const S=new s.Dict(h);S.set("Length",l.length);S.set("Subtype",s.Name.get("Form"));S.set("Resources",this._getSaveFieldResources(h));S.set("BBox",d);const x=this.getRotationMatrix(a);x!==r.IDENTITY_MATRIX&&S.set("Matrix",x);const k=[`${this.ref.num} ${this.ref.gen} obj\n`];(0,o.writeDict)(u,k,b);k.push("\nendobj\n");const C=[`${g.num} ${g.gen} obj\n`];(0,o.writeDict)(S,C,y);C.push(" stream\n",l,"\nendstream\nendobj\n");return[{ref:this.ref,data:k.join(""),xfa:f},{ref:g,data:C.join(""),xfa:null}]}async _getAppearance(e,t,a){if(this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD))return null;const n=a?a.get(this.data.id):void 0;let s,o;if(n){s=n.formattedValue||n.value;o=n.rotation}if(void 0===o&&void 0===s&&(!this._hasValueFromXFA||this.appearance))return null;if(void 0===s){s=this.data.fieldValue;if(!s)return""}Array.isArray(s)&&1===s.length&&(s=s[0]);(0,r.assert)("string"==typeof s,"Expected `value` to be a string.");s=s.trim();if(""===s)return"";void 0===o&&(o=this.rotation);let c=-1;this.data.multiLine&&(c=s.split(/\r\n|\r|\n/).length);let l=this.data.rect[3]-this.data.rect[1],h=this.data.rect[2]-this.data.rect[0];90!==o&&270!==o||([h,l]=[l,h]);this._defaultAppearance||(this.data.defaultAppearanceData=(0,i.parseDefaultAppearance)(this._defaultAppearance="/Helvetica 0 Tf 0 g"));const u=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources),[d,f]=this._computeFontSize(l-2,h-4,s,u,c);let g=u.descent;isNaN(g)&&(g=0);const p=Math.min(Math.floor((l-f)/2),2)+Math.abs(g)*f,m=this.data.textAlignment;if(this.data.multiLine)return this._getMultilineAppearance(d,s,u,f,h,l,m,2,p,a);const b=u.encodeString(s).join("");if(this.data.comb)return this._getCombAppearance(d,u,b,h,2,p,a);const y=this.getBorderAndBackgroundAppearances(a);if(0===m||m>2)return`/Tx BMC q ${y}BT `+d+` 1 0 0 1 2 ${p} Tm (${(0,r.escapeString)(b)}) Tj ET Q EMC`;return`/Tx BMC q ${y}BT `+d+` 1 0 0 1 0 0 Tm ${this._renderText(b,u,f,h,m,2,p)} ET Q EMC`}static async _getFontData(e,t,a,r){const n=new g.OperatorList,i={font:null,clone(){return this}},{fontName:o,fontSize:c}=a;await e.handleSetFont(r,[o&&s.Name.get(o),c],null,n,t,i,null);return i.font}_getTextWidth(e,t){return t.charsToGlyphs(e).reduce(((e,t)=>e+t.width),0)/1e3}_computeFontSize(e,t,a,n,s){let{fontSize:o}=this.data.defaultAppearanceData;if(!o){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===s){const i=this._getTextWidth(a,n);o=roundWithTwoDigits(Math.min(e/r.LINE_FACTOR,t/i))}else{const i=a.split(/\r\n?|\n/),c=[];for(const e of i){const t=n.encodeString(e).join(""),a=n.charsToGlyphs(t),r=n.getCharPositions(t);c.push({line:t,glyphs:a,positions:r})}const isTooBig=a=>{let r=0;for(const i of c){r+=this._splitLine(null,n,a,t,i).length*a;if(r>e)return!0}return!1};o=12;let l=o*r.LINE_FACTOR,h=Math.round(e/l);h=Math.max(h,s);for(;;){l=e/h;o=roundWithTwoDigits(l/r.LINE_FACTOR);if(!isTooBig(o))break;h++}}const{fontName:c,fontColor:l}=this.data.defaultAppearanceData;this._defaultAppearance=(0,i.createDefaultAppearance)({fontSize:o,fontName:c,fontColor:l})}return[this._defaultAppearance,o]}_renderText(e,t,a,i,s,o,c){let l;if(1===s){l=(i-this._getTextWidth(e,t)*a)/2}else if(2===s){l=i-this._getTextWidth(e,t)*a-o}else l=o;l=(0,n.numberToString)(l);return`${l} ${c=(0,n.numberToString)(c)} Td (${(0,r.escapeString)(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:a,acroFormResources:r}=this._fieldResources,n=this.data.defaultAppearanceData&&this.data.defaultAppearanceData.fontName;if(!n)return t||s.Dict.empty;for(const e of[t,a])if(e instanceof s.Dict){const t=e.get("Font");if(t instanceof s.Dict&&t.has(n))return e}if(r instanceof s.Dict){const a=r.get("Font");if(a instanceof s.Dict&&a.has(n)){const r=new s.Dict(e);r.set(n,a.getRaw(n));const i=new s.Dict(e);i.set("Font",r);return s.Dict.merge({xref:e,dictArray:[i,t],mergeSubDicts:!0})}}return t||s.Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this._hasText=!0;const t=e.dict;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let a=(0,n.getInheritableProperty)({dict:t,key:"Q"});(!Number.isInteger(a)||a<0||a>2)&&(a=null);this.data.textAlignment=a;let i=(0,n.getInheritableProperty)({dict:t,key:"MaxLen"});(!Number.isInteger(i)||i<0)&&(i=0);this.data.maxLen=i;this.data.multiLine=this.hasFieldFlag(r.AnnotationFieldFlag.MULTILINE);this.data.comb=this.hasFieldFlag(r.AnnotationFieldFlag.COMB)&&!this.hasFieldFlag(r.AnnotationFieldFlag.MULTILINE)&&!this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD)&&!this.hasFieldFlag(r.AnnotationFieldFlag.FILESELECT)&&0!==this.data.maxLen;this.data.doNotScroll=this.hasFieldFlag(r.AnnotationFieldFlag.DONOTSCROLL)}_getCombAppearance(e,t,a,i,s,o,c){const l=(0,n.numberToString)(i/this.data.maxLen),h=[],u=t.getCharPositions(a);for(const[e,t]of u)h.push(`(${(0,r.escapeString)(a.substring(e,t))}) Tj`);return`/Tx BMC q ${this.getBorderAndBackgroundAppearances(c)}BT `+e+` 1 0 0 1 ${s} ${o} Tm ${h.join(` ${l} 0 Td `)} ET Q EMC`}_getMultilineAppearance(e,t,a,r,n,i,s,o,c,l){const h=t.split(/\r\n?|\n/),u=[],d=n-2*o;for(const e of h){const t=this._splitLine(e,a,r,d);for(const e of t){const t=0===u.length?o:0;u.push(this._renderText(e,a,r,n,s,t,-r))}}const f=u.join("\n");return`/Tx BMC q ${this.getBorderAndBackgroundAppearances(l)}BT `+e+` 1 0 0 1 0 ${i} Tm ${f} ET Q EMC`}_splitLine(e,t,a,r,n={}){e=n.line||t.encodeString(e).join("");const i=n.glyphs||t.charsToGlyphs(e);if(i.length<=1)return[e];const s=n.positions||t.getCharPositions(e),o=a/1e3,c=[];let l=-1,h=-1,u=-1,d=0,f=0;for(let t=0,a=i.length;tr){c.push(e.substring(d,a));d=a;f=p;l=-1;u=-1}else{f+=p;l=a;h=n;u=t}else if(f+p>r)if(-1!==l){c.push(e.substring(d,h));d=h;t=u+1;l=-1;f=0}else{c.push(e.substring(d,a));d=a;f=p}else f+=p}d"Off"!==e));i.length=0;i.push("Off",e)}i.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=i[1];this.checkedAppearance=a.get(this.data.exportValue)||null;this.uncheckedAppearance=a.get("Off")||null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"check");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict}_processRadioButton(e){this.data.fieldValue=this.data.buttonValue=null;const t=e.dict.get("Parent");if(t instanceof s.Dict){this.parent=e.dict.getRaw("Parent");const a=t.get("V");a instanceof s.Name&&(this.data.fieldValue=this._decodeFormValue(a))}const a=e.dict.get("AP");if(!(a instanceof s.Dict))return;const r=a.get("N");if(r instanceof s.Dict){for(const e of r.getKeys())if("Off"!==e){this.data.buttonValue=this._decodeFormValue(e);break}this.checkedAppearance=r.get(this.data.buttonValue)||null;this.uncheckedAppearance=r.get("Off")||null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"disc");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict}}_processPushButton(e){if(e.dict.has("A")||e.dict.has("AA")||this.data.alternativeText){this.data.isTooltipOnly=!e.dict.has("A")&&!e.dict.has("AA");h.Catalog.parseDestDictionary({destDict:e.dict,resultObj:this.data,docBaseUrl:e.pdfManager.docBaseUrl})}else(0,r.warn)("Push buttons without action dictionaries are not supported")}getFieldObject(){let e,t="button";if(this.data.checkBox){t="checkbox";e=this.data.exportValue}else if(this.data.radioButton){t="radiobutton";e=this.data.buttonValue}return{id:this.data.id,value:this.data.fieldValue||"Off",defaultValue:this.data.defaultFieldValue,exportValues:e,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,hidden:this.data.hidden,actions:this.data.actions,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:t}}get fallbackFontDict(){const e=new s.Dict;e.set("BaseFont",s.Name.get("ZapfDingbats"));e.set("Type",s.Name.get("FallbackType"));e.set("Subtype",s.Name.get("FallbackType"));e.set("Encoding",s.Name.get("ZapfDingbatsEncoding"));return(0,r.shadow)(this,"fallbackFontDict",e)}}class ChoiceWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.data.options=[];const t=(0,n.getInheritableProperty)({dict:e.dict,key:"Opt"});if(Array.isArray(t)){const a=e.xref;for(let e=0,r=t.length;e0?this.data.fieldValue[0]:null;return{id:this.data.id,value:t,defaultValue:this.data.defaultFieldValue,editable:!this.data.readOnly,name:this.data.fieldName,rect:this.data.rect,numItems:this.data.fieldValue.length,multipleSelection:this.data.multiSelect,hidden:this.data.hidden,actions:this.data.actions,items:this.data.options,page:this.data.pageIndex,strokeColor:this.data.borderColor,fillColor:this.data.backgroundColor,rotation:this.rotation,type:e}}async _getAppearance(e,t,a){if(this.data.combo)return super._getAppearance(e,t,a);if(!a)return null;const n=a.get(this.data.id);if(!n)return null;const s=n.rotation;let o=n.value;if(void 0===s&&void 0===o)return null;void 0===o?o=this.data.fieldValue:Array.isArray(o)||(o=[o]);let c=this.data.rect[3]-this.data.rect[1],l=this.data.rect[2]-this.data.rect[0];90!==s&&270!==s||([l,c]=[c,l]);const h=this.data.options.length,u=[];for(let e=0;ea){a=r;t=e}}[f,g]=this._computeFontSize(e,l-4,t,d,-1)}const p=g*r.LINE_FACTOR,m=(p-g)/2,b=Math.floor(c/p);let y;if(1===u.length){const e=u[0];y=e-e%b}else y=u.length?u[0]:0;const w=Math.min(y+b+1,h),S=["/Tx BMC q",`1 1 ${l} ${c} re W n`];if(u.length){S.push("0.600006 0.756866 0.854904 rg");for(const e of u)y<=e&&eC&&(E=C/T);let D=1;const N=r.LINE_FACTOR*u,R=r.LINE_DESCENT_FACTOR*u,L=N*F.length;L>v&&(D=v/L);const j=u*Math.min(E,D),$=["q",`0 0 ${(0,n.numberToString)(C)} ${(0,n.numberToString)(v)} re W n`,"BT",`1 0 0 1 0 ${(0,n.numberToString)(v+R)} Tm 0 Tc ${(0,i.getPdfColor)(h,!0)}`,`/Helv ${(0,n.numberToString)(j)} Tf`],_=(0,n.numberToString)(N);for(const e of M)$.push(`0 -${_} Td (${(0,r.escapeString)(e)}) Tj`);$.push("ET","Q");const U=$.join("\n"),X=new s.Dict(t);X.set("FormType",1);X.set("Subtype",s.Name.get("Form"));X.set("Type",s.Name.get("XObject"));X.set("BBox",[0,0,C,v]);X.set("Length",U.length);X.set("Resources",m);if(f){const e=WidgetAnnotation._getRotationMatrix(f,C,v);X.set("Matrix",e)}const H=new p.StringStream(U);H.dict=X;return H}}class LineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t}=e;this.data.annotationType=r.AnnotationType.LINE;const a=t.getArray("L");this.data.lineCoordinates=r.Util.normalizeRect(a);this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings;if(!this.appearance){const n=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],i=t.get("CA");let s=null,o=t.getArray("IC");if(o){o=getRgbColor(o,null);s=o?Array.from(o).map((e=>e/255)):null}const c=s?i:null,l=this.borderStyle.width||1,h=2*l,u=[this.data.lineCoordinates[0]-h,this.data.lineCoordinates[1]-h,this.data.lineCoordinates[2]+h,this.data.lineCoordinates[3]+h];r.Util.intersect(this.rectangle,u)||(this.rectangle=u);this._setDefaultAppearance({xref:e.xref,extra:`${l} w`,strokeColor:n,fillColor:s,strokeAlpha:i,fillAlpha:c,pointsCallback:(e,t)=>{e.push(`${a[0]} ${a[1]} m`,`${a[2]} ${a[3]} l`,"S");return[t[0].x-l,t[1].x+l,t[3].y-l,t[1].y+l]}})}}}class SquareAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.SQUARE;if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");let r=null,n=e.dict.getArray("IC");if(n){n=getRgbColor(n,null);r=n?Array.from(n).map((e=>e/255)):null}const i=r?a:null;if(0===this.borderStyle.width&&!r)return;this._setDefaultAppearance({xref:e.xref,extra:`${this.borderStyle.width} w`,strokeColor:t,fillColor:r,strokeAlpha:a,fillAlpha:i,pointsCallback:(e,t)=>{const a=t[2].x+this.borderStyle.width/2,n=t[2].y+this.borderStyle.width/2,i=t[3].x-t[2].x-this.borderStyle.width,s=t[1].y-t[3].y-this.borderStyle.width;e.push(`${a} ${n} ${i} ${s} re`);r?e.push("B"):e.push("S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}}class CircleAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.CIRCLE;if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");let r=null,n=e.dict.getArray("IC");if(n){n=getRgbColor(n,null);r=n?Array.from(n).map((e=>e/255)):null}const i=r?a:null;if(0===this.borderStyle.width&&!r)return;const s=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:e.xref,extra:`${this.borderStyle.width} w`,strokeColor:t,fillColor:r,strokeAlpha:a,fillAlpha:i,pointsCallback:(e,t)=>{const a=t[0].x+this.borderStyle.width/2,n=t[0].y-this.borderStyle.width/2,i=t[3].x-this.borderStyle.width/2,o=t[3].y+this.borderStyle.width/2,c=a+(i-a)/2,l=n+(o-n)/2,h=(i-a)/2*s,u=(o-n)/2*s;e.push(`${c} ${o} m`,`${c+h} ${o} ${i} ${l+u} ${i} ${l} c`,`${i} ${l-u} ${c+h} ${n} ${c} ${n} c`,`${c-h} ${n} ${a} ${l-u} ${a} ${l} c`,`${a} ${l+u} ${c-h} ${o} ${c} ${o} c`,"h");r?e.push("B"):e.push("S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}}class PolylineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t}=e;this.data.annotationType=r.AnnotationType.POLYLINE;this.data.vertices=[];if(!(this instanceof PolygonAnnotation)){this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings}const a=t.getArray("Vertices");if(Array.isArray(a)){for(let e=0,t=a.length;ee/255)):[0,0,0],n=t.get("CA"),i=this.borderStyle.width||1,s=2*i,o=[1/0,1/0,-1/0,-1/0];for(const e of this.data.vertices){o[0]=Math.min(o[0],e.x-s);o[1]=Math.min(o[1],e.y-s);o[2]=Math.max(o[2],e.x+s);o[3]=Math.max(o[3],e.y+s)}r.Util.intersect(this.rectangle,o)||(this.rectangle=o);this._setDefaultAppearance({xref:e.xref,extra:`${i} w`,strokeColor:a,strokeAlpha:n,pointsCallback:(e,t)=>{const a=this.data.vertices;for(let t=0,r=a.length;te/255)):[0,0,0],a=e.dict.get("CA"),n=this.borderStyle.width||1,i=2*n,s=[1/0,1/0,-1/0,-1/0];for(const e of this.data.inkLists)for(const t of e){s[0]=Math.min(s[0],t.x-i);s[1]=Math.min(s[1],t.y-i);s[2]=Math.max(s[2],t.x+i);s[3]=Math.max(s[3],t.y+i)}r.Util.intersect(this.rectangle,s)||(this.rectangle=s);this._setDefaultAppearance({xref:e.xref,extra:`${n} w`,strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{for(const t of this.data.inkLists){for(let a=0,r=t.length;ae.points)));l.set("F",4);l.set("Border",[0,0,0]);l.set("Rotate",c);const h=new s.Dict(t);l.set("AP",h);a?h.set("N",a):h.set("N",n);return l}static async createNewAppearanceStream(e,t,a){const{color:r,rect:o,rotation:c,paths:l,thickness:h,opacity:u}=e,[d,f,g,m]=o;let b=g-d,y=m-f;c%180!=0&&([b,y]=[y,b]);const w=[`${h} w 1 J 1 j`,`${(0,i.getPdfColor)(r,!1)}`];1!==u&&w.push("/R0 gs");const S=[];for(const{bezier:e}of l){S.length=0;S.push(`${(0,n.numberToString)(e[0])} ${(0,n.numberToString)(e[1])} m`);for(let t=2,a=e.length;te/255)):[1,1,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,fillColor:t,blendMode:"Multiply",fillAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[0].x} ${t[0].y} m`,`${t[1].x} ${t[1].y} l`,`${t[3].x} ${t[3].y} l`,`${t[2].x} ${t[2].y} l`,"f");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class UnderlineAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.UNDERLINE;if(this.data.quadPoints=getQuadPoints(e.dict,null)){if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{e.push(`${t[2].x} ${t[2].y} m`,`${t[3].x} ${t[3].y} l`,"S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class SquigglyAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.SQUIGGLY;if(this.data.quadPoints=getQuadPoints(e.dict,null)){if(!this.appearance){const t=this.color?Array.from(this.color).map((e=>e/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{const a=(t[0].y-t[2].y)/6;let r=a,n=t[2].x;const i=t[2].y,s=t[3].x;e.push(`${n} ${i+r} m`);do{n+=2;r=0===r?a:0;e.push(`${n} ${i+r} l`)}while(ne/255)):[0,0,0],a=e.dict.get("CA");this._setDefaultAppearance({xref:e.xref,extra:"[] 0 d 1 w",strokeColor:t,strokeAlpha:a,pointsCallback:(e,t)=>{e.push((t[0].x+t[2].x)/2+" "+(t[0].y+t[2].y)/2+" m",(t[1].x+t[3].x)/2+" "+(t[1].y+t[3].y)/2+" l","S");return[t[0].x,t[1].x,t[3].y,t[1].y]}})}}else this.data.hasPopup=!1}}class StampAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=r.AnnotationType.STAMP}}class FileAttachmentAnnotation extends MarkupAnnotation{constructor(e){super(e);const t=new d.FileSpec(e.dict.get("FS"),e.xref);this.data.annotationType=r.AnnotationType.FILEATTACHMENT;this.data.file=t.serializable}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.createDefaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:a}){return`/${(0,r.escapePDFName)(t)} ${e} Tf ${getPdfColor(a,!0)}`};t.getPdfColor=getPdfColor;t.parseDefaultAppearance=function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()};var r=a(6),n=a(2),i=a(14),s=a(15),o=a(5),c=a(10);class DefaultAppearanceEvaluator extends s.EvaluatorPreprocessor{constructor(e){super(new c.StringStream(e))}parse(){const e={fn:0,args:[]},t={fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3)};try{for(;;){e.args.length=0;if(!this.read(e))break;if(0!==this.savedStatesDepth)continue;const{fn:a,args:r}=e;switch(0|a){case n.OPS.setFont:const[e,a]=r;e instanceof o.Name&&(t.fontName=e.name);"number"==typeof a&&a>0&&(t.fontSize=a);break;case n.OPS.setFillRGBColor:i.ColorSpace.singletons.rgb.getRgbItem(r,0,t.fontColor,0);break;case n.OPS.setFillGray:i.ColorSpace.singletons.gray.getRgbItem(r,0,t.fontColor,0);break;case n.OPS.setFillColorSpace:i.ColorSpace.singletons.cmyk.getRgbItem(r,0,t.fontColor,0)}}}catch(e){(0,n.warn)(`parseDefaultAppearance - ignoring errors: "${e}".`)}return t}}function getPdfColor(e,t){if(e[0]===e[1]&&e[1]===e[2]){const a=e[0]/255;return`${(0,r.numberToString)(a)} ${t?"g":"G"}`}return Array.from(e).map((e=>(0,r.numberToString)(e/255))).join(" ")+" "+(t?"rg":"RG")}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ColorSpace=void 0;var r=a(2),n=a(5),i=a(7),s=a(6);class ColorSpace{constructor(e,t){this.constructor===ColorSpace&&(0,r.unreachable)("Cannot initialize ColorSpace.");this.name=e;this.numComps=t}getRgb(e,t){const a=new Uint8ClampedArray(3);this.getRgbItem(e,t,a,0);return a}getRgbItem(e,t,a,n){(0,r.unreachable)("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,a,n,i,s,o){(0,r.unreachable)("Should not call ColorSpace.getRgbBuffer")}getOutputLength(e,t){(0,r.unreachable)("Should not call ColorSpace.getOutputLength")}isPassthrough(e){return!1}isDefaultDecode(e,t){return ColorSpace.isDefaultDecode(e,this.numComps)}fillRgb(e,t,a,r,n,i,s,o,c){const l=t*a;let h=null;const u=1<u&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){const t=s<=8?new Uint8Array(u):new Uint16Array(u);for(let e=0;e=.99554525?1:adjustToRange(0,1,1.055*e**(1/2.4)-.055)}function adjustToRange(e,t,a){return Math.max(e,Math.min(t,a))}function decodeL(e){return e<0?-decodeL(-e):e>8?((e+16)/116)**3:.0011070564598794539*e}function convertToRgb(r,c,l,h,u,d){const f=adjustToRange(0,1,c[l]*d),g=adjustToRange(0,1,c[l+1]*d),p=adjustToRange(0,1,c[l+2]*d),m=1===f?1:f**r.GR,b=1===g?1:g**r.GG,y=1===p?1:p**r.GB,w=r.MXA*m+r.MXB*b+r.MXC*y,S=r.MYA*m+r.MYB*b+r.MYC*y,x=r.MZA*m+r.MZB*b+r.MZC*y,k=s;k[0]=w;k[1]=S;k[2]=x;const C=o;!function normalizeWhitePointToFlat(a,r,n){if(1===a[0]&&1===a[2]){n[0]=r[0];n[1]=r[1];n[2]=r[2];return}const s=n;matrixProduct(e,r,s);const o=i;!function convertToFlat(e,t,a){a[0]=1*t[0]/e[0];a[1]=1*t[1]/e[1];a[2]=1*t[2]/e[2]}(a,s,o);matrixProduct(t,o,n)}(r.whitePoint,k,C);const v=s;!function compensateBlackPoint(e,t,a){if(0===e[0]&&0===e[1]&&0===e[2]){a[0]=t[0];a[1]=t[1];a[2]=t[2];return}const r=decodeL(0),n=(1-r)/(1-decodeL(e[0])),i=1-n,s=(1-r)/(1-decodeL(e[1])),o=1-s,c=(1-r)/(1-decodeL(e[2])),l=1-c;a[0]=t[0]*n+i;a[1]=t[1]*s+o;a[2]=t[2]*c+l}(r.blackPoint,C,v);const F=o;!function normalizeWhitePointToD65(a,r,n){const s=n;matrixProduct(e,r,s);const o=i;!function convertToD65(e,t,a){a[0]=.95047*t[0]/e[0];a[1]=1*t[1]/e[1];a[2]=1.08883*t[2]/e[2]}(a,s,o);matrixProduct(t,o,n)}(n,v,F);const O=s;matrixProduct(a,F,O);h[u]=255*sRGBTransferFunction(O[0]);h[u+1]=255*sRGBTransferFunction(O[1]);h[u+2]=255*sRGBTransferFunction(O[2])}return class CalRGBCS extends ColorSpace{constructor(e,t,a,n){super("CalRGB",3);if(!e)throw new r.FormatError("WhitePoint missing - required for color space CalRGB");t=t||new Float32Array(3);a=a||new Float32Array([1,1,1]);n=n||new Float32Array([1,0,0,0,1,0,0,0,1]);const i=e[0],s=e[1],o=e[2];this.whitePoint=e;const c=t[0],l=t[1],h=t[2];this.blackPoint=t;this.GR=a[0];this.GG=a[1];this.GB=a[2];this.MXA=n[0];this.MYA=n[1];this.MZA=n[2];this.MXB=n[3];this.MYB=n[4];this.MZB=n[5];this.MXC=n[6];this.MYC=n[7];this.MZC=n[8];if(i<0||o<0||1!==s)throw new r.FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`);if(c<0||l<0||h<0){(0,r.info)(`Invalid BlackPoint for ${this.name} [${c}, ${l}, ${h}], falling back to default.`);this.blackPoint=new Float32Array(3)}if(this.GR<0||this.GG<0||this.GB<0){(0,r.info)(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ${this.name}, falling back to default.`);this.GR=this.GG=this.GB=1}}getRgbItem(e,t,a,r){convertToRgb(this,e,t,a,r,1)}getRgbBuffer(e,t,a,r,n,i,s){const o=1/((1<=6/29?e**3:108/841*(e-4/29);return t}function decode(e,t,a,r){return a+e*(r-a)/t}function convertToRgb(e,t,a,r,n,i){let s=t[a],o=t[a+1],c=t[a+2];if(!1!==r){s=decode(s,r,0,100);o=decode(o,r,e.amin,e.amax);c=decode(c,r,e.bmin,e.bmax)}o>e.amax?o=e.amax:oe.bmax?c=e.bmax:cthis.amax||this.bmin>this.bmax){(0,r.info)("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}getRgbItem(e,t,a,r){convertToRgb(this,e,t,!1,a,r)}getRgbBuffer(e,t,a,r,n,i,s){const o=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.PartialEvaluator=t.EvaluatorPreprocessor=void 0;var r=a(2),n=a(16),i=a(5),s=a(34),o=a(38),c=a(37),l=a(41),h=a(40),u=a(50),d=a(51),f=a(42),g=a(57),p=a(17),m=a(59),b=a(10),y=a(7),w=a(60),S=a(14),x=a(19),k=a(39),C=a(6),v=a(45),F=a(61),O=a(62),T=a(63);const M=Object.freeze({maxImageSize:-1,disableFontFace:!1,ignoreErrors:!1,isEvalSupported:!0,fontExtraProperties:!1,useSystemFonts:!0,cMapUrl:null,standardFontDataUrl:null}),E=1,D=2,N=Promise.resolve();function normalizeBlendMode(e,t=!1){if(Array.isArray(e)){for(let t=0,a=e.length;t0&&e.args[0].count++}class TimeSlotManager{static get TIME_SLOT_DURATION_MS(){return(0,r.shadow)(this,"TIME_SLOT_DURATION_MS",20)}static get CHECK_TIME_EVERY(){return(0,r.shadow)(this,"CHECK_TIME_EVERY",100)}constructor(){this.reset()}check(){if(++this.checkedd){const e="Image exceeded maximum allowed size and was removed.";if(this.options.ignoreErrors){(0,r.warn)(e);return}throw new Error(e)}let f;c.has("OC")&&(f=await this.parseMarkedContentProps(c.get("OC"),e));let g,p;if(c.get("IM","ImageMask")||!1){const e=c.get("I","Interpolate"),a=h+7>>3,o=t.getBytes(a*u),d=c.getArray("D","Decode");if(this.parsingType3Font){g=T.PDFImage.createRawMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof x.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e});g.cached=!!i;p=[g];n.addImageOps(r.OPS.paintImageMaskXObject,p,f);i&&s.set(i,l,{fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f});return}g=T.PDFImage.createMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof x.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e});if(g.isSingleOpaquePixel){n.addImageOps(r.OPS.paintSolidColorImageMask,[],f);i&&s.set(i,l,{fn:r.OPS.paintSolidColorImageMask,args:[],optionalContent:f});return}const m=`mask_${this.idFactory.createObjId()}`;n.addDependency(m);this._sendImgData(m,g);p=[{data:m,width:g.width,height:g.height,interpolate:g.interpolate,count:1}];n.addImageOps(r.OPS.paintImageMaskXObject,p,f);i&&s.set(i,l,{fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f});return}const m=c.get("SM","SMask")||!1,b=c.get("Mask")||!1;if(a&&!m&&!b&&h+u<200){const i=new T.PDFImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o});g=i.createImageData(!0);n.addImageOps(r.OPS.paintInlineImageXObject,[g],f);return}let y=`img_${this.idFactory.createObjId()}`,w=!1;if(this.parsingType3Font)y=`${this.idFactory.getDocId()}_type3_${y}`;else if(l){w=this.globalImageCache.shouldCache(l,this.pageIndex);w&&(y=`${this.idFactory.getDocId()}_${y}`)}n.addDependency(y);p=[y,h,u];T.PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o}).then((e=>{g=e.createImageData(!1);i&&l&&w&&this.globalImageCache.addByteSize(l,g.data.length);return this._sendImgData(y,g,w)})).catch((e=>{(0,r.warn)(`Unable to decode image "${y}": "${e}".`);return this._sendImgData(y,null,w)}));n.addImageOps(r.OPS.paintImageXObject,p,f);if(i){s.set(i,l,{fn:r.OPS.paintImageXObject,args:p,optionalContent:f});if(l){(0,r.assert)(!a,"Cannot cache an inline image globally.");this.globalImageCache.addPageIndex(l,this.pageIndex);w&&this.globalImageCache.setData(l,{objId:y,fn:r.OPS.paintImageXObject,args:p,optionalContent:f,byteSize:0})}}}handleSMask(e,t,a,r,n,i){const s=e.get("G"),o={subtype:e.get("S").name,backdrop:e.get("BC")},c=e.get("TR");if((0,g.isPDFFunction)(c)){const e=this._pdfFunctionFactory.create(c),t=new Uint8Array(256),a=new Float32Array(1);for(let r=0;r<256;r++){a[0]=r/255;e(a,0,a,0);t[r]=255*a[0]|0}o.transferMap=t}return this.buildFormXObject(t,s,o,a,r,n.state.clone(),i)}handleTransferFunction(e){let t;if(Array.isArray(e))t=e;else{if(!(0,g.isPDFFunction)(e))return null;t=[e]}const a=[];let r=0,n=0;for(const e of t){const t=this.xref.fetchIfRef(e);r++;if((0,i.isName)(t,"Identity")){a.push(null);continue}if(!(0,g.isPDFFunction)(t))return null;const s=this._pdfFunctionFactory.create(t),o=new Uint8Array(256),c=new Float32Array(1);for(let e=0;e<256;e++){c[0]=e/255;s(c,0,c,0);o[e]=255*c[0]|0}a.push(o);n++}return 1!==r&&4!==r||0===n?null:a}handleTilingType(e,t,a,n,s,o,c,l){const h=new O.OperatorList,d=i.Dict.merge({xref:this.xref,dictArray:[s.get("Resources"),a]});return this.getOperatorList({stream:n,task:c,resources:d,operatorList:h}).then((function(){const a=h.getIR(),r=(0,u.getTilingPatternIR)(a,s,t);o.addDependencies(h.dependencies);o.addOp(e,r);s.objId&&l.set(null,s.objId,{operatorListIR:a,dict:s})})).catch((e=>{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorTilingPattern});(0,r.warn)(`handleTilingType - ignoring pattern: "${e}".`)}}))}handleSetFont(e,t,a,n,o,c,l=null,h=null){const u=t&&t[0]instanceof i.Name?t[0].name:null;return this.loadFont(u,a,e,l,h).then((t=>t.font.isType3Font?t.loadType3Data(this,e,o).then((function(){n.addDependencies(t.type3Dependencies);return t})).catch((e=>{this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontLoadType3});return new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Type3 font load error: ${e}`),dict:t.font,evaluatorOptions:this.options})})):t)).then((e=>{c.font=e.font;e.send(this.handler);return e.loadedName}))}handleText(e,t){const a=t.font,n=a.charsToGlyphs(e);if(a.data){(!!(t.textRenderingMode&r.TextRenderingMode.ADD_TO_PATH_FLAG)||"Pattern"===t.fillColorSpace.name||a.disableFontFace||this.options.disableFontFace)&&PartialEvaluator.buildFontPaths(a,n,this.handler,this.options)}return n}ensureStateFont(e){if(e.font)return;const t=new r.FormatError("Missing setFont (Tf) operator before text rendering operator.");if(!this.options.ignoreErrors)throw t;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontState});(0,r.warn)(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:a,cacheKey:n,task:s,stateManager:o,localGStateCache:c,localColorSpaceCache:l}){const h=t.objId;let u=!0;const d=[],f=t.getKeys();let g=Promise.resolve();for(let n=0,c=f.length;nthis.handleSetFont(e,null,h[0],a,s,o.state).then((function(e){a.addDependency(e);d.push([c,[e,h[1]]])}))));break;case"BM":d.push([c,normalizeBlendMode(h)]);break;case"SMask":if((0,i.isName)(h,"None")){d.push([c,!1]);break}if(h instanceof i.Dict){u=!1;g=g.then((()=>this.handleSMask(h,e,a,s,o,l)));d.push([c,!0])}else(0,r.warn)("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(h);d.push([c,t]);break;case"OP":case"op":case"OPM":case"BG":case"BG2":case"UCR":case"UCR2":case"TR2":case"HT":case"SM":case"SA":case"AIS":case"TK":(0,r.info)("graphic state operator "+c);break;default:(0,r.info)("Unknown graphic state operator "+c)}}return g.then((function(){d.length>0&&a.addOp(r.OPS.setGState,[d]);u&&c.set(n,h,d)}))}loadFont(e,t,a,n=null,c=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Font "${e}" is not available.`),dict:t,evaluatorOptions:this.options}),l=this.xref;let h;if(t)t instanceof i.Ref&&(h=t);else{const t=a.get("Font");t&&(h=t.getRaw(e))}if(!h){const a=`Font "${e||t&&t.toString()}" is not available`;if(!this.options.ignoreErrors&&!this.parsingType3Font){(0,r.warn)(`${a}.`);return errorFont()}this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontMissing});(0,r.warn)(`${a} -- attempting to fallback to a default font.`);h=n||PartialEvaluator.fallbackFontDict}if(this.parsingType3Font&&this.type3FontRefs.has(h))return errorFont();if(this.fontCache.has(h))return this.fontCache.get(h);if(!((t=l.fetchIfRef(h))instanceof i.Dict))return errorFont();if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const u=(0,r.createPromiseCapability)();let d;try{d=this.preEvaluateFont(t);d.cssFontInfo=c}catch(e){(0,r.warn)(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:f,hash:g}=d,p=h instanceof i.Ref;let m;p&&(m=`f${h.toString()}`);if(g&&f instanceof i.Dict){f.fontAliases||(f.fontAliases=Object.create(null));const e=f.fontAliases;if(e[g]){const t=e[g].aliasRef;if(p&&t&&this.fontCache.has(t)){this.fontCache.putAlias(h,t);return this.fontCache.get(h)}}else e[g]={fontID:this.idFactory.createFontId()};p&&(e[g].aliasRef=h);m=e[g].fontID}if(p)this.fontCache.put(h,u.promise);else{m||(m=this.idFactory.createFontId());t.cacheKey=`cacheKey_${m}`;this.fontCache.put(t.cacheKey,u.promise)}(0,r.assert)(m&&m.startsWith("f"),'The "fontID" must be (correctly) defined.');t.loadedName=`${this.idFactory.getDocId()}_${m}`;this.translateFont(d).then((e=>{void 0!==e.fontType&&l.stats.addFontType(e.fontType);u.resolve(new TranslatedFont({loadedName:t.loadedName,font:e,dict:t,evaluatorOptions:this.options}))})).catch((e=>{this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontTranslate});(0,r.warn)(`loadFont - translateFont failed: "${e}".`);try{const e=f&&f.get("FontFile3"),t=e&&e.get("Subtype"),a=(0,o.getFontType)(d.type,t&&t.name);void 0!==a&&l.stats.addFontType(a)}catch(e){}u.resolve(new TranslatedFont({loadedName:t.loadedName,font:new s.ErrorFont(e instanceof Error?e.message:e),dict:t,evaluatorOptions:this.options}))}));return u.promise}buildPath(e,t,a,n=!1){const i=e.length-1;a||(a=[]);let s;if(i<0||e.fnArray[i]!==r.OPS.constructPath){if(n){(0,r.warn)(`Encountered path operator "${t}" inside of a text object.`);e.addOp(r.OPS.save,null)}s=[1/0,-1/0,1/0,-1/0];e.addOp(r.OPS.constructPath,[[t],a,s]);n&&e.addOp(r.OPS.restore,null)}else{const r=e.argsArray[i];r[0].push(t);Array.prototype.push.apply(r[1],a);s=r[2]}switch(t){case r.OPS.rectangle:s[0]=Math.min(s[0],a[0],a[0]+a[2]);s[1]=Math.max(s[1],a[0],a[0]+a[2]);s[2]=Math.min(s[2],a[1],a[1]+a[3]);s[3]=Math.max(s[3],a[1],a[1]+a[3]);break;case r.OPS.moveTo:case r.OPS.lineTo:s[0]=Math.min(s[0],a[0]);s[1]=Math.max(s[1],a[0]);s[2]=Math.min(s[2],a[1]);s[3]=Math.max(s[3],a[1])}}parseColorSpace({cs:e,resources:t,localColorSpaceCache:a}){return S.ColorSpace.parseAsync({cs:e,xref:this.xref,resources:t,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:a}).catch((e=>{if(e instanceof r.AbortException)return null;if(this.options.ignoreErrors){this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorColorSpace});(0,r.warn)(`parseColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}))}parseShading({shading:e,resources:t,localColorSpaceCache:a,localShadingPatternCache:r}){let n=r.get(e);if(!n){const i=u.Pattern.parseShading(e,this.xref,t,this.handler,this._pdfFunctionFactory,a).getIR();n=`pattern_${this.idFactory.createObjId()}`;r.set(e,n);this.handler.send("obj",[n,this.pageIndex,"Pattern",i])}return n}handleColorN(e,t,a,n,s,o,c,l,h,d){const f=a.pop();if(f instanceof i.Name){const g=s.getRaw(f.name),p=g instanceof i.Ref&&h.getByRef(g);if(p)try{const r=n.base?n.base.getRgb(a,0):null,i=(0,u.getTilingPatternIR)(p.operatorListIR,p.dict,r);e.addOp(t,i);return}catch(e){}const m=this.xref.fetchIfRef(g);if(m){const i=m instanceof y.BaseStream?m.dict:m,s=i.get("PatternType");if(s===E){const r=n.base?n.base.getRgb(a,0):null;return this.handleTilingType(t,r,o,m,i,e,c,h)}if(s===D){const a=i.get("Shading"),r=i.getArray("Matrix"),n=this.parseShading({shading:a,resources:o,localColorSpaceCache:l,localShadingPatternCache:d});e.addOp(t,["Shading",n,r]);return}throw new r.FormatError(`Unknown PatternType: ${s}`)}}throw new r.FormatError(`Unknown PatternName: ${f}`)}_parseVisibilityExpression(e,t,a){if(++t>10){(0,r.warn)("Visibility expression is too deeply nested");return}const n=e.length,s=this.xref.fetchIfRef(e[0]);if(!(n<2)&&s instanceof i.Name){switch(s.name){case"And":case"Or":case"Not":a.push(s.name);break;default:(0,r.warn)(`Invalid operator ${s.name} in visibility expression`);return}for(let r=1;r0)return{type:"OCMD",expression:t}}const t=a.get("OCGs");if(Array.isArray(t)||t instanceof i.Dict){const e=[];if(Array.isArray(t))for(const a of t)e.push(a.toString());else e.push(t.objId);return{type:n,ids:e,policy:a.get("P")instanceof i.Name?a.get("P").name:null,expression:null}}if(t instanceof i.Ref)return{type:n,id:t.toString()}}return null}getOperatorList({stream:e,task:t,resources:a,operatorList:n,initialState:s=null,fallbackFontDict:o=null}){a=a||i.Dict.empty;s=s||new EvalState;if(!n)throw new Error('getOperatorList: missing "operatorList" parameter');const c=this,l=this.xref;let h=!1;const u=new m.LocalImageCache,d=new m.LocalColorSpaceCache,f=new m.LocalGStateCache,g=new m.LocalTilingPatternCache,p=new Map,b=a.get("XObject")||i.Dict.empty,w=a.get("Pattern")||i.Dict.empty,x=new StateManager(s),k=new EvaluatorPreprocessor(e,l,x),C=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=k.savedStatesDepth;e0&&n.addOp(r.OPS.setGState,[t]);e=null;continue}}next(new Promise((function(e,s){if(!E)throw new r.FormatError("GState must be referred to by name.");const o=a.get("ExtGState");if(!(o instanceof i.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const l=o.get(M);if(!(l instanceof i.Dict))throw new r.FormatError("GState should be a dictionary.");c.setGState({resources:a,gState:l,operatorList:n,cacheKey:M,task:t,stateManager:x,localGStateCache:f,localColorSpaceCache:d}).then(e,s)})).catch((function(e){if(!(e instanceof r.AbortException)){if(!c.options.ignoreErrors)throw e;c.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorExtGState});(0,r.warn)(`getOperatorList - ignoring ExtGState: "${e}".`)}})));return;case r.OPS.moveTo:case r.OPS.lineTo:case r.OPS.curveTo:case r.OPS.curveTo2:case r.OPS.curveTo3:case r.OPS.closePath:case r.OPS.rectangle:c.buildPath(n,s,e,h);continue;case r.OPS.markPoint:case r.OPS.markPointProps:case r.OPS.beginCompat:case r.OPS.endCompat:continue;case r.OPS.beginMarkedContentProps:if(!(e[0]instanceof i.Name)){(0,r.warn)(`Expected name for beginMarkedContentProps arg0=${e[0]}`);continue}if("OC"===e[0].name){next(c.parseMarkedContentProps(e[1],a).then((e=>{n.addOp(r.OPS.beginMarkedContentProps,["OC",e])})).catch((e=>{if(!(e instanceof r.AbortException)){if(!c.options.ignoreErrors)throw e;c.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorMarkedContent});(0,r.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`)}})));return}e=[e[0].name,e[1]instanceof i.Dict?e[1].get("MCID"):null];break;case r.OPS.beginMarkedContent:case r.OPS.endMarkedContent:default:if(null!==e){for(F=0,O=e.length;F{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorOperatorList});(0,r.warn)(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`);closePendingRestoreOPS()}}))}getTextContent({stream:e,task:t,resources:a,stateManager:n=null,combineTextItems:s=!1,includeMarkedContent:o=!1,sink:c,seenStyles:l=new Set,viewBox:u}){a=a||i.Dict.empty;n=n||new StateManager(new TextState);const d=(0,h.getNormalizedUnicodes)(),f={items:[],styles:Object.create(null)},g={initialized:!1,str:[],totalWidth:0,totalHeight:0,width:0,height:0,vertical:!1,prevTransform:null,textAdvanceScale:0,spaceInFlowMin:0,spaceInFlowMax:0,trackingSpaceMin:1/0,negativeSpaceMax:-1/0,notASpace:-1/0,transform:null,fontName:null,hasEOL:!1},p=[" "," "];let b=0;function saveLastChar(e){const t=(b+1)%2,a=" "!==p[b]&&" "===p[t];p[b]=e;b=t;return a}function resetLastChars(){p[0]=p[1]=" ";b=0}const S=this,x=this.xref,k=[];let C=null;const v=new m.LocalImageCache,F=new m.LocalGStateCache,O=new EvaluatorPreprocessor(e,x,n);let T;function getCurrentTextTransform(){const e=T.font,t=[T.fontSize*T.textHScale,0,0,T.fontSize,0,T.textRise];if(e.isType3Font&&(T.fontSize<=1||e.isCharBBox)&&!(0,r.isArrayEqual)(T.fontMatrix,r.FONT_IDENTITY_MATRIX)){const a=e.bbox[3]-e.bbox[1];a>0&&(t[3]*=a*T.fontMatrix[3])}return r.Util.transform(T.ctm,r.Util.transform(T.textMatrix,t))}function ensureTextContentItem(){if(g.initialized)return g;const e=T.font,t=e.loadedName;if(!l.has(t)){l.add(t);f.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical}}g.fontName=t;const a=g.transform=getCurrentTextTransform();if(e.vertical){g.width=g.totalWidth=Math.hypot(a[0],a[1]);g.height=g.totalHeight=0;g.vertical=!0}else{g.width=g.totalWidth=0;g.height=g.totalHeight=Math.hypot(a[2],a[3]);g.vertical=!1}const r=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),n=Math.hypot(T.ctm[0],T.ctm[1]);g.textAdvanceScale=n*r;g.trackingSpaceMin=.1*T.fontSize;g.notASpace=.03*T.fontSize;g.negativeSpaceMax=-.2*T.fontSize;g.spaceInFlowMin=.1*T.fontSize;g.spaceInFlowMax=.6*T.fontSize;g.hasEOL=!1;g.initialized=!0;return g}function updateAdvanceScale(){if(!g.initialized)return;const e=Math.hypot(T.textLineMatrix[0],T.textLineMatrix[1]),t=Math.hypot(T.ctm[0],T.ctm[1])*e;if(t!==g.textAdvanceScale){if(g.vertical){g.totalHeight+=g.height*g.textAdvanceScale;g.height=0}else{g.totalWidth+=g.width*g.textAdvanceScale;g.width=0}g.textAdvanceScale=t}}function handleSetFont(e,n){return S.loadFont(e,n,a).then((function(e){return e.font.isType3Font?e.loadType3Data(S,a,t).catch((function(){})).then((function(){return e})):e})).then((function(e){T.font=e.font;T.fontMatrix=e.font.fontMatrix||r.FONT_IDENTITY_MATRIX}))}function applyInverseRotation(e,t,a){const r=Math.hypot(a[0],a[1]);return[(a[0]*e+a[1]*t)/r,(a[2]*e+a[3]*t)/r]}function compareWithLastPosition(){const e=getCurrentTextTransform();let t=e[4],a=e[5];const r=t-u[0],n=a-u[1];if(r<0||r>u[2]||n<0||n>u[3])return!1;if(!s||!T.font||!g.prevTransform)return!0;let i=g.prevTransform[4],o=g.prevTransform[5];if(i===t&&o===a)return!0;let c=-1;e[0]&&0===e[1]&&0===e[2]?c=e[0]>0?0:180:e[1]&&0===e[0]&&0===e[3]&&(c=e[1]>0?90:270);switch(c){case 0:break;case 90:[t,a]=[a,t];[i,o]=[o,i];break;case 180:[t,a,i,o]=[-t,-a,-i,-o];break;case 270:[t,a]=[-a,-t];[i,o]=[-o,-i];break;default:[t,a]=applyInverseRotation(t,a,e);[i,o]=applyInverseRotation(i,o,g.prevTransform)}if(T.font.vertical){const e=(o-a)/g.textAdvanceScale,r=t-i,n=Math.sign(g.height);if(e.5*g.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(r)>g.width){appendEOL();return!0}e<=n*g.notASpace&&resetLastChars();if(e<=n*g.trackingSpaceMin)g.height+=e;else if(!addFakeSpaces(e,g.prevTransform,n))if(0===g.str.length){resetLastChars();f.items.push({str:" ",dir:"ltr",width:0,height:Math.abs(e),transform:g.prevTransform,fontName:g.fontName,hasEOL:!1})}else g.height+=e;return!0}const l=(t-i)/g.textAdvanceScale,h=a-o,d=Math.sign(g.width);if(l.5*g.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(h)>g.height){appendEOL();return!0}l<=d*g.notASpace&&resetLastChars();if(l<=d*g.trackingSpaceMin)g.width+=l;else if(!addFakeSpaces(l,g.prevTransform,d))if(0===g.str.length){resetLastChars();f.items.push({str:" ",dir:"ltr",width:Math.abs(l),height:0,transform:g.prevTransform,fontName:g.fontName,hasEOL:!1})}else g.width+=l;return!0}function buildTextContentItem({chars:e,extraSpacing:t}){const a=T.font;if(!e){const e=T.charSpacing+t;e&&(a.vertical?T.translateTextMatrix(0,-e):T.translateTextMatrix(e*T.textHScale,0));return}const r=a.charsToGlyphs(e),n=T.fontMatrix[0]*T.fontSize;for(let e=0,i=r.length;e0){const e=k.join("");k.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case r.OPS.showText:if(!n.state.font){S.ensureStateFont(n.state);continue}buildTextContentItem({chars:p[0],extraSpacing:0});break;case r.OPS.nextLineShowText:if(!n.state.font){S.ensureStateFont(n.state);continue}T.carriageReturn();buildTextContentItem({chars:p[0],extraSpacing:0});break;case r.OPS.nextLineSetSpacingShowText:if(!n.state.font){S.ensureStateFont(n.state);continue}T.wordSpacing=p[0];T.charSpacing=p[1];T.carriageReturn();buildTextContentItem({chars:p[2],extraSpacing:0});break;case r.OPS.paintXObject:flushTextContentItem();C||(C=a.get("XObject")||i.Dict.empty);var w=p[0]instanceof i.Name,E=p[0].name;if(w&&v.getByName(E))break;next(new Promise((function(e,h){if(!w)throw new r.FormatError("XObject must be referred to by name.");let d=C.getRaw(E);if(d instanceof i.Ref){if(v.getByRef(d)){e();return}if(S.globalImageCache.getData(d,S.pageIndex)){e();return}d=x.fetch(d)}if(!(d instanceof y.BaseStream))throw new r.FormatError("XObject should be a stream");const f=d.dict.get("Subtype");if(!(f instanceof i.Name))throw new r.FormatError("XObject should have a Name subtype");if("Form"!==f.name){v.set(E,d.dict.objId,!0);e();return}const g=n.state.clone(),p=new StateManager(g),m=d.dict.getArray("Matrix");Array.isArray(m)&&6===m.length&&p.transform(m);enqueueChunk();const b={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;c.enqueue(e,t)},get desiredSize(){return c.desiredSize},get ready(){return c.ready}};S.getTextContent({stream:d,task:t,resources:d.dict.get("Resources")||a,stateManager:p,combineTextItems:s,includeMarkedContent:o,sink:b,seenStyles:l,viewBox:u}).then((function(){b.enqueueInvoked||v.set(E,d.dict.objId,!0);e()}),h)})).catch((function(e){if(!(e instanceof r.AbortException)){if(!S.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring XObject: "${e}".`)}})));return;case r.OPS.setGState:w=p[0]instanceof i.Name;E=p[0].name;if(w&&F.getByName(E))break;next(new Promise((function(e,t){if(!w)throw new r.FormatError("GState must be referred to by name.");const n=a.get("ExtGState");if(!(n instanceof i.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const s=n.get(E);if(!(s instanceof i.Dict))throw new r.FormatError("GState should be a dictionary.");const o=s.get("Font");if(o){flushTextContentItem();T.fontName=null;T.fontSize=o[1];handleSetFont(null,o[0]).then(e,t)}else{F.set(E,s.objId,!0);e()}})).catch((function(e){if(!(e instanceof r.AbortException)){if(!S.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring ExtGState: "${e}".`)}})));return;case r.OPS.beginMarkedContent:flushTextContentItem();o&&f.items.push({type:"beginMarkedContent",tag:p[0]instanceof i.Name?p[0].name:null});break;case r.OPS.beginMarkedContentProps:flushTextContentItem();if(o){let e=null;p[1]instanceof i.Dict&&(e=p[1].get("MCID"));f.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${S.idFactory.getPageObjId()}_mcid${e}`:null,tag:p[0]instanceof i.Name?p[0].name:null})}break;case r.OPS.endMarkedContent:flushTextContentItem();o&&f.items.push({type:"endMarkedContent"})}if(f.items.length>=c.desiredSize){g=!0;break}}if(g)next(N);else{flushTextContentItem();enqueueChunk();e()}})).catch((e=>{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring errors during "${t.name}" task: "${e}".`);flushTextContentItem();enqueueChunk()}}))}extractDataStructures(e,t,a){const n=this.xref;let s;const l=this.readToUnicode(a.toUnicode||e.get("ToUnicode")||t.get("ToUnicode"));if(a.composite){const t=e.get("CIDSystemInfo");t instanceof i.Dict&&(a.cidSystemInfo={registry:(0,r.stringToPDFString)(t.get("Registry")),ordering:(0,r.stringToPDFString)(t.get("Ordering")),supplement:t.get("Supplement")});try{const t=e.get("CIDToGIDMap");t instanceof y.BaseStream&&(s=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const h=[];let u,d=null;if(e.has("Encoding")){u=e.get("Encoding");if(u instanceof i.Dict){d=u.get("BaseEncoding");d=d instanceof i.Name?d.name:null;if(u.has("Differences")){const e=u.get("Differences");let t=0;for(let a=0,s=e.length;a0;a.dict=e;return l.then((e=>{a.toUnicode=e;return this.buildToUnicode(a)})).then((e=>{a.toUnicode=e;s&&(a.cidToGidMap=this.readCidToGidMap(s,e));return a}))}_simpleFontToUnicode(e,t=!1){(0,r.assert)(!e.composite,"Must be a simple font.");const a=[],n=e.defaultEncoding.slice(),i=e.baseEncodingName,s=e.differences;for(const e in s){const t=s[e];".notdef"!==t&&(n[e]=t)}const o=(0,k.getGlyphsUnicode)();for(const r in n){let s=n[r];if(""!==s)if(void 0!==o[s])a[r]=String.fromCharCode(o[s]);else{let n=0;switch(s[0]){case"G":3===s.length&&(n=parseInt(s.substring(1),16));break;case"g":5===s.length&&(n=parseInt(s.substring(1),16));break;case"C":case"c":if(s.length>=3&&s.length<=4){const a=s.substring(1);if(t){n=parseInt(a,16);break}n=+a;if(Number.isNaN(n)&&Number.isInteger(parseInt(a,16)))return this._simpleFontToUnicode(e,!0)}break;default:const a=(0,h.getUnicodeForGlyph)(s,o);-1!==a&&(n=a)}if(n>0&&n<=1114111&&Number.isInteger(n)){if(i&&n===+r){const e=(0,c.getEncoding)(i);if(e&&(s=e[r])){a[r]=String.fromCharCode(o[s]);continue}}a[r]=String.fromCodePoint(n)}}}return a}async buildToUnicode(e){e.hasIncludedToUnicodeMap=!!e.toUnicode&&e.toUnicode.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._simpleFontToUnicode(e));return e.toUnicode}if(!e.composite)return new f.ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof n.IdentityCMap)||"Adobe"===e.cidSystemInfo.registry&&("GB1"===e.cidSystemInfo.ordering||"CNS1"===e.cidSystemInfo.ordering||"Japan1"===e.cidSystemInfo.ordering||"Korea1"===e.cidSystemInfo.ordering))){const{registry:t,ordering:a}=e.cidSystemInfo,s=i.Name.get(`${t}-${a}-UCS2`),o=await n.CMapFactory.create({encoding:s,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),c=[];e.cMap.forEach((function(e,t){if(t>65535)throw new r.FormatError("Max size of CID is 65,535");const a=o.lookup(t);a&&(c[e]=String.fromCharCode((a.charCodeAt(0)<<8)+a.charCodeAt(1)))}));return new f.ToUnicodeMap(c)}return new f.IdentityToUnicodeMap(e.firstChar,e.lastChar)}readToUnicode(e){return e?e instanceof i.Name?n.CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}).then((function(e){return e instanceof n.IdentityCMap?new f.IdentityToUnicodeMap(0,65535):new f.ToUnicodeMap(e.getMap())})):e instanceof y.BaseStream?n.CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}).then((function(e){if(e instanceof n.IdentityCMap)return new f.IdentityToUnicodeMap(0,65535);const t=new Array(e.length);e.forEach((function(e,a){if("number"==typeof a){t[e]=String.fromCodePoint(a);return}const r=[];for(let e=0;e{if(e instanceof r.AbortException)return null;if(this.options.ignoreErrors){this.handler.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontToUnicode});(0,r.warn)(`readToUnicode - ignoring ToUnicode data: "${e}".`);return null}throw e})):Promise.resolve(null):Promise.resolve(null)}readCidToGidMap(e,t){const a=[];for(let r=0,n=e.length;r>1;(0!==n||t.has(i))&&(a[i]=n)}return a}extractWidths(e,t,a){const r=this.xref;let n=[],s=0;const c=[];let l,h,u,d,f,g,p,m;if(a.composite){s=e.has("DW")?e.get("DW"):1e3;m=e.get("W");if(m)for(h=0,u=m.length;h{if(p){const e=[];let a=u;for(let t=0,r=p.length;t{this.extractWidths(t,e,a);return new s.Font(v.name,w,a)}))}static buildFontPaths(e,t,a,n){function buildPath(t){const i=`${e.loadedName}_path_${t}`;try{if(e.renderer.hasBuiltPath(t))return;a.send("commonobj",[i,"FontPath",e.renderer.getPathJs(t)])}catch(e){if(n.ignoreErrors){a.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.errorFontBuildPath});(0,r.warn)(`buildFontPaths - ignoring ${i} glyph: "${e}".`);return}throw e}}for(const e of t){buildPath(e.fontChar);const t=e.accent;t&&t.fontChar&&buildPath(t.fontChar)}}static get fallbackFontDict(){const e=new i.Dict;e.set("BaseFont",i.Name.get("PDFJS-FallbackFont"));e.set("Type",i.Name.get("FallbackType"));e.set("Subtype",i.Name.get("FallbackType"));e.set("Encoding",i.Name.get("WinAnsiEncoding"));return(0,r.shadow)(this,"fallbackFontDict",e)}}t.PartialEvaluator=PartialEvaluator;class TranslatedFont{constructor({loadedName:e,font:t,dict:a,evaluatorOptions:r}){this.loadedName=e;this.font=t;this.dict=a;this._evaluatorOptions=r||M;this.type3Loaded=null;this.type3Dependencies=t.isType3Font?new Set:null;this.sent=!1}send(e){if(!this.sent){this.sent=!0;e.send("commonobj",[this.loadedName,"Font",this.font.exportData(this._evaluatorOptions.fontExtraProperties)])}}fallback(e){if(this.font.data){this.font.disableFontFace=!0;PartialEvaluator.buildFontPaths(this.font,this.font.glyphCacheValues,e,this._evaluatorOptions)}}loadType3Data(e,t,a){if(this.type3Loaded)return this.type3Loaded;if(!this.font.isType3Font)throw new Error("Must be a Type3 font.");const n=e.clone({ignoreErrors:!1});n.parsingType3Font=!0;const s=new i.RefSet(e.type3FontRefs);this.dict.objId&&!s.has(this.dict.objId)&&s.put(this.dict.objId);n.type3FontRefs=s;const o=this.font,c=this.type3Dependencies;let l=Promise.resolve();const h=this.dict.get("CharProcs"),u=this.dict.get("Resources")||t,d=Object.create(null),f=r.Util.normalizeRect(o.bbox||[0,0,0,0]),g=f[2]-f[0],p=f[3]-f[1],m=Math.hypot(g,p);for(const e of h.getKeys())l=l.then((()=>{const t=h.get(e),i=new O.OperatorList;return n.getOperatorList({stream:t,task:a,resources:u,operatorList:i}).then((()=>{i.fnArray[0]===r.OPS.setCharWidthAndBounds&&this._removeType3ColorOperators(i,m);d[e]=i.getIR();for(const e of i.dependencies)c.add(e)})).catch((function(t){(0,r.warn)(`Type3 font resource "${e}" is not available.`);const a=new O.OperatorList;d[e]=a.getIR()}))}));this.type3Loaded=l.then((()=>{o.charProcOperatorList=d;if(this._bbox){o.isCharBBox=!0;o.bbox=this._bbox}}));return this.type3Loaded}_removeType3ColorOperators(e,t=NaN){const a=r.Util.normalizeRect(e.argsArray[0].slice(2)),n=a[2]-a[0],i=a[3]-a[1],s=Math.hypot(n,i);if(0===n||0===i){e.fnArray.splice(0,1);e.argsArray.splice(0,1)}else if(0===t||Math.round(s/t)>=10){this._bbox||(this._bbox=[1/0,1/0,-1/0,-1/0]);this._bbox[0]=Math.min(this._bbox[0],a[0]);this._bbox[1]=Math.min(this._bbox[1],a[1]);this._bbox[2]=Math.max(this._bbox[2],a[2]);this._bbox[3]=Math.max(this._bbox[3],a[3])}let o=0,c=e.length;for(;o=r.OPS.moveTo&&s<=r.OPS.endPath;if(i.variableArgs)c>o&&(0,r.info)(`Command ${n}: expected [0, ${o}] args, but received ${c} args.`);else{if(c!==o){const e=this.nonProcessedArgs;for(;c>o;){e.push(t.shift());c--}for(;cEvaluatorPreprocessor.MAX_INVALID_PATH_OPS)throw new r.FormatError(`Invalid ${e}`);(0,r.warn)(`Skipping ${e}`);null!==t&&(t.length=0);continue}}this.preprocessCommand(s,t);e.fn=s;e.args=t;return!0}if(a===i.EOF)return!1;if(null!==a){null===t&&(t=[]);t.push(a);if(t.length>33)throw new r.FormatError("Too many arguments")}}}preprocessCommand(e,t){switch(0|e){case r.OPS.save:this.stateManager.save();break;case r.OPS.restore:this.stateManager.restore();break;case r.OPS.transform:this.stateManager.transform(t)}}}t.EvaluatorPreprocessor=EvaluatorPreprocessor},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.IdentityCMap=t.CMapFactory=t.CMap=void 0;var r=a(2),n=a(5),i=a(7),s=a(17),o=a(6),c=a(10);const l=["Adobe-GB1-UCS2","Adobe-CNS1-UCS2","Adobe-Japan1-UCS2","Adobe-Korea1-UCS2","78-EUC-H","78-EUC-V","78-H","78-RKSJ-H","78-RKSJ-V","78-V","78ms-RKSJ-H","78ms-RKSJ-V","83pv-RKSJ-H","90ms-RKSJ-H","90ms-RKSJ-V","90msp-RKSJ-H","90msp-RKSJ-V","90pv-RKSJ-H","90pv-RKSJ-V","Add-H","Add-RKSJ-H","Add-RKSJ-V","Add-V","Adobe-CNS1-0","Adobe-CNS1-1","Adobe-CNS1-2","Adobe-CNS1-3","Adobe-CNS1-4","Adobe-CNS1-5","Adobe-CNS1-6","Adobe-GB1-0","Adobe-GB1-1","Adobe-GB1-2","Adobe-GB1-3","Adobe-GB1-4","Adobe-GB1-5","Adobe-Japan1-0","Adobe-Japan1-1","Adobe-Japan1-2","Adobe-Japan1-3","Adobe-Japan1-4","Adobe-Japan1-5","Adobe-Japan1-6","Adobe-Korea1-0","Adobe-Korea1-1","Adobe-Korea1-2","B5-H","B5-V","B5pc-H","B5pc-V","CNS-EUC-H","CNS-EUC-V","CNS1-H","CNS1-V","CNS2-H","CNS2-V","ETHK-B5-H","ETHK-B5-V","ETen-B5-H","ETen-B5-V","ETenms-B5-H","ETenms-B5-V","EUC-H","EUC-V","Ext-H","Ext-RKSJ-H","Ext-RKSJ-V","Ext-V","GB-EUC-H","GB-EUC-V","GB-H","GB-V","GBK-EUC-H","GBK-EUC-V","GBK2K-H","GBK2K-V","GBKp-EUC-H","GBKp-EUC-V","GBT-EUC-H","GBT-EUC-V","GBT-H","GBT-V","GBTpc-EUC-H","GBTpc-EUC-V","GBpc-EUC-H","GBpc-EUC-V","H","HKdla-B5-H","HKdla-B5-V","HKdlb-B5-H","HKdlb-B5-V","HKgccs-B5-H","HKgccs-B5-V","HKm314-B5-H","HKm314-B5-V","HKm471-B5-H","HKm471-B5-V","HKscs-B5-H","HKscs-B5-V","Hankaku","Hiragana","KSC-EUC-H","KSC-EUC-V","KSC-H","KSC-Johab-H","KSC-Johab-V","KSC-V","KSCms-UHC-H","KSCms-UHC-HW-H","KSCms-UHC-HW-V","KSCms-UHC-V","KSCpc-EUC-H","KSCpc-EUC-V","Katakana","NWP-H","NWP-V","RKSJ-H","RKSJ-V","Roman","UniCNS-UCS2-H","UniCNS-UCS2-V","UniCNS-UTF16-H","UniCNS-UTF16-V","UniCNS-UTF32-H","UniCNS-UTF32-V","UniCNS-UTF8-H","UniCNS-UTF8-V","UniGB-UCS2-H","UniGB-UCS2-V","UniGB-UTF16-H","UniGB-UTF16-V","UniGB-UTF32-H","UniGB-UTF32-V","UniGB-UTF8-H","UniGB-UTF8-V","UniJIS-UCS2-H","UniJIS-UCS2-HW-H","UniJIS-UCS2-HW-V","UniJIS-UCS2-V","UniJIS-UTF16-H","UniJIS-UTF16-V","UniJIS-UTF32-H","UniJIS-UTF32-V","UniJIS-UTF8-H","UniJIS-UTF8-V","UniJIS2004-UTF16-H","UniJIS2004-UTF16-V","UniJIS2004-UTF32-H","UniJIS2004-UTF32-V","UniJIS2004-UTF8-H","UniJIS2004-UTF8-V","UniJISPro-UCS2-HW-V","UniJISPro-UCS2-V","UniJISPro-UTF8-V","UniJISX0213-UTF32-H","UniJISX0213-UTF32-V","UniJISX02132004-UTF32-H","UniJISX02132004-UTF32-V","UniKS-UCS2-H","UniKS-UCS2-V","UniKS-UTF16-H","UniKS-UTF16-V","UniKS-UTF32-H","UniKS-UTF32-V","UniKS-UTF8-H","UniKS-UTF8-V","V","WP-Symbol"],h=2**24-1;class CMap{constructor(e=!1){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.name="";this.vertical=!1;this.useCMap=null;this.builtInCMap=e}addCodespaceRange(e,t,a){this.codespaceRanges[e-1].push(t,a);this.numCodespaceRanges++}mapCidRange(e,t,a){if(t-e>h)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=a++}mapBfRange(e,t,a){if(t-e>h)throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");const r=a.length-1;for(;e<=t;){this._map[e++]=a;const t=a.charCodeAt(r)+1;t>255?a=a.substring(0,r-1)+String.fromCharCode(a.charCodeAt(r-1)+1)+"\0":a=a.substring(0,r)+String.fromCharCode(t)}}mapBfRangeToArray(e,t,a){if(t-e>h)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const r=a.length;let n=0;for(;e<=t&&n>>0;const s=n[i];for(let e=0,t=s.length;e=t&&r<=n){a.charcode=r;a.length=i+1;return}}}a.charcode=0;a.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let a=0,r=t.length;a=n&&e<=i)return a+1}}return 1}get length(){return this._map.length}get isIdentityCMap(){if("Identity-H"!==this.name&&"Identity-V"!==this.name)return!1;if(65536!==this._map.length)return!1;for(let e=0;e<65536;e++)if(this._map[e]!==e)return!1;return!0}}t.CMap=CMap;class IdentityCMap extends CMap{constructor(e,t){super();this.vertical=e;this.addCodespaceRange(t,0,65535)}mapCidRange(e,t,a){(0,r.unreachable)("should not call mapCidRange")}mapBfRange(e,t,a){(0,r.unreachable)("should not call mapBfRange")}mapBfRangeToArray(e,t,a){(0,r.unreachable)("should not call mapBfRangeToArray")}mapOne(e,t){(0,r.unreachable)("should not call mapCidOne")}lookup(e){return Number.isInteger(e)&&e<=65535?e:void 0}contains(e){return Number.isInteger(e)&&e<=65535}forEach(e){for(let t=0;t<=65535;t++)e(t,t)}charCodeOf(e){return Number.isInteger(e)&&e<=65535?e:-1}getMap(){const e=new Array(65536);for(let t=0;t<=65535;t++)e[t]=t;return e}get length(){return 65536}get isIdentityCMap(){(0,r.unreachable)("should not access .isIdentityCMap")}}t.IdentityCMap=IdentityCMap;const u=function BinaryCMapReaderClosure(){function hexToInt(e,t){let a=0;for(let r=0;r<=t;r++)a=a<<8|e[r];return a>>>0}function hexToStr(e,t){return 1===t?String.fromCharCode(e[0],e[1]):3===t?String.fromCharCode(e[0],e[1],e[2],e[3]):String.fromCharCode.apply(null,e.subarray(0,t+1))}function addHex(e,t,a){let r=0;for(let n=a;n>=0;n--){r+=e[n]+t[n];e[n]=255&r;r>>=8}}function incHex(e,t){let a=1;for(let r=t;r>=0&&a>0;r--){a+=e[r];e[r]=255&a;a>>=8}}const e=16;class BinaryCMapStream{constructor(e){this.buffer=e;this.pos=0;this.end=e.length;this.tmpBuf=new Uint8Array(19)}readByte(){return this.pos>=this.end?-1:this.buffer[this.pos++]}readNumber(){let e,t=0;do{const a=this.readByte();if(a<0)throw new r.FormatError("unexpected EOF in bcmap");e=!(128&a);t=t<<7|127&a}while(!e);return t}readSigned(){const e=this.readNumber();return 1&e?~(e>>>1):e>>>1}readHex(e,t){e.set(this.buffer.subarray(this.pos,this.pos+t+1));this.pos+=t+1}readHexNumber(e,t){let a;const n=this.tmpBuf;let i=0;do{const e=this.readByte();if(e<0)throw new r.FormatError("unexpected EOF in bcmap");a=!(128&e);n[i++]=127&e}while(!a);let s=t,o=0,c=0;for(;s>=0;){for(;c<8&&n.length>0;){o|=n[--i]<>=8;c-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const a=1&e[t]?255:0;let r=0;for(let n=0;n<=t;n++){r=(1&r)<<8|e[n];e[n]=r>>1^a}}readString(){const e=this.readNumber();let t="";for(let a=0;a=0;){const t=f>>5;if(7===t){switch(31&f){case 0:n.readString();break;case 1:s=n.readString()}continue}const r=!!(16&f),i=15&f;if(i+1>e)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const g=1,p=n.readNumber();switch(t){case 0:n.readHex(o,i);n.readHexNumber(c,i);addHex(c,o,i);a.addCodespaceRange(i+1,hexToInt(o,i),hexToInt(c,i));for(let e=1;e>>0}function expectString(e){if("string"!=typeof e)throw new r.FormatError("Malformed CMap: expected string.")}function expectInt(e){if(!Number.isInteger(e))throw new r.FormatError("Malformed CMap: expected int.")}function parseBfChar(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endbfchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=a;e.mapOne(r,i)}}function parseBfRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endbfrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=strToInt(a);a=t.getObj();if(Number.isInteger(a)||"string"==typeof a){const t=Number.isInteger(a)?String.fromCharCode(a):a;e.mapBfRange(r,i,t)}else{if(!(0,n.isCmd)(a,"["))break;{a=t.getObj();const s=[];for(;!(0,n.isCmd)(a,"]")&&a!==n.EOF;){s.push(a);a=t.getObj()}e.mapBfRangeToArray(r,i,s)}}}throw new r.FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcidchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectInt(a);const i=a;e.mapOne(r,i)}}function parseCidRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcidrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const i=strToInt(a);a=t.getObj();expectInt(a);const s=a;e.mapCidRange(r,i,s)}}function parseCodespaceRange(e,t){for(;;){let a=t.getObj();if(a===n.EOF)break;if((0,n.isCmd)(a,"endcodespacerange"))return;if("string"!=typeof a)break;const r=strToInt(a);a=t.getObj();if("string"!=typeof a)break;const i=strToInt(a);e.addCodespaceRange(a.length,r,i)}throw new r.FormatError("Invalid codespace range.")}function parseWMode(e,t){const a=t.getObj();Number.isInteger(a)&&(e.vertical=!!a)}function parseCMapName(e,t){const a=t.getObj();a instanceof n.Name&&(e.name=a.name)}async function parseCMap(e,t,a,i){let s,c;e:for(;;)try{const a=t.getObj();if(a===n.EOF)break;if(a instanceof n.Name){"WMode"===a.name?parseWMode(e,t):"CMapName"===a.name&&parseCMapName(e,t);s=a}else if(a instanceof n.Cmd)switch(a.cmd){case"endcmap":break e;case"usecmap":s instanceof n.Name&&(c=s.name);break;case"begincodespacerange":parseCodespaceRange(e,t);break;case"beginbfchar":parseBfChar(e,t);break;case"begincidchar":parseCidChar(e,t);break;case"beginbfrange":parseBfRange(e,t);break;case"begincidrange":parseCidRange(e,t)}}catch(e){if(e instanceof o.MissingDataException)throw e;(0,r.warn)("Invalid cMap data: "+e);continue}!i&&c&&(i=c);return i?extendCMap(e,a,i):e}async function extendCMap(e,t,a){e.useCMap=await createBuiltInCMap(a,t);if(0===e.numCodespaceRanges){const t=e.useCMap.codespaceRanges;for(let a=0;aextendCMap(i,t,e)));if(n===r.CMapCompressionType.NONE){const e=new s.Lexer(new c.Stream(a));return parseCMap(i,e,t,null)}throw new Error("TODO: Only BINARY/NONE CMap compression is currently supported.")}return{async create(e){const t=e.encoding,a=e.fetchBuiltInCMap,r=e.useCMap;if(t instanceof n.Name)return createBuiltInCMap(t.name,a);if(t instanceof i.BaseStream){const e=await parseCMap(new CMap,new s.Lexer(t),a,r);return e.isIdentityCMap?createBuiltInCMap(e.name,a):e}throw new Error("Encoding required.")}}}();t.CMapFactory=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Parser=t.Linearization=t.Lexer=void 0;var r=a(2),n=a(5),i=a(6),s=a(18),o=a(20),c=a(21),l=a(23),h=a(24),u=a(27),d=a(29),f=a(31),g=a(10),p=a(32),m=a(33);function computeAdler32(e){const t=e.length;let a=1,r=0;for(let n=0;n>")&&this.buf1!==n.EOF;){if(!(this.buf1 instanceof n.Name)){(0,r.info)("Malformed dictionary: key must be a name object");this.shift();continue}const t=this.buf1.name;this.shift();if(this.buf1===n.EOF)break;s.set(t,this.getObj(e))}if(this.buf1===n.EOF){if(this.recoveryMode)return s;throw new i.ParserEOFException("End of file inside dictionary.")}if((0,n.isCmd)(this.buf2,"stream"))return this.allowStreams?this.makeStream(s,e):s;this.shift();return s;default:return t}if(Number.isInteger(t)){if(Number.isInteger(this.buf1)&&(0,n.isCmd)(this.buf2,"R")){const e=n.Ref.get(t,this.buf1);this.shift();this.shift();return e}return t}return"string"==typeof t&&e?e.decryptString(t):t}findDefaultInlineStreamEnd(e){const t=this.lexer,a=e.pos;let s,o,c=0;for(;-1!==(s=e.getByte());)if(0===c)c=69===s?1:0;else if(1===c)c=73===s?2:0;else{(0,r.assert)(2===c,"findDefaultInlineStreamEnd - invalid state.");if(32===s||10===s||13===s){o=e.pos;const a=e.peekBytes(10);for(let e=0,t=a.length;e127))){c=0;break}}if(2!==c)continue;if(t.knownCommands){const e=t.peekObj();e instanceof n.Cmd&&!t.knownCommands[e.cmd]&&(c=0)}else(0,r.warn)("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");if(2===c)break}else c=0}if(-1===s){(0,r.warn)("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(o){(0,r.warn)('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-o))}}let l=4;e.skip(-l);s=e.peekByte();e.skip(l);(0,i.isWhiteSpace)(s)||l--;return e.pos-l-a}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let a,n,i=!1;for(;-1!==(a=e.getByte());)if(255===a){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:i=!0;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:n=e.getUint16();n>2?e.skip(n-2):e.skip(-2)}if(i)break}const s=e.pos-t;if(-1===a){(0,r.warn)("Inline DCTDecode image stream: EOI marker not found, searching for /EI/ instead.");e.skip(-s);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return s}findASCII85DecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte());)if(126===a){const t=e.pos;a=e.peekByte();for(;(0,i.isWhiteSpace)(a);){e.skip();a=e.peekByte()}if(62===a){e.skip();break}if(e.pos>t){const t=e.peekBytes(2);if(69===t[0]&&73===t[1])break}}const n=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte())&&62!==a;);const n=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-n);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return n}inlineStreamSkipEI(e){let t,a=0;for(;-1!==(t=e.getByte());)if(0===a)a=69===t?1:0;else if(1===a)a=73===t?2:0;else if(2===a)break}makeInlineImage(e){const t=this.lexer,a=t.stream,i=new n.Dict(this.xref);let s;for(;!(0,n.isCmd)(this.buf1,"ID")&&this.buf1!==n.EOF;){if(!(this.buf1 instanceof n.Name))throw new r.FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===n.EOF)break;i.set(t,this.getObj(e))}-1!==t.beginInlineImagePos&&(s=a.pos-t.beginInlineImagePos);const o=i.get("F","Filter");let c;if(o instanceof n.Name)c=o.name;else if(Array.isArray(o)){const e=this.xref.fetchIfRef(o[0]);e instanceof n.Name&&(c=e.name)}const l=a.pos;let h;switch(c){case"DCT":case"DCTDecode":h=this.findDCTDecodeInlineStreamEnd(a);break;case"A85":case"ASCII85Decode":h=this.findASCII85DecodeInlineStreamEnd(a);break;case"AHx":case"ASCIIHexDecode":h=this.findASCIIHexDecodeInlineStreamEnd(a);break;default:h=this.findDefaultInlineStreamEnd(a)}let u,d=a.makeSubStream(l,h,i);if(h<1e3&&s<5552){const e=d.getBytes();d.reset();const r=a.pos;a.pos=t.beginInlineImagePos;const i=a.getBytes(s);a.pos=r;u=computeAdler32(e)+"_"+computeAdler32(i);const o=this.imageCache[u];if(void 0!==o){this.buf2=n.Cmd.get("EI");this.shift();o.reset();return o}}e&&(d=e.createStream(d,h));d=this.filter(d,i,h);d.dict=i;if(void 0!==u){d.cacheKey=`inline_${h}_${u}`;this.imageCache[u]=d}this.buf2=n.Cmd.get("EI");this.shift();return d}_findStreamLength(e,t){const{stream:a}=this.lexer;a.pos=e;const r=t.length;for(;a.pos=r){a.pos+=s;return a.pos-e}s++}a.pos+=i}return-1}makeStream(e,t){const a=this.lexer;let s=a.stream;a.skipToNextLine();const o=s.pos-1;let c=e.get("Length");if(!Number.isInteger(c)){(0,r.info)(`Bad length "${c&&c.toString()}" in stream.`);c=0}s.pos=o+c;a.nextChar();if(this.tryShift()&&(0,n.isCmd)(this.buf2,"endstream"))this.shift();else{const e=new Uint8Array([101,110,100,115,116,114,101,97,109]);let t=this._findStreamLength(o,e);if(t<0){const a=1;for(let n=1;n<=a;n++){const a=e.length-n,c=e.slice(0,a),l=this._findStreamLength(o,c);if(l>=0){const e=s.peekBytes(a+1)[a];if(!(0,i.isWhiteSpace)(e))break;(0,r.info)(`Found "${(0,r.bytesToString)(c)}" when searching for endstream command.`);t=l;break}}if(t<0)throw new r.FormatError("Missing endstream command.")}c=t;a.nextChar();this.shift();this.shift()}this.shift();s=s.makeSubStream(o,c,e);t&&(s=t.createStream(s,c));s=this.filter(s,e,c);s.dict=e;return s}filter(e,t,a){let i=t.get("F","Filter"),s=t.get("DP","DecodeParms");if(i instanceof n.Name){Array.isArray(s)&&(0,r.warn)("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,i.name,a,s)}let o=a;if(Array.isArray(i)){const t=i,a=s;for(let c=0,l=t.length;c=48&&e<=57?15&e:e>=65&&e<=70||e>=97&&e<=102?9+(15&e):-1}class Lexer{constructor(e,t=null){this.stream=e;this.nextChar();this.strBuf=[];this.knownCommands=t;this._hexStringNumWarn=0;this.beginInlineImagePos=-1}nextChar(){return this.currentChar=this.stream.getByte()}peekChar(){return this.stream.peekByte()}getNumber(){let e=this.currentChar,t=!1,a=0,n=0;if(45===e){n=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else if(43===e){n=1;e=this.nextChar()}if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){a=10;e=this.nextChar()}if(e<48||e>57){if((0,i.isWhiteSpace)(e)||-1===e){if(10===a&&0===n){(0,r.warn)("Lexer.getNumber - treating a single decimal point as zero.");return 0}if(0===a&&-1===n){(0,r.warn)("Lexer.getNumber - treating a single minus sign as zero.");return 0}}throw new r.FormatError(`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`)}n=n||1;let s=e-48,o=0,c=1;for(;(e=this.nextChar())>=0;)if(e>=48&&e<=57){const r=e-48;if(t)o=10*o+r;else{0!==a&&(a*=10);s=10*s+r}}else if(46===e){if(0!==a)break;a=1}else if(45===e)(0,r.warn)("Badly formatted number: minus sign in the middle");else{if(69!==e&&101!==e)break;e=this.peekChar();if(43===e||45===e){c=45===e?-1:1;this.nextChar()}else if(e<48||e>57)break;t=!0}0!==a&&(s/=a);t&&(s*=10**(c*o));return n*s}getString(){let e=1,t=!1;const a=this.strBuf;a.length=0;let n=this.nextChar();for(;;){let i=!1;switch(0|n){case-1:(0,r.warn)("Unterminated string");t=!0;break;case 40:++e;a.push("(");break;case 41:if(0==--e){this.nextChar();t=!0}else a.push(")");break;case 92:n=this.nextChar();switch(n){case-1:(0,r.warn)("Unterminated string");t=!0;break;case 110:a.push("\n");break;case 114:a.push("\r");break;case 116:a.push("\t");break;case 98:a.push("\b");break;case 102:a.push("\f");break;case 92:case 40:case 41:a.push(String.fromCharCode(n));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&n;n=this.nextChar();i=!0;if(n>=48&&n<=55){e=(e<<3)+(15&n);n=this.nextChar();if(n>=48&&n<=55){i=!1;e=(e<<3)+(15&n)}}a.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:a.push(String.fromCharCode(n))}break;default:a.push(String.fromCharCode(n))}if(t)break;i||(n=this.nextChar())}return a.join("")}getName(){let e,t;const a=this.strBuf;a.length=0;for(;(e=this.nextChar())>=0&&!b[e];)if(35===e){e=this.nextChar();if(b[e]){(0,r.warn)("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");a.push("#");break}const n=toHexDigit(e);if(-1!==n){t=e;e=this.nextChar();const i=toHexDigit(e);if(-1===i){(0,r.warn)(`Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`);a.push("#",String.fromCharCode(t));if(b[e])break;a.push(String.fromCharCode(e));continue}a.push(String.fromCharCode(n<<4|i))}else a.push("#",String.fromCharCode(e))}else a.push(String.fromCharCode(e));a.length>127&&(0,r.warn)(`Name token is longer than allowed by the spec: ${a.length}`);return n.Name.get(a.join(""))}_hexStringWarn(e){5!=this._hexStringNumWarn++?this._hexStringNumWarn>5||(0,r.warn)(`getHexString - ignoring invalid character: ${e}`):(0,r.warn)("getHexString - ignoring additional invalid characters.")}getHexString(){const e=this.strBuf;e.length=0;let t,a,n=this.currentChar,i=!0;this._hexStringNumWarn=0;for(;;){if(n<0){(0,r.warn)("Unterminated hex string");break}if(62===n){this.nextChar();break}if(1!==b[n]){if(i){t=toHexDigit(n);if(-1===t){this._hexStringWarn(n);n=this.nextChar();continue}}else{a=toHexDigit(n);if(-1===a){this._hexStringWarn(n);n=this.nextChar();continue}e.push(String.fromCharCode(t<<4|a))}i=!i;n=this.nextChar()}else n=this.nextChar()}return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return n.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(1!==b[t])break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return n.Cmd.get("[");case 93:this.nextChar();return n.Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return n.Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return n.Cmd.get(">>")}return n.Cmd.get(">");case 123:this.nextChar();return n.Cmd.get("{");case 125:this.nextChar();return n.Cmd.get("}");case 41:this.nextChar();throw new r.FormatError(`Illegal character: ${t}`)}let a=String.fromCharCode(t);if(t<32||t>127){const e=this.peekChar();if(e>=32&&e<=127){this.nextChar();return n.Cmd.get(a)}}const i=this.knownCommands;let s=i&&void 0!==i[a];for(;(t=this.nextChar())>=0&&!b[t];){const e=a+String.fromCharCode(t);if(s&&void 0===i[e])break;if(128===a.length)throw new r.FormatError(`Command token too long: ${a.length}`);a=e;s=i&&void 0!==i[a]}if("true"===a)return!0;if("false"===a)return!1;if("null"===a)return null;"BI"===a&&(this.beginInlineImagePos=this.stream.pos);return n.Cmd.get(a)}peekObj(){const e=this.stream.pos,t=this.currentChar,a=this.beginInlineImagePos;let n;try{n=this.getObj()}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`peekObj: ${e}`)}this.stream.pos=e;this.currentChar=t;this.beginInlineImagePos=a;return n}skipToNextLine(){let e=this.currentChar;for(;e>=0;){if(13===e){e=this.nextChar();10===e&&this.nextChar();break}if(10===e){this.nextChar();break}e=this.nextChar()}}}t.Lexer=Lexer;t.Linearization=class Linearization{static create(e){function getInt(e,t,a=!1){const r=e.get(t);if(Number.isInteger(r)&&(a?r>=0:r>0))return r;throw new Error(`The "${t}" parameter in the linearization dictionary is invalid.`)}const t=new Parser({lexer:new Lexer(e),xref:null}),a=t.getObj(),r=t.getObj(),i=t.getObj(),s=t.getObj();let o,c;if(!(Number.isInteger(a)&&Number.isInteger(r)&&(0,n.isCmd)(i,"obj")&&s instanceof n.Dict&&"number"==typeof(o=s.get("Linearized"))&&o>0))return null;if((c=getInt(s,"L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:c,hints:function getHints(e){const t=e.get("H");let a;if(Array.isArray(t)&&(2===(a=t.length)||4===a)){for(let e=0;e0))throw new Error(`Hint (${e}) in the linearization dictionary is invalid.`)}return t}throw new Error("Hint array in the linearization dictionary is invalid.")}(s),objectNumberFirst:getInt(s,"O"),endFirst:getInt(s,"E"),numPages:getInt(s,"N"),mainXRefEntriesOffset:getInt(s,"T"),pageFirst:s.has("P")?getInt(s,"P",!0):0}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Ascii85Stream=void 0;var r=a(19),n=a(6);class Ascii85Stream extends r.DecodeStream{constructor(e,t){t&&(t*=.8);super(t);this.str=e;this.dict=e.dict;this.input=new Uint8Array(5)}readBlock(){const e=this.str;let t=e.getByte();for(;(0,n.isWhiteSpace)(t);)t=e.getByte();if(-1===t||126===t){this.eof=!0;return}const a=this.bufferLength;let r,i;if(122===t){r=this.ensureBuffer(a+4);for(i=0;i<4;++i)r[a+i]=0;this.bufferLength+=4}else{const s=this.input;s[0]=t;for(i=1;i<5;++i){t=e.getByte();for(;(0,n.isWhiteSpace)(t);)t=e.getByte();s[i]=t;if(-1===t||126===t)break}r=this.ensureBuffer(a+i-1);this.bufferLength+=i-1;if(i<5){for(;i<5;++i)s[i]=117;this.eof=!0}let o=0;for(i=0;i<5;++i)o=85*o+(s[i]-33);for(i=3;i>=0;--i){r[a+i]=255&o;o>>=8}}}}t.Ascii85Stream=Ascii85Stream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StreamsSequenceStream=t.DecodeStream=void 0;var r=a(7),n=a(10);const i=new Uint8Array(0);class DecodeStream extends r.BaseStream{constructor(e){super();this._rawMinBufferLength=e||0;this.pos=0;this.bufferLength=0;this.eof=!1;this.buffer=i;this.minBufferLength=512;if(e)for(;this.minBufferLengthr&&(a=r)}else{for(;!this.eof;)this.readBlock();a=this.bufferLength}this.pos=a;return this.buffer.subarray(t,a)}reset(){this.pos=0}makeSubStream(e,t,a=null){if(void 0===t)for(;!this.eof;)this.readBlock();else{const a=e+t;for(;this.bufferLength<=a&&!this.eof;)this.readBlock()}return new n.Stream(this.buffer,e,t,a)}getBaseStreams(){return this.str?this.str.getBaseStreams():null}}t.DecodeStream=DecodeStream;t.StreamsSequenceStream=class StreamsSequenceStream extends DecodeStream{constructor(e,t=null){let a=0;for(const t of e)a+=t instanceof DecodeStream?t._rawMinBufferLength:t.length;super(a);this.streams=e;this._onError=t}readBlock(){const e=this.streams;if(0===e.length){this.eof=!0;return}const t=e.shift();let a;try{a=t.getBytes()}catch(e){if(this._onError){this._onError(e,t.dict&&t.dict.objId);return}throw e}const r=this.bufferLength,n=r+a.length;this.ensureBuffer(n).set(a,r);this.bufferLength=n}getBaseStreams(){const e=[];for(const t of this.streams){const a=t.getBaseStreams();a&&e.push(...a)}return e.length>0?e:null}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.AsciiHexStream=void 0;var r=a(19);class AsciiHexStream extends r.DecodeStream{constructor(e,t){t&&(t*=.5);super(t);this.str=e;this.dict=e.dict;this.firstDigit=-1}readBlock(){const e=this.str.getBytes(8e3);if(!e.length){this.eof=!0;return}const t=e.length+1>>1,a=this.ensureBuffer(this.bufferLength+t);let r=this.bufferLength,n=this.firstDigit;for(const t of e){let e;if(t>=48&&t<=57)e=15&t;else{if(!(t>=65&&t<=70||t>=97&&t<=102)){if(62===t){this.eof=!0;break}continue}e=9+(15&t)}if(n<0)n=e;else{a[r++]=n<<4|e;n=-1}}if(n>=0&&this.eof){a[r++]=n<<4;n=-1}this.firstDigit=n;this.bufferLength=r}}t.AsciiHexStream=AsciiHexStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxStream=void 0;var r=a(22),n=a(19),i=a(5);class CCITTFaxStream extends n.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;a instanceof i.Dict||(a=i.Dict.empty);const n={next:()=>e.getByte()};this.ccittFaxDecoder=new r.CCITTFaxDecoder(n,{K:a.get("K"),EndOfLine:a.get("EndOfLine"),EncodedByteAlign:a.get("EncodedByteAlign"),Columns:a.get("Columns"),Rows:a.get("Rows"),EndOfBlock:a.get("EndOfBlock"),BlackIs1:a.get("BlackIs1")})}readBlock(){for(;!this.eof;){const e=this.ccittFaxDecoder.readNextChar();if(-1===e){this.eof=!0;return}this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=e}}}t.CCITTFaxStream=CCITTFaxStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxDecoder=void 0;var r=a(2);const n=-1,i=[[-1,-1],[-1,-1],[7,8],[7,7],[6,6],[6,6],[6,5],[6,5],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[4,0],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[3,3],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2],[1,2]],s=[[-1,-1],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[12,1984],[12,2048],[12,2112],[12,2176],[12,2240],[12,2304],[11,1856],[11,1856],[11,1920],[11,1920],[12,2368],[12,2432],[12,2496],[12,2560]],o=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[8,29],[8,29],[8,30],[8,30],[8,45],[8,45],[8,46],[8,46],[7,22],[7,22],[7,22],[7,22],[7,23],[7,23],[7,23],[7,23],[8,47],[8,47],[8,48],[8,48],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[7,20],[7,20],[7,20],[7,20],[8,33],[8,33],[8,34],[8,34],[8,35],[8,35],[8,36],[8,36],[8,37],[8,37],[8,38],[8,38],[7,19],[7,19],[7,19],[7,19],[8,31],[8,31],[8,32],[8,32],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[8,53],[8,53],[8,54],[8,54],[7,26],[7,26],[7,26],[7,26],[8,39],[8,39],[8,40],[8,40],[8,41],[8,41],[8,42],[8,42],[8,43],[8,43],[8,44],[8,44],[7,21],[7,21],[7,21],[7,21],[7,28],[7,28],[7,28],[7,28],[8,61],[8,61],[8,62],[8,62],[8,63],[8,63],[8,0],[8,0],[8,320],[8,320],[8,384],[8,384],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[7,27],[7,27],[7,27],[7,27],[8,59],[8,59],[8,60],[8,60],[9,1472],[9,1536],[9,1600],[9,1728],[7,18],[7,18],[7,18],[7,18],[7,24],[7,24],[7,24],[7,24],[8,49],[8,49],[8,50],[8,50],[8,51],[8,51],[8,52],[8,52],[7,25],[7,25],[7,25],[7,25],[8,55],[8,55],[8,56],[8,56],[8,57],[8,57],[8,58],[8,58],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[8,448],[8,448],[8,512],[8,512],[9,704],[9,768],[8,640],[8,640],[8,576],[8,576],[9,832],[9,896],[9,960],[9,1024],[9,1088],[9,1152],[9,1216],[9,1280],[9,1344],[9,1408],[7,256],[7,256],[7,256],[7,256],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,16],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,14],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7]],c=[[-1,-1],[-1,-1],[12,-2],[12,-2],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[11,1792],[11,1792],[12,1984],[12,1984],[12,2048],[12,2048],[12,2112],[12,2112],[12,2176],[12,2176],[12,2240],[12,2240],[12,2304],[12,2304],[11,1856],[11,1856],[11,1856],[11,1856],[11,1920],[11,1920],[11,1920],[11,1920],[12,2368],[12,2368],[12,2432],[12,2432],[12,2496],[12,2496],[12,2560],[12,2560],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[12,52],[12,52],[13,640],[13,704],[13,768],[13,832],[12,55],[12,55],[12,56],[12,56],[13,1280],[13,1344],[13,1408],[13,1472],[12,59],[12,59],[12,60],[12,60],[13,1536],[13,1600],[11,24],[11,24],[11,24],[11,24],[11,25],[11,25],[11,25],[11,25],[13,1664],[13,1728],[12,320],[12,320],[12,384],[12,384],[12,448],[12,448],[13,512],[13,576],[12,53],[12,53],[12,54],[12,54],[13,896],[13,960],[13,1024],[13,1088],[13,1152],[13,1216],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64]],l=[[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[11,23],[11,23],[12,50],[12,51],[12,44],[12,45],[12,46],[12,47],[12,57],[12,58],[12,61],[12,256],[10,16],[10,16],[10,16],[10,16],[10,17],[10,17],[10,17],[10,17],[12,48],[12,49],[12,62],[12,63],[12,30],[12,31],[12,32],[12,33],[12,40],[12,41],[11,22],[11,22],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[12,128],[12,192],[12,26],[12,27],[12,28],[12,29],[11,19],[11,19],[11,20],[11,20],[12,34],[12,35],[12,36],[12,37],[12,38],[12,39],[11,21],[11,21],[12,42],[12,43],[10,0],[10,0],[10,0],[10,0],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12]],h=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];t.CCITTFaxDecoder=class CCITTFaxDecoder{constructor(e,t={}){if(!e||"function"!=typeof e.next)throw new Error('CCITTFaxDecoder - invalid "source" parameter.');this.source=e;this.eof=!1;this.encoding=t.K||0;this.eoline=t.EndOfLine||!1;this.byteAlign=t.EncodedByteAlign||!1;this.columns=t.Columns||1728;this.rows=t.Rows||0;let a,r=t.EndOfBlock;null==r&&(r=!0);this.eoblock=r;this.black=t.BlackIs1||!1;this.codingLine=new Uint32Array(this.columns+1);this.refLine=new Uint32Array(this.columns+2);this.codingLine[0]=this.columns;this.codingPos=0;this.row=0;this.nextLine2D=this.encoding<0;this.inputBits=0;this.inputBuf=0;this.outputBits=0;this.rowsDone=!1;for(;0===(a=this._lookBits(12));)this._eatBits(1);1===a&&this._eatBits(12);if(this.encoding>0){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}}readNextChar(){if(this.eof)return-1;const e=this.refLine,t=this.codingLine,a=this.columns;let i,s,o,c,l;if(0===this.outputBits){this.rowsDone&&(this.eof=!0);if(this.eof)return-1;this.err=!1;let o,l,h;if(this.nextLine2D){for(c=0;t[c]=64);do{l+=h=this._getWhiteCode()}while(h>=64)}else{do{o+=h=this._getWhiteCode()}while(h>=64);do{l+=h=this._getBlackCode()}while(h>=64)}this._addPixels(t[this.codingPos]+o,s);t[this.codingPos]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]0?--i:++i;for(;e[i]<=t[this.codingPos]&&e[i]=64);else do{o+=h=this._getWhiteCode()}while(h>=64);this._addPixels(t[this.codingPos]+o,s);s^=1}}let u=!1;this.byteAlign&&(this.inputBits&=-8);if(this.eoblock||this.row!==this.rows-1){o=this._lookBits(12);if(this.eoline)for(;o!==n&&1!==o;){this._eatBits(1);o=this._lookBits(12)}else for(;0===o;){this._eatBits(1);o=this._lookBits(12)}if(1===o){this._eatBits(12);u=!0}else o===n&&(this.eof=!0)}else this.rowsDone=!0;if(!this.eof&&this.encoding>0&&!this.rowsDone){this.nextLine2D=!this._lookBits(1);this._eatBits(1)}if(this.eoblock&&u&&this.byteAlign){o=this._lookBits(12);if(1===o){this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}if(this.encoding>=0)for(c=0;c<4;++c){o=this._lookBits(12);1!==o&&(0,r.info)("bad rtc code: "+o);this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}}this.eof=!0}}else if(this.err&&this.eoline){for(;;){o=this._lookBits(13);if(o===n){this.eof=!0;return-1}if(o>>1==1)break;this._eatBits(1)}this._eatBits(12);if(this.encoding>0){this._eatBits(1);this.nextLine2D=!(1&o)}}t[0]>0?this.outputBits=t[this.codingPos=0]:this.outputBits=t[this.codingPos=1];this.row++}if(this.outputBits>=8){l=1&this.codingPos?0:255;this.outputBits-=8;if(0===this.outputBits&&t[this.codingPos]o){l<<=o;1&this.codingPos||(l|=255>>8-o);this.outputBits-=o;o=0}else{l<<=this.outputBits;1&this.codingPos||(l|=255>>8-this.outputBits);o-=this.outputBits;this.outputBits=0;if(t[this.codingPos]0){l<<=o;o=0}}}while(o)}this.black&&(l^=255);return l}_addPixels(e,t){const a=this.codingLine;let n=this.codingPos;if(e>a[n]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&n^t&&++n;a[n]=e}this.codingPos=n}_addPixelsNeg(e,t){const a=this.codingLine;let n=this.codingPos;if(e>a[n]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&n^t&&++n;a[n]=e}else if(e0&&e=i){const t=a[e-i];if(t[0]===r){this._eatBits(r);return[!0,t[1],!0]}}}return[!1,0,!1]}_getTwoDimCode(){let e,t=0;if(this.eoblock){t=this._lookBits(7);e=i[t];if(e&&e[0]>0){this._eatBits(e[0]);return e[1]}}else{const e=this._findTableCode(1,7,i);if(e[0]&&e[2])return e[1]}(0,r.info)("Bad two dim code");return n}_getWhiteCode(){let e,t=0;if(this.eoblock){t=this._lookBits(12);if(t===n)return 1;e=t>>5==0?s[t]:o[t>>3];if(e[0]>0){this._eatBits(e[0]);return e[1]}}else{let e=this._findTableCode(1,9,o);if(e[0])return e[1];e=this._findTableCode(11,12,s);if(e[0])return e[1]}(0,r.info)("bad white code");this._eatBits(1);return 1}_getBlackCode(){let e,t;if(this.eoblock){e=this._lookBits(13);if(e===n)return 1;t=e>>7==0?c[e]:e>>9==0&&e>>7!=0?l[(e>>1)-64]:h[e>>7];if(t[0]>0){this._eatBits(t[0]);return t[1]}}else{let e=this._findTableCode(2,6,h);if(e[0])return e[1];e=this._findTableCode(7,12,l,64);if(e[0])return e[1];e=this._findTableCode(10,13,c);if(e[0])return e[1]}(0,r.info)("bad black code");this._eatBits(1);return 1}_lookBits(e){let t;for(;this.inputBits>16-e;this.inputBuf=this.inputBuf<<8|t;this.inputBits+=8}return this.inputBuf>>this.inputBits-e&65535>>16-e}_eatBits(e){(this.inputBits-=e)<0&&(this.inputBits=0)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FlateStream=void 0;var r=a(19),n=a(2);const i=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),o=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),c=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59e4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],l=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];class FlateStream extends r.DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict;const a=e.getByte(),r=e.getByte();if(-1===a||-1===r)throw new n.FormatError(`Invalid header in flate stream: ${a}, ${r}`);if(8!=(15&a))throw new n.FormatError(`Unknown compression method in flate stream: ${a}, ${r}`);if(((a<<8)+r)%31!=0)throw new n.FormatError(`Bad FCHECK in flate stream: ${a}, ${r}`);if(32&r)throw new n.FormatError(`FDICT bit set in flate stream: ${a}, ${r}`);this.codeSize=0;this.codeBuf=0}getBits(e){const t=this.str;let a,r=this.codeSize,i=this.codeBuf;for(;r>e;this.codeSize=r-=e;return a}getCode(e){const t=this.str,a=e[0],r=e[1];let i,s=this.codeSize,o=this.codeBuf;for(;s>16,h=65535&c;if(l<1||s>l;this.codeSize=s-l;return h}generateHuffmanTable(e){const t=e.length;let a,r=0;for(a=0;ar&&(r=e[a]);const n=1<>=1}for(a=e;a>=1;if(0===u){let t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");let r=t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");r|=t<<8;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");let i=t;if(-1===(t=a.getByte()))throw new n.FormatError("Bad block header in flate stream");i|=t<<8;if(i!==(65535&~r)&&(0!==r||0!==i))throw new n.FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;const s=this.bufferLength,o=s+r;e=this.ensureBuffer(o);this.bufferLength=o;if(0===r)-1===a.peekByte()&&(this.eof=!0);else{const t=a.getBytes(r);e.set(t,s);t.length0;)u[o++]=g}r=this.generateHuffmanTable(u.subarray(0,e));h=this.generateHuffmanTable(u.subarray(e,l))}}e=this.buffer;let d=e?e.length:0,f=this.bufferLength;for(;;){let a=this.getCode(r);if(a<256){if(f+1>=d){e=this.ensureBuffer(f+1);d=e.length}e[f++]=a;continue}if(256===a){this.bufferLength=f;return}a-=257;a=s[a];let n=a>>16;n>0&&(n=this.getBits(n));t=(65535&a)+n;a=this.getCode(h);a=o[a];n=a>>16;n>0&&(n=this.getBits(n));const i=(65535&a)+n;if(f+t>=d){e=this.ensureBuffer(f+t);d=e.length}for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Stream=void 0;var r=a(7),n=a(19),i=a(5),s=a(25),o=a(2);class Jbig2Stream extends n.DecodeStream{constructor(e,t,a){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,o.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e=new s.Jbig2Image,t=[];if(this.params instanceof i.Dict){const e=this.params.get("JBIG2Globals");if(e instanceof r.BaseStream){const a=e.getBytes();t.push({data:a,start:0,end:a.length})}}t.push({data:this.bytes,start:0,end:this.bytes.length});const a=e.parseChunks(t),n=a.length;for(let e=0;e{Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Image=void 0;var r=a(2),n=a(6),i=a(26),s=a(22);class Jbig2Error extends r.BaseException{constructor(e){super(`JBIG2 error: ${e}`,"Jbig2Error")}}class ContextCache{getContexts(e){return e in this?this[e]:this[e]=new Int8Array(65536)}}class DecodingContext{constructor(e,t,a){this.data=e;this.start=t;this.end=a}get decoder(){const e=new i.ArithmeticDecoder(this.data,this.start,this.end);return(0,r.shadow)(this,"decoder",e)}get contextCache(){const e=new ContextCache;return(0,r.shadow)(this,"contextCache",e)}}function decodeInteger(e,t,a){const r=e.getContexts(t);let n=1;function readBits(e){let t=0;for(let i=0;i>>0}const i=readBits(1),s=readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(32)+4436:readBits(12)+340:readBits(8)+84:readBits(6)+20:readBits(4)+4:readBits(2);return 0===i?s:s>0?-s:null}function decodeIAID(e,t,a){const r=e.getContexts("IAID");let n=1;for(let e=0;e=O&&j=T){q=q<<1&y;for(b=0;b=0&&_=0){U=N[$][_];U&&(q|=U<=e?l<<=1:l=l<<1|C[o][c]}for(p=0;p=x||c<0||c>=S?l<<=1:l=l<<1|r[o][c]}const h=v.readBit(F,l);t[s]=h}}return C}function decodeTextRegion(e,t,a,r,n,i,s,o,c,l,h,u,d,f,g,p,m,b,y){if(e&&t)throw new Jbig2Error("refinement with Huffman is not supported");const w=[];let S,x;for(S=0;S1&&(n=e?y.readBits(b):decodeInteger(C,"IAIT",k));const i=s*v+n,F=e?f.symbolIDTable.decode(y):decodeIAID(C,k,c),O=t&&(e?y.readBit():decodeInteger(C,"IARI",k));let T=o[F],M=T[0].length,E=T.length;if(O){const e=decodeInteger(C,"IARDW",k),t=decodeInteger(C,"IARDH",k),a=decodeInteger(C,"IARDX",k),r=decodeInteger(C,"IARDY",k);M+=e;E+=t;T=decodeRefinement(M,E,g,T,(e>>1)+a,(t>>1)+r,!1,p,m)}const D=i-(1&u?0:E-1),N=r-(2&u?M-1:0);let R,L,j;if(l){for(R=0;R>5&7;const h=[31&c];let u=t+6;if(7===c){l=536870911&(0,n.readUint32)(e,u-1);u+=3;let t=l+7>>3;h[0]=e[u++];for(;--t>0;)h.push(e[u++])}else if(5===c||6===c)throw new Jbig2Error("invalid referred-to flags");a.retainBits=h;let f=4;a.number<=256?f=1:a.number<=65536&&(f=2);const g=[];let p,m;for(p=0;p>>24&255;i[3]=t.height>>16&255;i[4]=t.height>>8&255;i[5]=255&t.height;for(p=u,m=e.length;p>2&3;e.huffmanDWSelector=t>>4&3;e.bitmapSizeSelector=t>>6&1;e.aggregationInstancesSelector=t>>7&1;e.bitmapCodingContextUsed=!!(256&t);e.bitmapCodingContextRetained=!!(512&t);e.template=t>>10&3;e.refinementTemplate=t>>12&1;h+=2;if(!e.huffman){l=0===e.template?4:1;o=[];for(c=0;c>2&3;u.stripSize=1<>4&3;u.transposed=!!(64&f);u.combinationOperator=f>>7&3;u.defaultPixelValue=f>>9&1;u.dsOffset=f<<17>>27;u.refinementTemplate=f>>15&1;if(u.huffman){const e=(0,n.readUint16)(r,h);h+=2;u.huffmanFS=3&e;u.huffmanDS=e>>2&3;u.huffmanDT=e>>4&3;u.huffmanRefinementDW=e>>6&3;u.huffmanRefinementDH=e>>8&3;u.huffmanRefinementDX=e>>10&3;u.huffmanRefinementDY=e>>12&3;u.huffmanRefinementSizeSelector=!!(16384&e)}if(u.refinement&&!u.refinementTemplate){o=[];for(c=0;c<2;c++){o.push({x:(0,n.readInt8)(r,h),y:(0,n.readInt8)(r,h+1)});h+=2}u.refinementAt=o}u.numberOfSymbolInstances=(0,n.readUint32)(r,h);h+=4;s=[u,a.referredTo,r,h,i];break;case 16:const g={},p=r[h++];g.mmr=!!(1&p);g.template=p>>1&3;g.patternWidth=r[h++];g.patternHeight=r[h++];g.maxPatternIndex=(0,n.readUint32)(r,h);h+=4;s=[g,a.number,r,h,i];break;case 22:case 23:const m={};m.info=readRegionSegmentInformation(r,h);h+=d;const b=r[h++];m.mmr=!!(1&b);m.template=b>>1&3;m.enableSkip=!!(8&b);m.combinationOperator=b>>4&7;m.defaultPixelValue=b>>7&1;m.gridWidth=(0,n.readUint32)(r,h);h+=4;m.gridHeight=(0,n.readUint32)(r,h);h+=4;m.gridOffsetX=4294967295&(0,n.readUint32)(r,h);h+=4;m.gridOffsetY=4294967295&(0,n.readUint32)(r,h);h+=4;m.gridVectorX=(0,n.readUint16)(r,h);h+=2;m.gridVectorY=(0,n.readUint16)(r,h);h+=2;s=[m,a.referredTo,r,h,i];break;case 38:case 39:const y={};y.info=readRegionSegmentInformation(r,h);h+=d;const w=r[h++];y.mmr=!!(1&w);y.template=w>>1&3;y.prediction=!!(8&w);if(!y.mmr){l=0===y.template?4:1;o=[];for(c=0;c>2&1;S.combinationOperator=x>>3&3;S.requiresBuffer=!!(32&x);S.combinationOperatorOverride=!!(64&x);s=[S];break;case 49:case 50:case 51:case 62:break;case 53:s=[a.number,r,h,i];break;default:throw new Jbig2Error(`segment type ${a.typeName}(${a.type}) is not implemented`)}const u="on"+a.typeName;u in t&&t[u].apply(t,s)}function processSegments(e,t){for(let a=0,r=e.length;a>3,a=new Uint8ClampedArray(t*e.height);e.defaultPixelValue&&a.fill(255);this.buffer=a}drawBitmap(e,t){const a=this.currentPageInfo,r=e.width,n=e.height,i=a.width+7>>3,s=a.combinationOperatorOverride?e.combinationOperator:a.combinationOperator,o=this.buffer,c=128>>(7&e.x);let l,h,u,d,f=e.y*i+(e.x>>3);switch(s){case 0:for(l=0;l>=1;if(!u){u=128;d++}}f+=i}break;case 2:for(l=0;l>=1;if(!u){u=128;d++}}f+=i}break;default:throw new Jbig2Error(`operator ${s} is not supported`)}}onImmediateGenericRegion(e,t,a,r){const n=e.info,i=new DecodingContext(t,a,r),s=decodeBitmap(e.mmr,n.width,n.height,e.template,e.prediction,null,e.at,i);this.drawBitmap(n,s)}onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion(...arguments)}onSymbolDictionary(e,t,a,r,i,s){let o,c;if(e.huffman){o=function getSymbolDictionaryHuffmanTables(e,t,a){let r,n,i,s,o=0;switch(e.huffmanDHSelector){case 0:case 1:r=getStandardTable(e.huffmanDHSelector+4);break;case 3:r=getCustomHuffmanTable(o,t,a);o++;break;default:throw new Jbig2Error("invalid Huffman DH selector")}switch(e.huffmanDWSelector){case 0:case 1:n=getStandardTable(e.huffmanDWSelector+2);break;case 3:n=getCustomHuffmanTable(o,t,a);o++;break;default:throw new Jbig2Error("invalid Huffman DW selector")}if(e.bitmapSizeSelector){i=getCustomHuffmanTable(o,t,a);o++}else i=getStandardTable(1);s=e.aggregationInstancesSelector?getCustomHuffmanTable(o,t,a):getStandardTable(1);return{tableDeltaHeight:r,tableDeltaWidth:n,tableBitmapSize:i,tableAggregateInstances:s}}(e,a,this.customTables);c=new Reader(r,i,s)}let l=this.symbols;l||(this.symbols=l={});const h=[];for(const e of a){const t=l[e];t&&h.push(...t)}const u=new DecodingContext(r,i,s);l[t]=function decodeSymbolDictionary(e,t,a,r,i,s,o,c,l,h,u,d){if(e&&t)throw new Jbig2Error("symbol refinement with Huffman is not supported");const f=[];let g=0,p=(0,n.log2)(a.length+r);const m=u.decoder,b=u.contextCache;let y,w;if(e){y=getStandardTable(1);w=[];p=Math.max(p,1)}for(;f.length1)y=decodeTextRegion(e,t,r,g,0,n,1,a.concat(f),p,0,0,1,0,s,l,h,u,0,d);else{const e=decodeIAID(b,m,p),t=decodeInteger(b,"IARDX",m),n=decodeInteger(b,"IARDY",m);y=decodeRefinement(r,g,l,e=32){let a,r,s;switch(t){case 32:if(0===e)throw new Jbig2Error("no previous value in symbol ID table");r=n.readBits(2)+3;a=i[e-1].prefixLength;break;case 33:r=n.readBits(3)+3;a=0;break;case 34:r=n.readBits(7)+11;a=0;break;default:throw new Jbig2Error("invalid code length in symbol ID table")}for(s=0;s=0;b--){M=e?decodeMMRBitmap(T,l,h,!0):decodeBitmap(!1,l,h,a,!1,null,F,p);O[b]=M}for(E=0;E=0;y--){N^=O[y][E][D];R|=N<>8;$=d+E*f-D*g>>8;if(j>=0&&j+k<=r&&$>=0&&$+C<=i)for(b=0;b=i)){U=m[t];_=L[b];for(y=0;y=0&&e>1&7),l=1+(r>>4&7),h=[];let u,d,f=i;do{u=o.readBits(c);d=o.readBits(l);h.push(new HuffmanLine([f,u,d,0]));f+=1<>t&1;if(t<=0)this.children[a]=new HuffmanTreeNode(e);else{let r=this.children[a];r||(this.children[a]=r=new HuffmanTreeNode(null));r.buildTree(e,t-1)}}decodeNode(e){if(this.isLeaf){if(this.isOOB)return null;const t=e.readBits(this.rangeLength);return this.rangeLow+(this.isLowerRange?-t:t)}const t=this.children[e.readBit()];if(!t)throw new Jbig2Error("invalid Huffman data");return t.decodeNode(e)}}class HuffmanTable{constructor(e,t){t||this.assignPrefixCodes(e);this.rootNode=new HuffmanTreeNode(null);for(let t=0,a=e.length;t0&&this.rootNode.buildTree(a,a.prefixLength-1)}}decode(e){return this.rootNode.decodeNode(e)}assignPrefixCodes(e){const t=e.length;let a=0;for(let r=0;r=this.end)throw new Jbig2Error("end of data while reading bit");this.currentByte=this.data[this.position++];this.shift=7}const e=this.currentByte>>this.shift&1;this.shift--;return e}readBits(e){let t,a=0;for(t=e-1;t>=0;t--)a|=this.readBit()<=this.end?-1:this.data[this.position++]}}function getCustomHuffmanTable(e,t,a){let r=0;for(let n=0,i=t.length;n>a&1;a--}}if(r&&!l){const e=5;for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0});t.ArithmeticDecoder=void 0;const a=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];t.ArithmeticDecoder=class ArithmeticDecoder{constructor(e,t,a){this.data=e;this.bp=t;this.dataEnd=a;this.chigh=e[t];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}byteIn(){const e=this.data;let t=this.bp;if(255===e[t])if(e[t+1]>143){this.clow+=65280;this.ct=8}else{t++;this.clow+=e[t]<<9;this.ct=7;this.bp=t}else{t++;this.clow+=t65535){this.chigh+=this.clow>>16;this.clow&=65535}}readBit(e,t){let r=e[t]>>1,n=1&e[t];const i=a[r],s=i.qe;let o,c=this.a-s;if(this.chigh>15&1;this.clow=this.clow<<1&65535;this.ct--}while(0==(32768&c));this.a=c;e[t]=r<<1|n;return o}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.JpegStream=void 0;var r=a(19),n=a(5),i=a(28),s=a(2);class JpegStream extends r.DecodeStream{constructor(e,t,a){let r;for(;-1!==(r=e.getByte());)if(255===r){e.skip(-1);break}super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,s.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e={decodeTransform:void 0,colorTransform:void 0},t=this.dict.getArray("D","Decode");if(this.forceRGB&&Array.isArray(t)){const a=this.dict.get("BPC","BitsPerComponent")||8,r=t.length,n=new Int32Array(r);let i=!1;const s=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.JpegImage=void 0;var r=a(2),n=a(6);class JpegError extends r.BaseException{constructor(e){super(`JPEG error: ${e}`,"JpegError")}}class DNLMarkerError extends r.BaseException{constructor(e,t){super(e,"DNLMarkerError");this.scanLines=t}}class EOIMarkerError extends r.BaseException{constructor(e){super(e,"EOIMarkerError")}}const i=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),s=4017,o=799,c=3406,l=2276,h=1567,u=3784,d=5793,f=2896;function buildHuffmanTable(e,t){let a,r,n=0,i=16;for(;i>0&&!e[i-1];)i--;const s=[{children:[],index:0}];let o,c=s[0];for(a=0;a0;)c=s.pop();c.index++;s.push(c);for(;s.length<=a;){s.push(o={children:[],index:0});c.children[c.index]=o.children;c=o}n++}if(a+10){b--;return m>>b&1}m=e[t++];if(255===m){const r=e[t++];if(r){if(220===r&&d){t+=2;const r=(0,n.readUint16)(e,t);t+=2;if(r>0&&r!==a.scanLines)throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",r)}else if(217===r){if(d){const e=x*(8===a.precision?8:0);if(e>0&&Math.round(a.scanLines/e)>=10)throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, possibly caused by incorrect `scanLines` parameter",e)}throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data")}throw new JpegError(`unexpected marker ${(m<<8|r).toString(16)}`)}}b=7;return m>>>7}function decodeHuffman(e){let t=e;for(;;){t=t[readBit()];switch(typeof t){case"number":return t;case"object":continue}throw new JpegError("invalid huffman sequence")}}function receive(e){let t=0;for(;e>0;){t=t<<1|readBit();e--}return t}function receiveAndExtend(e){if(1===e)return 1===readBit()?1:-1;const t=receive(e);return t>=1<0){y--;return}let a=c;const r=l;for(;a<=r;){const r=decodeHuffman(e.huffmanTableAC),n=15&r,s=r>>4;if(0===n){if(s<15){y=receive(s)+(1<>4;if(0===n)if(o<15){y=receive(o)+(1<>4;if(0===r){if(s<15)break;n+=16;continue}n+=s;const o=i[n];e.blockData[t+o]=receiveAndExtend(r);n++}};let E,D,N,R,L=0;D=1===k?s[0].blocksPerLine*s[0].blocksPerColumn:f*a.mcusPerColumn;for(;L<=D;){const a=o?Math.min(D-L,o):D;if(a>0){for(v=0;v0?"unexpected":"excessive";(0,r.warn)(`decodeScan - ${e} MCU data, current marker is: ${E.invalid}`);t=E.offset}if(!(E.marker>=65488&&E.marker<=65495))break;t+=2}return t-p}function quantizeAndInverse(e,t,a){const r=e.quantizationTable,n=e.blockData;let i,g,p,m,b,y,w,S,x,k,C,v,F,O,T,M,E;if(!r)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){x=n[t+e];k=n[t+e+1];C=n[t+e+2];v=n[t+e+3];F=n[t+e+4];O=n[t+e+5];T=n[t+e+6];M=n[t+e+7];x*=r[e];if(0!=(k|C|v|F|O|T|M)){k*=r[e+1];C*=r[e+2];v*=r[e+3];F*=r[e+4];O*=r[e+5];T*=r[e+6];M*=r[e+7];i=d*x+128>>8;g=d*F+128>>8;p=C;m=T;b=f*(k-M)+128>>8;S=f*(k+M)+128>>8;y=v<<4;w=O<<4;i=i+g+1>>1;g=i-g;E=p*u+m*h+128>>8;p=p*h-m*u+128>>8;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;i=i+m+1>>1;m=i-m;g=g+p+1>>1;p=g-p;E=b*l+S*c+2048>>12;b=b*c-S*l+2048>>12;S=E;E=y*o+w*s+2048>>12;y=y*s-w*o+2048>>12;w=E;a[e]=i+S;a[e+7]=i-S;a[e+1]=g+w;a[e+6]=g-w;a[e+2]=p+y;a[e+5]=p-y;a[e+3]=m+b;a[e+4]=m-b}else{E=d*x+512>>10;a[e]=E;a[e+1]=E;a[e+2]=E;a[e+3]=E;a[e+4]=E;a[e+5]=E;a[e+6]=E;a[e+7]=E}}for(let e=0;e<8;++e){x=a[e];k=a[e+8];C=a[e+16];v=a[e+24];F=a[e+32];O=a[e+40];T=a[e+48];M=a[e+56];if(0!=(k|C|v|F|O|T|M)){i=d*x+2048>>12;g=d*F+2048>>12;p=C;m=T;b=f*(k-M)+2048>>12;S=f*(k+M)+2048>>12;y=v;w=O;i=4112+(i+g+1>>1);g=i-g;E=p*u+m*h+2048>>12;p=p*h-m*u+2048>>12;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;i=i+m+1>>1;m=i-m;g=g+p+1>>1;p=g-p;E=b*l+S*c+2048>>12;b=b*c-S*l+2048>>12;S=E;E=y*o+w*s+2048>>12;y=y*s-w*o+2048>>12;w=E;x=i+S;M=i-S;k=g+w;T=g-w;C=p+y;O=p-y;v=m+b;F=m-b;x<16?x=0:x>=4080?x=255:x>>=4;k<16?k=0:k>=4080?k=255:k>>=4;C<16?C=0:C>=4080?C=255:C>>=4;v<16?v=0:v>=4080?v=255:v>>=4;F<16?F=0:F>=4080?F=255:F>>=4;O<16?O=0:O>=4080?O=255:O>>=4;T<16?T=0:T>=4080?T=255:T>>=4;M<16?M=0:M>=4080?M=255:M>>=4;n[t+e]=x;n[t+e+8]=k;n[t+e+16]=C;n[t+e+24]=v;n[t+e+32]=F;n[t+e+40]=O;n[t+e+48]=T;n[t+e+56]=M}else{E=d*x+8192>>14;E=E<-2040?0:E>=2024?255:E+2056>>4;n[t+e]=E;n[t+e+8]=E;n[t+e+16]=E;n[t+e+24]=E;n[t+e+32]=E;n[t+e+40]=E;n[t+e+48]=E;n[t+e+56]=E}}}function buildComponentData(e,t){const a=t.blocksPerLine,r=t.blocksPerColumn,n=new Int16Array(64);for(let e=0;e=r)return null;const s=(0,n.readUint16)(e,t);if(s>=65472&&s<=65534)return{invalid:null,marker:s,offset:t};let o=(0,n.readUint16)(e,i);for(;!(o>=65472&&o<=65534);){if(++i>=r)return null;o=(0,n.readUint16)(e,i)}return{invalid:s.toString(16),marker:o,offset:i}}t.JpegImage=class JpegImage{constructor({decodeTransform:e=null,colorTransform:t=-1}={}){this._decodeTransform=e;this._colorTransform=t}parse(e,{dnlScanLines:t=null}={}){function readDataBlock(){const t=(0,n.readUint16)(e,o);o+=2;let a=o+t-2;const i=findNextFileMarker(e,a,o);if(i&&i.invalid){(0,r.warn)("readDataBlock - incorrect length, current marker is: "+i.invalid);a=i.offset}const s=e.subarray(o,a);o+=s.length;return s}function prepareComponents(e){const t=Math.ceil(e.samplesPerLine/8/e.maxH),a=Math.ceil(e.scanLines/8/e.maxV);for(let r=0,n=e.components.length;r>4==0)for(m=0;m<64;m++){x=i[m];a[x]=e[o++]}else{if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(m=0;m<64;m++){x=i[m];a[x]=(0,n.readUint16)(e,o);o+=2}}u[15&t]=a}break;case 65472:case 65473:case 65474:if(a)throw new JpegError("Only single frame JPEGs supported");o+=2;a={};a.extended=65473===g;a.progressive=65474===g;a.precision=e[o++];const k=(0,n.readUint16)(e,o);o+=2;a.scanLines=t||k;a.samplesPerLine=(0,n.readUint16)(e,o);o+=2;a.components=[];a.componentIds={};const C=e[o++];let v=0,F=0;for(p=0;p>4,n=15&e[o+1];v>4==0?f:d)[15&t]=buildHuffmanTable(a,n)}break;case 65501:o+=2;s=(0,n.readUint16)(e,o);o+=2;break;case 65498:const T=1==++h&&!t;o+=2;const M=e[o++],E=[];for(p=0;p>4];n.huffmanTableAC=d[15&i];E.push(n)}const D=e[o++],N=e[o++],R=e[o++];try{const t=decodeScan(e,o,a,E,s,D,N,R>>4,15&R,T);o+=t}catch(t){if(t instanceof DNLMarkerError){(0,r.warn)(`${t.message} -- attempting to re-parse the JPEG image.`);return this.parse(e,{dnlScanLines:t.scanLines})}if(t instanceof EOIMarkerError){(0,r.warn)(`${t.message} -- ignoring the rest of the image data.`);break e}throw t}break;case 65500:o+=4;break;case 65535:255!==e[o]&&o--;break;default:const L=findNextFileMarker(e,o-2,o-3);if(L&&L.invalid){(0,r.warn)("JpegImage.parse - unexpected data, current marker is: "+L.invalid);o=L.offset;break}if(!L||o>=e.length-1){(0,r.warn)("JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).");break e}throw new JpegError("JpegImage.parse - unknown marker: "+g.toString(16))}g=(0,n.readUint16)(e,o);o+=2}this.width=a.samplesPerLine;this.height=a.scanLines;this.jfif=c;this.adobe=l;this.components=[];for(let e=0,t=a.components.length;e>8)+C[f+1];return w}get _isColorConversionNeeded(){return this.adobe?!!this.adobe.transformCode:3===this.numComponents?0!==this._colorTransform&&(82!==this.components[0].index||71!==this.components[1].index||66!==this.components[2].index):1===this._colorTransform}_convertYccToRgb(e){let t,a,r;for(let n=0,i=e.length;n4)throw new JpegError("Unsupported color mode");const n=this._getLinearizedBlockData(e,t,r);if(1===this.numComponents&&a){const e=n.length,t=new Uint8ClampedArray(3*e);let a=0;for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});t.JpxStream=void 0;var r=a(19),n=a(30),i=a(2);class JpxStream extends r.DecodeStream{constructor(e,t,a){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=a}get bytes(){return(0,i.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e=new n.JpxImage;e.parse(this.bytes);const t=e.width,a=e.height,r=e.componentsCount,i=e.tiles.length;if(1===i)this.buffer=e.tiles[0].items;else{const n=new Uint8ClampedArray(t*a*r);for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.JpxImage=void 0;var r=a(2),n=a(6),i=a(26);class JpxError extends r.BaseException{constructor(e){super(`JPX error: ${e}`,"JpxError")}}const s={LL:0,LH:1,HL:1,HH:2};t.JpxImage=class JpxImage{constructor(){this.failOnCorruptedImage=!1}parse(e){if(65359===(0,n.readUint16)(e,0)){this.parseCodestream(e,0,e.length);return}const t=e.length;let a=0;for(;a>24&255,o>>16&255,o>>8&255,255&o);(0,r.warn)(`Unsupported header type ${o} (${i}).`)}l&&(a+=c)}}parseImageProperties(e){let t=e.getByte();for(;t>=0;){const a=t;t=e.getByte();if(65361===(a<<8|t)){e.skip(4);const t=e.getInt32()>>>0,a=e.getInt32()>>>0,r=e.getInt32()>>>0,n=e.getInt32()>>>0;e.skip(16);const i=e.getUint16();this.width=t-r;this.height=a-n;this.componentsCount=i;this.bitsPerComponent=8;return}}throw new JpxError("No size marker found in JPX stream")}parseCodestream(e,t,a){const i={};let s=!1;try{let o=t;for(;o+1>5;l=[];for(;a>3;t.mu=0}else{t.epsilon=e[a]>>3;t.mu=(7&e[a])<<8|e[a+1];a+=2}l.push(t)}b.SPqcds=l;if(i.mainHeader)i.QCD=b;else{i.currentTile.QCD=b;i.currentTile.QCC=[]}break;case 65373:f=(0,n.readUint16)(e,o);const y={};a=o+2;let w;if(i.SIZ.Csiz<257)w=e[a++];else{w=(0,n.readUint16)(e,a);a+=2}c=e[a++];switch(31&c){case 0:h=8;u=!0;break;case 1:h=16;u=!1;break;case 2:h=16;u=!0;break;default:throw new Error("Invalid SQcd value "+c)}y.noQuantization=8===h;y.scalarExpounded=u;y.guardBits=c>>5;l=[];for(;a>3;t.mu=0}else{t.epsilon=e[a]>>3;t.mu=(7&e[a])<<8|e[a+1];a+=2}l.push(t)}y.SPqcds=l;i.mainHeader?i.QCC[w]=y:i.currentTile.QCC[w]=y;break;case 65362:f=(0,n.readUint16)(e,o);const S={};a=o+2;const x=e[a++];S.entropyCoderWithCustomPrecincts=!!(1&x);S.sopMarkerUsed=!!(2&x);S.ephMarkerUsed=!!(4&x);S.progressionOrder=e[a++];S.layersCount=(0,n.readUint16)(e,a);a+=2;S.multipleComponentTransform=e[a++];S.decompositionLevelsCount=e[a++];S.xcb=2+(15&e[a++]);S.ycb=2+(15&e[a++]);const k=e[a++];S.selectiveArithmeticCodingBypass=!!(1&k);S.resetContextProbabilities=!!(2&k);S.terminationOnEachCodingPass=!!(4&k);S.verticallyStripe=!!(8&k);S.predictableTermination=!!(16&k);S.segmentationSymbolUsed=!!(32&k);S.reversibleTransformation=e[a++];if(S.entropyCoderWithCustomPrecincts){const t=[];for(;a>4})}S.precinctsSizes=t}const C=[];S.selectiveArithmeticCodingBypass&&C.push("selectiveArithmeticCodingBypass");S.terminationOnEachCodingPass&&C.push("terminationOnEachCodingPass");S.verticallyStripe&&C.push("verticallyStripe");S.predictableTermination&&C.push("predictableTermination");if(C.length>0){s=!0;(0,r.warn)(`JPX: Unsupported COD options (${C.join(", ")}).`)}if(i.mainHeader)i.COD=S;else{i.currentTile.COD=S;i.currentTile.COC=[]}break;case 65424:f=(0,n.readUint16)(e,o);d={};d.index=(0,n.readUint16)(e,o+2);d.length=(0,n.readUint32)(e,o+4);d.dataEnd=d.length+o-2;d.partIndex=e[o+8];d.partsCount=e[o+9];i.mainHeader=!1;if(0===d.partIndex){d.COD=i.COD;d.COC=i.COC.slice(0);d.QCD=i.QCD;d.QCC=i.QCC.slice(0)}i.currentTile=d;break;case 65427:d=i.currentTile;if(0===d.partIndex){initializeTile(i,d.index);buildPackets(i)}f=d.dataEnd-o;parseTilePackets(i,e,o,f);break;case 65363:(0,r.warn)("JPX: Codestream code 0xFF53 (COC) is not implemented.");case 65365:case 65367:case 65368:case 65380:f=(0,n.readUint16)(e,o);break;default:throw new Error("Unknown codestream code: "+t.toString(16))}o+=f}}catch(e){if(s||this.failOnCorruptedImage)throw new JpxError(e.message);(0,r.warn)(`JPX: Trying to recover from: "${e.message}".`)}this.tiles=function transformComponents(e){const t=e.SIZ,a=e.components,r=t.Csiz,n=[];for(let t=0,i=e.tiles.length;t>2);c[b++]=e+m>>h;c[b++]=e>>h;c[b++]=e+p>>h}else for(d=0;d>h;c[b++]=g-.34413*p-.71414*m>>h;c[b++]=g+1.772*p>>h}if(e)for(d=0,b=3;d>h}else for(let e=0;e>h;b+=r}}n.push(l)}return n}(i);this.width=i.SIZ.Xsiz-i.SIZ.XOsiz;this.height=i.SIZ.Ysiz-i.SIZ.YOsiz;this.componentsCount=i.SIZ.Csiz}};function calculateComponentDimensions(e,t){e.x0=Math.ceil(t.XOsiz/e.XRsiz);e.x1=Math.ceil(t.Xsiz/e.XRsiz);e.y0=Math.ceil(t.YOsiz/e.YRsiz);e.y1=Math.ceil(t.Ysiz/e.YRsiz);e.width=e.x1-e.x0;e.height=e.y1-e.y0}function calculateTileGrids(e,t){const a=e.SIZ,r=[];let n;const i=Math.ceil((a.Xsiz-a.XTOsiz)/a.XTsiz),s=Math.ceil((a.Ysiz-a.YTOsiz)/a.YTsiz);for(let e=0;e0?Math.min(r.xcb,n.PPx-1):Math.min(r.xcb,n.PPx);n.ycb_=a>0?Math.min(r.ycb,n.PPy-1):Math.min(r.ycb,n.PPy);return n}function buildPrecincts(e,t,a){const r=1<t.trx0?Math.ceil(t.trx1/r)-Math.floor(t.trx0/r):0,l=t.try1>t.try0?Math.ceil(t.try1/n)-Math.floor(t.try0/n):0,h=c*l;t.precinctParameters={precinctWidth:r,precinctHeight:n,numprecinctswide:c,numprecinctshigh:l,numprecincts:h,precinctWidthInSubband:s,precinctHeightInSubband:o}}function buildCodeblocks(e,t,a){const r=a.xcb_,n=a.ycb_,i=1<>r,c=t.tby0>>n,l=t.tbx1+i-1>>r,h=t.tby1+s-1>>n,u=t.resolution.precinctParameters,d=[],f=[];let g,p,m,b;for(p=c;pe.cbxMax&&(e.cbxMax=g);pe.cbyMax&&(e.cbyMax=p)}else f[b]=e={cbxMin:g,cbyMin:p,cbxMax:g,cbyMax:p};m.precinct=e}t.codeblockParameters={codeblockWidth:r,codeblockHeight:n,numcodeblockwide:l-o+1,numcodeblockhigh:h-c+1};t.codeblocks=d;t.precincts=f}function createPacket(e,t,a){const r=[],n=e.subbands;for(let e=0,a=n.length;ee.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[c],a=t.precinctParameters.numprecincts;for(;he.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[o],a=t.precinctParameters.numprecincts;for(;he.codingStyleParameters.decompositionLevelsCount)continue;const t=e.resolutions[o],a=t.precinctParameters.numprecincts;if(!(l>=a)){for(;s=0;--e){const a=t.resolutions[e],r=g*a.precinctParameters.precinctWidth,n=g*a.precinctParameters.precinctHeight;h=Math.min(h,r);u=Math.min(u,n);d=Math.max(d,a.precinctParameters.numprecinctswide);f=Math.max(f,a.precinctParameters.numprecinctshigh);l[e]={width:r,height:n};g<<=1}a=Math.min(a,h);r=Math.min(r,u);n=Math.max(n,d);i=Math.max(i,f);s[o]={resolutions:l,minWidth:h,minHeight:u,maxNumWide:d,maxNumHigh:f}}return{components:s,minWidth:a,minHeight:r,maxNumWide:n,maxNumHigh:i}}function buildPackets(e){const t=e.SIZ,a=e.currentTile.index,r=e.tiles[a],n=t.Csiz;for(let e=0;e>>o&(1<0;){const e=i.shift();o=e.codeblock;void 0===o.data&&(o.data=[]);o.data.push({data:t,start:a+s,end:a+s+e.dataLength,codingpasses:e.codingpasses});s+=e.dataLength}}return s}function copyCoefficients(e,t,a,r,n,s,c,l,h){const u=r.tbx0,d=r.tby0,f=r.tbx1-r.tbx0,g=r.codeblocks,p="H"===r.type.charAt(0)?1:0,m="H"===r.type.charAt(1)?t:0;for(let a=0,b=g.length;a=s?U:U*(1<0?1-e:0)}const p=t.subbands[r],m=s[p.type];copyCoefficients(i,a,0,p,g?1:2**(f+m-o)*(1+n/2048),h+o-1,g,u,d)}m.push({width:a,height:n,items:i})}const y=p.calculate(m,r.tcx0,r.tcy0);return{left:r.tcx0,top:r.tcy0,width:y.width,height:y.height,items:y.items}}function initializeTile(e,t){const a=e.SIZ.Csiz,r=e.tiles[t];for(let t=0;t>=1;t>>=1;r++}r--;a=this.levels[r];a.items[a.index]=n;this.currentLevel=r;delete this.value}incrementValue(){const e=this.levels[this.currentLevel];e.items[e.index]++}nextLevel(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];e--;if(e<0){this.value=a;return!1}this.currentLevel=e;t=this.levels[e];t.items[t.index]=a;return!0}}class InclusionTree{constructor(e,t,a){const r=(0,n.log2)(Math.max(e,t))+1;this.levels=[];for(let n=0;na){this.currentLevel=r;this.propagateValues();return!1}e>>=1;t>>=1;r++}this.currentLevel=r-1;return!0}incrementValue(e){const t=this.levels[this.currentLevel];t.items[t.index]=e+1;this.propagateValues()}propagateValues(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];for(;--e>=0;){t=this.levels[e];t.items[t.index]=a}}nextLevel(){let e=this.currentLevel,t=this.levels[e];const a=t.items[t.index];t.items[t.index]=255;e--;if(e<0)return!1;this.currentLevel=e;t=this.levels[e];t.items[t.index]=a;return!0}}const o=function BitModelClosure(){const e=17,t=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]),a=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]),r=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);return class BitModel{constructor(e,n,i,s,o){this.width=e;this.height=n;let c;c="HH"===i?r:"HL"===i?a:t;this.contextLabelTable=c;const l=e*n;this.neighborsSignificance=new Uint8Array(l);this.coefficentsSign=new Uint8Array(l);let h;h=o>14?new Uint32Array(l):o>6?new Uint16Array(l):new Uint8Array(l);this.coefficentsMagnitude=h;this.processingFlags=new Uint8Array(l);const u=new Uint8Array(l);if(0!==s)for(let e=0;e0,o=t+10){c=a-n;s&&(r[c-1]+=16);o&&(r[c+1]+=16);r[c]+=4}if(e+1=a)break;s[d]&=-2;if(r[d]||!i[d])continue;const g=c[i[d]];if(e.readBit(o,g)){const e=this.decodeSignBit(t,u,d);n[d]=e;r[d]=1;this.setNeighborsSignificance(t,u,d);s[d]|=2}l[d]++;s[d]|=1}}}decodeSignBit(e,t,a){const r=this.width,n=this.height,i=this.coefficentsMagnitude,s=this.coefficentsSign;let o,c,l,h,u,d;h=t>0&&0!==i[a-1];if(t+10&&0!==i[a-r];if(e+1=0){u=9+o;d=this.decoder.readBit(this.contexts,u)}else{u=9-o;d=1^this.decoder.readBit(this.contexts,u)}return d}runMagnitudeRefinementPass(){const e=this.decoder,t=this.width,a=this.height,r=this.coefficentsMagnitude,n=this.neighborsSignificance,i=this.contexts,s=this.bitsDecoded,o=this.processingFlags,c=t*a,l=4*t;for(let a,h=0;h>1;let n,i,s,o;const c=-1.586134342059924,l=-.052980118572961,h=.882911075530934,u=.443506852043971,d=1.230174104914001;n=(t|=0)-3;for(i=r+4;i--;n+=2)e[n]*=.8128930661159609;n=t-2;s=u*e[n-1];for(i=r+3;i--;n+=2){o=u*e[n+1];e[n]=d*e[n]-s-o;if(!i--)break;n+=2;s=u*e[n+1];e[n]=d*e[n]-s-o}n=t-1;s=h*e[n-1];for(i=r+2;i--;n+=2){o=h*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=h*e[n+1];e[n]-=s+o}n=t;s=l*e[n-1];for(i=r+1;i--;n+=2){o=l*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=l*e[n+1];e[n]-=s+o}if(0!==r){n=t+1;s=c*e[n-1];for(i=r;i--;n+=2){o=c*e[n+1];e[n]-=s+o;if(!i--)break;n+=2;s=c*e[n+1];e[n]-=s+o}}}}class ReversibleTransform extends Transform{filter(e,t,a){const r=a>>1;let n,i;for(n=t|=0,i=r+1;i--;n+=2)e[n]-=e[n-1]+e[n+1]+2>>2;for(n=t+1,i=r;i--;n+=2)e[n]+=e[n-1]+e[n+1]>>1}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LZWStream=void 0;var r=a(19);class LZWStream extends r.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;const r=4096,n={earlyChange:a,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(r),dictionaryLengths:new Uint16Array(r),dictionaryPrevCodes:new Uint16Array(r),currentSequence:new Uint8Array(r),currentSequenceLength:0};for(let e=0;e<256;++e){n.dictionaryValues[e]=e;n.dictionaryLengths[e]=1}this.lzwState=n}readBits(e){let t=this.bitsCached,a=this.cachedData;for(;t>>t&(1<0;if(e<256){d[0]=e;f=1}else{if(!(e>=258)){if(256===e){h=9;s=258;f=0;continue}this.eof=!0;delete this.lzwState;break}if(e=0;t--){d[t]=o[a];a=l[a]}}else d[f++]=d[0]}if(n){l[s]=u;c[s]=c[u]+1;o[s]=d[0];s++;h=s+i&s+i-1?h:0|Math.min(Math.log(s+i)/.6931471805599453+1,12)}u=e;g+=f;if(r{Object.defineProperty(t,"__esModule",{value:!0});t.PredictorStream=void 0;var r=a(19),n=a(5),i=a(2);class PredictorStream extends r.DecodeStream{constructor(e,t,a){super(t);if(!(a instanceof n.Dict))return e;const r=this.predictor=a.get("Predictor")||1;if(r<=1)return e;if(2!==r&&(r<10||r>15))throw new i.FormatError(`Unsupported predictor: ${r}`);this.readBlock=2===r?this.readBlockTiff:this.readBlockPng;this.str=e;this.dict=e.dict;const s=this.colors=a.get("Colors")||1,o=this.bits=a.get("BPC","BitsPerComponent")||8,c=this.columns=a.get("Columns")||1;this.pixBytes=s*o+7>>3;this.rowBytes=c*s*o+7>>3;return this}readBlockTiff(){const e=this.rowBytes,t=this.bufferLength,a=this.ensureBuffer(t+e),r=this.bits,n=this.colors,i=this.str.getBytes(e);this.eof=!i.length;if(this.eof)return;let s,o=0,c=0,l=0,h=0,u=t;if(1===r&&1===n)for(s=0;s>1;e^=e>>2;e^=e>>4;o=(1&e)<<7;a[u++]=e}else if(8===r){for(s=0;s>8&255;a[u++]=255&e}}else{const e=new Uint8Array(n+1),u=(1<>l-r)&u;l-=r;c=c<=8){a[f++]=c>>h-8&255;h-=8}}h>0&&(a[f++]=(c<<8-h)+(o&(1<<8-h)-1))}this.bufferLength+=e}readBlockPng(){const e=this.rowBytes,t=this.pixBytes,a=this.str.getByte(),r=this.str.getBytes(e);this.eof=!r.length;if(this.eof)return;const n=this.bufferLength,s=this.ensureBuffer(n+e);let o=s.subarray(n-e,n);0===o.length&&(o=new Uint8Array(e));let c,l,h,u=n;switch(a){case 0:for(c=0;c>1)+r[c];for(;c>1)+r[c]&255;u++}break;case 4:for(c=0;c{Object.defineProperty(t,"__esModule",{value:!0});t.RunLengthStream=void 0;var r=a(19);class RunLengthStream extends r.DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict}readBlock(){const e=this.str.getBytes(2);if(!e||e.length<2||128===e[0]){this.eof=!0;return}let t,a=this.bufferLength,r=e[0];if(r<128){t=this.ensureBuffer(a+r+1);t[a++]=e[1];if(r>0){const e=this.str.getBytes(r);t.set(e,a);a+=r}}else{r=257-r;const n=e[1];t=this.ensureBuffer(a+r+1);for(let e=0;e{Object.defineProperty(t,"__esModule",{value:!0});t.Font=t.ErrorFont=void 0;var r=a(2),n=a(35),i=a(38),s=a(40),o=a(39),c=a(37),l=a(41),h=a(42),u=a(43),d=a(44),f=a(45),g=a(46),p=a(16),m=a(47),b=a(6),y=a(10),w=a(48);const S=[[57344,63743],[1048576,1114109]],x=1e3,k=["ascent","bbox","black","bold","charProcOperatorList","composite","cssFontInfo","data","defaultVMetrics","defaultWidth","descent","fallbackName","fontMatrix","fontType","isType3Font","italic","loadedName","mimetype","missingFile","name","remeasure","subtype","type","vertical"],C=["cMap","defaultEncoding","differences","isMonospace","isSerifFont","isSymbolicFont","seacMap","toFontChar","toUnicode","vmetrics","widths"];function adjustWidths(e){if(!e.fontMatrix)return;if(e.fontMatrix[0]===r.FONT_IDENTITY_MATRIX[0])return;const t=.001/e.fontMatrix[0],a=e.widths;for(const e in a)a[e]*=t;e.defaultWidth*=t}function amendFallbackToUnicode(e){if(!e.fallbackToUnicode)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;const t=[];for(const a in e.fallbackToUnicode)e.toUnicode.has(a)||(t[a]=e.fallbackToUnicode[a]);t.length>0&&e.toUnicode.amend(t)}class Glyph{constructor(e,t,a,r,n,i,o,c,l){this.originalCharCode=e;this.fontChar=t;this.unicode=a;this.accent=r;this.width=n;this.vmetric=i;this.operatorListId=o;this.isSpace=c;this.isInFont=l;const h=(0,s.getCharUnicodeCategory)(a);this.isWhitespace=h.isWhitespace;this.isZeroWidthDiacritic=h.isZeroWidthDiacritic;this.isInvisibleFormatMark=h.isInvisibleFormatMark}matchesForCache(e,t,a,r,n,i,s,o,c){return this.originalCharCode===e&&this.fontChar===t&&this.unicode===a&&this.accent===r&&this.width===n&&this.vmetric===i&&this.operatorListId===s&&this.isSpace===o&&this.isInFont===c}}function int16(e,t){return(e<<8)+t}function writeSignedInt16(e,t,a){e[t+1]=a;e[t]=a>>>8}function signedInt16(e,t){const a=(e<<8)+t;return 32768&a?a-65536:a}function string16(e){return String.fromCharCode(e>>8&255,255&e)}function safeString16(e){e>32767?e=32767:e<-32768&&(e=-32768);return String.fromCharCode(e>>8&255,255&e)}function isTrueTypeCollectionFile(e){const t=e.peekBytes(4);return"ttcf"===(0,r.bytesToString)(t)}function getFontFileType(e,{type:t,subtype:a,composite:n}){let i,s;if(function isTrueTypeFile(e){const t=e.peekBytes(4);return 65536===(0,b.readUint32)(t,0)||"true"===(0,r.bytesToString)(t)}(e)||isTrueTypeCollectionFile(e))i=n?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){const t=e.peekBytes(4);return"OTTO"===(0,r.bytesToString)(t)}(e))i=n?"CIDFontType2":"OpenType";else if(function isType1File(e){const t=e.peekBytes(2);return 37===t[0]&&33===t[1]||128===t[0]&&1===t[1]}(e))i=n?"CIDFontType0":"MMType1"===t?"MMType1":"Type1";else if(function isCFFFile(e){const t=e.peekBytes(4);return t[0]>=1&&t[3]>=1&&t[3]<=4}(e))if(n){i="CIDFontType0";s="CIDFontType0C"}else{i="MMType1"===t?"MMType1":"Type1";s="Type1C"}else{(0,r.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");i=t;s=a}return[i,s]}function applyStandardFontGlyphMap(e,t){for(const a in t)e[+a]=t[a]}function buildToFontChar(e,t,a){const r=[];let n;for(let a=0,i=e.length;ad){l++;if(l>=S.length){(0,r.warn)("Ran out of space in font private use area.");break}u=S[l][0];d=S[l][1]}const p=u++;0===g&&(g=a);let m=n.get(f);"string"==typeof m&&(m=m.codePointAt(0));if(m&&m=a||r.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,n]of t)n>=a||r.push({fontCharCode:e,glyphId:n});0===r.length&&r.push({fontCharCode:0,glyphId:0});r.sort((function fontGetRangesSort(e,t){return e.fontCharCode-t.fontCharCode}));const n=[],i=r.length;for(let e=0;e65535?2:1;let s,o,c,l,h="\0\0"+string16(i)+"\0\0"+(0,r.string32)(4+8*i);for(s=n.length-1;s>=0&&!(n[s][0]<=65535);--s);const u=s+1;n[s][0]<65535&&65535===n[s][1]&&(n[s][1]=65534);const d=n[s][1]<65535?1:0,f=u+d,g=m.OpenTypeFileBuilder.getSearchParams(f,2);let p,b,y,w,S="",x="",k="",C="",v="",F=0;for(s=0,o=u;s0){x+="ÿÿ";S+="ÿÿ";k+="\0";C+="\0\0"}const O="\0\0"+string16(2*f)+string16(g.range)+string16(g.entry)+string16(g.rangeShift)+x+"\0\0"+S+k+C+v;let T="",M="";if(i>1){h+="\0\0\n"+(0,r.string32)(4+8*i+4+O.length);T="";for(s=0,o=n.length;se||!l)&&(l=e);h 123 are reserved for internal usage");c|=1<65535&&(h=65535)}else{l=0;h=255}const u=e.bbox||[0,0,0,0],d=a.unitsPerEm||1/(e.fontMatrix||r.FONT_IDENTITY_MATRIX)[0],f=e.ascentScaled?1:d/x,g=a.ascent||Math.round(f*(e.ascent||u[3]));let p=a.descent||Math.round(f*(e.descent||u[1]));p>0&&e.descent>0&&u[1]<0&&(p=-p);const m=a.yMax||g,b=-a.yMin||-p;return"\0$ô\0\0\0Š»\0\0\0ŒŠ»\0\0ß\x001\0\0\0\0"+String.fromCharCode(e.fixedPitch?9:0)+"\0\0\0\0\0\0"+(0,r.string32)(n)+(0,r.string32)(i)+(0,r.string32)(o)+(0,r.string32)(c)+"*21*"+string16(e.italicAngle?1:0)+string16(l||e.firstChar)+string16(h||e.lastChar)+string16(g)+string16(p)+"\0d"+string16(m)+string16(b)+"\0\0\0\0\0\0\0\0"+string16(e.xHeight)+string16(e.capHeight)+string16(0)+string16(l||e.firstChar)+"\0"}function createPostTable(e){const t=Math.floor(65536*e.italicAngle);return"\0\0\0"+(0,r.string32)(t)+"\0\0\0\0"+(0,r.string32)(e.fixedPitch?1:0)+"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}function createPostscriptName(e){return e.replace(/[^\x21-\x7E]|[[\](){}<>/%]/g,"").slice(0,63)}function createNameTable(e,t){t||(t=[[],[]]);const a=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||createPostscriptName(e),t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"],r=[];let n,i,s,o,c;for(n=0,i=a.length;n0;if((p||m)&&"CIDFontType2"===a&&this.cidEncoding.startsWith("Identity-")){const a=e.cidToGidMap,r=[];applyStandardFontGlyphMap(r,(0,l.getGlyphMapForStandardFonts)());/Arial-?Black/i.test(t)?applyStandardFontGlyphMap(r,(0,l.getSupplementalGlyphMapForArialBlack)()):/Calibri/i.test(t)&&applyStandardFontGlyphMap(r,(0,l.getSupplementalGlyphMapForCalibri)());if(a){for(const e in r){const t=r[e];void 0!==a[t]&&(r[+e]=a[t])}a.length!==this.toUnicode.length&&e.hasIncludedToUnicodeMap&&this.toUnicode instanceof h.IdentityToUnicodeMap&&this.toUnicode.forEach((function(e,t){const n=r[e];void 0===a[n]&&(r[+e]=t)}))}this.toUnicode instanceof h.IdentityToUnicodeMap||this.toUnicode.forEach((function(e,t){r[+e]=t}));this.toFontChar=r;this.toUnicode=new h.ToUnicodeMap(r)}else if(/Symbol/i.test(u))this.toFontChar=buildToFontChar(c.SymbolSetEncoding,(0,o.getGlyphsUnicode)(),this.differences);else if(/Dingbats/i.test(u)){/Wingdings/i.test(t)&&(0,r.warn)("Non-embedded Wingdings font, falling back to ZapfDingbats.");this.toFontChar=buildToFontChar(c.ZapfDingbatsEncoding,(0,o.getDingbatsGlyphsUnicode)(),this.differences)}else if(p){const e=buildToFontChar(this.defaultEncoding,(0,o.getGlyphsUnicode)(),this.differences);"CIDFontType2"!==a||this.cidEncoding.startsWith("Identity-")||this.toUnicode instanceof h.IdentityToUnicodeMap||this.toUnicode.forEach((function(t,a){e[+t]=a}));this.toFontChar=e}else{const e=(0,o.getGlyphsUnicode)(),a=[];this.toUnicode.forEach(((t,r)=>{if(!this.composite){const a=this.differences[t]||this.defaultEncoding[t],n=(0,s.getUnicodeForGlyph)(a,e);-1!==n&&(r=n)}a[+t]=r}));this.composite&&this.toUnicode instanceof h.IdentityToUnicodeMap&&/Verdana/i.test(t)&&applyStandardFontGlyphMap(a,(0,l.getGlyphMapForStandardFonts)());this.toFontChar=a}amendFallbackToUnicode(e);this.loadedName=u.split("-")[0];this.fontType=(0,i.getFontType)(a,n,e.isStandardFont)}checkAndRepair(e,t,a){const s=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function readTables(e,t){const a=Object.create(null);a["OS/2"]=null;a.cmap=null;a.head=null;a.hhea=null;a.hmtx=null;a.maxp=null;a.name=null;a.post=null;for(let r=0;r>>0,r=e.getInt32()>>>0,n=e.getInt32()>>>0,i=e.pos;e.pos=e.start||0;e.skip(r);const s=e.getBytes(n);e.pos=i;if("head"===t){s[8]=s[9]=s[10]=s[11]=0;s[17]|=32}return{tag:t,checksum:a,length:n,offset:r,data:s}}function readOpenTypeHeader(e){return{version:e.getString(4),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function sanitizeGlyph(e,t,a,r,n,i){const s={length:0,sizeOfInstructions:0};if(a-t<=12)return s;const o=e.subarray(t,a);let c=signedInt16(o[0],o[1]);if(c<0){c=-1;writeSignedInt16(o,0,c);r.set(o,n);s.length=o.length;return s}let l,h=10,u=0;for(l=0;lo.length)return s;if(!i&&f>0){r.set(o.subarray(0,d),n);r.set([0,0],n+d);r.set(o.subarray(g,m),n+d+2);m-=f;o.length-m>3&&(m=m+3&-4);s.length=m;return s}if(o.length-m>3){m=m+3&-4;r.set(o.subarray(0,m),n);s.length=m;return s}r.set(o,n);s.length=o.length;return s}function readNameTable(e){const a=(t.start||0)+e.offset;t.pos=a;const r=[[],[]],n=e.length,i=a+n;if(0!==t.getUint16()||n<6)return r;const s=t.getUint16(),o=t.getUint16(),c=[];let l,h;for(l=0;li)continue;t.pos=n;const s=e.name;if(e.encoding){let a="";for(let r=0,n=e.length;r0&&(h+=e-1)}}else{if(b||w){(0,r.warn)("TT: nested FDEFs not allowed");m=!0}b=!0;d=h;s=f.pop();t.functionsDefined[s]={data:c,i:h}}else if(!b&&!w){s=f.at(-1);if(isNaN(s))(0,r.info)("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[s]=!0;if(s in t.functionsStackDeltas){const e=f.length+t.functionsStackDeltas[s];if(e<0){(0,r.warn)("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}f.length=e}else if(s in t.functionsDefined&&!p.includes(s)){g.push({data:c,i:h,stackTop:f.length-1});p.push(s);o=t.functionsDefined[s];if(!o){(0,r.warn)("TT: CALL non-existent function");t.hintsValid=!1;return}c=o.data;h=o.i}}}if(!b&&!w){let t=0;e<=142?t=l[e]:e>=192&&e<=223?t=-1:e>=224&&(t=-2);if(e>=113&&e<=117){n=f.pop();isNaN(n)||(t=2*-n)}for(;t<0&&f.length>0;){f.pop();t++}for(;t>0;){f.push(NaN);t--}}}t.tooComplexToFollowFunctions=m;const S=[c];h>c.length&&S.push(new Uint8Array(h-c.length));if(d>u){(0,r.warn)("TT: complementing a missing function tail");S.push(new Uint8Array([34,45]))}!function foldTTTable(e,t){if(t.length>1){let a,r,n=0;for(a=0,r=t.length;a>>0,s=[];for(let t=0;t>>0);const o={ttcTag:t,majorVersion:a,minorVersion:n,numFonts:i,offsetTable:s};switch(a){case 1:return o;case 2:o.dsigTag=e.getInt32()>>>0;o.dsigLength=e.getInt32()>>>0;o.dsigOffset=e.getInt32()>>>0;return o}throw new r.FormatError(`Invalid TrueType Collection majorVersion: ${a}.`)}(e),i=t.split("+");let s;for(let o=0;o0||!(a.cMap instanceof p.IdentityCMap));if("OTTO"===d.version&&!t||!f.head||!f.hhea||!f.maxp||!f.post){w=new y.Stream(f["CFF "].data);b=new u.CFFFont(w,a);adjustWidths(a);return this.convert(e,b,a)}delete f.glyf;delete f.loca;delete f.fpgm;delete f.prep;delete f["cvt "];this.isOpenType=!0}if(!f.maxp)throw new r.FormatError('Required "maxp" table is not found');t.pos=(t.start||0)+f.maxp.offset;const x=t.getInt32(),k=t.getUint16();if(a.scaleFactors&&a.scaleFactors.length===k&&S){const{scaleFactors:e}=a,t=int16(f.head.data[50],f.head.data[51]),r=new g.GlyfTable({glyfTable:f.glyf.data,isGlyphLocationsLong:t,locaTable:f.loca.data,numGlyphs:k});r.scale(e);const{glyf:n,loca:i,isLocationLong:s}=r.write();f.glyf.data=n;f.loca.data=i;if(s!==!!t){f.head.data[50]=0;f.head.data[51]=s?1:0}const o=f.hmtx.data;for(let t=0;t>8&255;o[a+1]=255&r;writeSignedInt16(o,a+2,Math.round(e[t]*signedInt16(o[a+2],o[a+3])))}}let C=k+1,v=!0;if(C>65535){v=!1;C=k;(0,r.warn)("Not enough space in glyfs to duplicate first glyph.")}let F=0,O=0;if(x>=65536&&f.maxp.length>=22){t.pos+=8;if(t.getUint16()>2){f.maxp.data[14]=0;f.maxp.data[15]=2}t.pos+=4;F=t.getUint16();t.pos+=4;O=t.getUint16()}f.maxp.data[4]=C>>8;f.maxp.data[5]=255&C;const T=function sanitizeTTPrograms(e,t,a,n){const i={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,i);t&&sanitizeTTProgram(t,i);e&&function checkInvalidFunctions(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){(0,r.warn)("TT: more functions defined than expected");e.hintsValid=!1}else for(let a=0,n=e.functionsUsed.length;at){(0,r.warn)("TT: invalid function id: "+a);e.hintsValid=!1;return}if(e.functionsUsed[a]&&!e.functionsDefined[a]){(0,r.warn)("TT: undefined function: "+a);e.hintsValid=!1;return}}}(i,n);if(a&&1&a.length){const e=new Uint8Array(a.length+1);e.set(a.data);a.data=e}return i.hintsValid}(f.fpgm,f.prep,f["cvt "],F);if(!T){delete f.fpgm;delete f.prep;delete f["cvt "]}!function sanitizeMetrics(e,t,a,n,i,s){if(!t){a&&(a.data=null);return}e.pos=(e.start||0)+t.offset;e.pos+=4;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;e.pos+=2;const o=e.getUint16();e.pos+=8;e.pos+=2;let c=e.getUint16();if(0!==o){if(!(2&int16(n.data[44],n.data[45]))){t.data[22]=0;t.data[23]=0}}if(c>i){(0,r.info)(`The numOfMetrics (${c}) should not be greater than the numGlyphs (${i}).`);c=i;t.data[34]=(65280&c)>>8;t.data[35]=255&c}const l=i-c-(a.length-4*c>>1);if(l>0){const e=new Uint8Array(a.length+2*l);e.set(a.data);if(s){e[a.length]=a.data[2];e[a.length+1]=a.data[3]}a.data=e}}(t,f.hhea,f.hmtx,f.head,C,v);if(!f.head)throw new r.FormatError('Required "head" table is not found');!function sanitizeHead(e,t,a){const n=e.data,i=function int32(e,t,a,r){return(e<<24)+(t<<16)+(a<<8)+r}(n[0],n[1],n[2],n[3]);if(i>>16!=1){(0,r.info)("Attempting to fix invalid version in head table: "+i);n[0]=0;n[1]=1;n[2]=0;n[3]=0}const s=int16(n[50],n[51]);if(s<0||s>1){(0,r.info)("Attempting to fix invalid indexToLocFormat in head table: "+s);const e=t+1;if(a===e<<1){n[50]=0;n[51]=0}else{if(a!==e<<2)throw new r.FormatError("Could not fix indexToLocFormat: "+s);n[50]=0;n[51]=1}}}(f.head,k,S?f.loca.length:0);let M=Object.create(null);if(S){const e=int16(f.head.data[50],f.head.data[51]),t=function sanitizeGlyphLocations(e,t,a,r,n,i,s){let o,c,l;if(r){o=4;c=function fontItemDecodeLong(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};l=function fontItemEncodeLong(e,t,a){e[t]=a>>>24&255;e[t+1]=a>>16&255;e[t+2]=a>>8&255;e[t+3]=255&a}}else{o=2;c=function fontItemDecode(e,t){return e[t]<<9|e[t+1]<<1};l=function fontItemEncode(e,t,a){e[t]=a>>9&255;e[t+1]=a>>1&255}}const h=i?a+1:a,u=o*(1+h),d=new Uint8Array(u);d.set(e.data.subarray(0,u));e.data=d;const f=t.data,g=f.length,p=new Uint8Array(g);let m,b;const y=[];for(m=0,b=0;mg&&(e=g);y.push({index:m,offset:e,endOffset:0})}y.sort(((e,t)=>e.offset-t.offset));for(m=0;me.index-t.index));for(m=0;ms&&(s=e.sizeOfInstructions);S+=t;l(d,b,S)}if(0===S){const e=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(m=0,b=o;ma+S)t.data=p.subarray(0,a+S);else{t.data=new Uint8Array(a+S);t.data.set(p.subarray(0,S))}t.data.set(p.subarray(0,a),S);l(e.data,d.length-o,S+a)}else t.data=p.subarray(0,S);return{missingGlyphs:w,maxSizeOfInstructions:s}}(f.loca,f.glyf,k,e,T,v,O);M=t.missingGlyphs;if(x>=65536&&f.maxp.length>=22){f.maxp.data[26]=t.maxSizeOfInstructions>>8;f.maxp.data[27]=255&t.maxSizeOfInstructions}}if(!f.hhea)throw new r.FormatError('Required "hhea" table is not found');if(0===f.hhea.data[10]&&0===f.hhea.data[11]){f.hhea.data[10]=255;f.hhea.data[11]=255}const E={unitsPerEm:int16(f.head.data[18],f.head.data[19]),yMax:int16(f.head.data[42],f.head.data[43]),yMin:signedInt16(f.head.data[38],f.head.data[39]),ascent:signedInt16(f.hhea.data[4],f.hhea.data[5]),descent:signedInt16(f.hhea.data[6],f.hhea.data[7]),lineGap:signedInt16(f.hhea.data[8],f.hhea.data[9])};this.ascent=E.ascent/E.unitsPerEm;this.descent=E.descent/E.unitsPerEm;this.lineGap=E.lineGap/E.unitsPerEm;if(this.cssFontInfo&&this.cssFontInfo.lineHeight){this.lineHeight=this.cssFontInfo.metrics.lineHeight;this.lineGap=this.cssFontInfo.metrics.lineGap}else this.lineHeight=this.ascent-this.descent+this.lineGap;f.post&&function readPostScriptTable(e,a,n){const s=(t.start||0)+e.offset;t.pos=s;const o=s+e.length,c=t.getInt32();t.skip(28);let l,h,u=!0;switch(c){case 65536:l=i.MacStandardGlyphOrdering;break;case 131072:const e=t.getUint16();if(e!==n){u=!1;break}const s=[];for(h=0;h=32768){u=!1;break}s.push(e)}if(!u)break;const d=[],f=[];for(;t.pos65535)throw new r.FormatError("Max size of CID is 65,535");let i=-1;t?i=n:void 0!==e[n]&&(i=e[n]);i>=0&&i>>0;let h=!1;if(!c||c.platformId!==r||c.encodingId!==i){if(0!==r||0!==i&&1!==i&&3!==i)if(1===r&&0===i)h=!0;else if(3!==r||1!==i||!n&&c){if(a&&3===r&&0===i){h=!0;let a=!0;if(e>3;e.push(r);a=Math.max(r,a)}const r=[];for(let e=0;e<=a;e++)r.push({firstCode:t.getUint16(),entryCount:t.getUint16(),idDelta:signedInt16(t.getByte(),t.getByte()),idRangePos:t.pos+t.getUint16()});for(let a=0;a<256;a++)if(0===e[a]){t.pos=r[0].idRangePos+2*a;g=t.getUint16();d.push({charCode:a,glyphId:g})}else{const n=r[e[a]];for(f=0;f>1;t.skip(6);const a=[];let r;for(r=0;r>1)-(e-r);i.offsetIndex=n;o=Math.max(o,n+i.end-i.start+1)}else i.offsetIndex=-1}const c=[];for(f=0;f>>0;for(f=0;f>>0,a=t.getInt32()>>>0;let r=t.getInt32()>>>0;for(let t=e;t<=a;t++)d.push({charCode:t,glyphId:r++})}}}d.sort((function(e,t){return e.charCode-t.charCode}));for(let e=1;e=61440&&t<=61695&&(t&=255);D[t]=l[e].glyphId}if(a.glyphNames&&(d.length||this.differences.length))for(let e=0;e<256;++e){if(!g&&void 0!==D[e])continue;const t=this.differences[e]||d[e];if(!t)continue;const r=a.glyphNames.indexOf(t);r>0&&hasGlyph(r)&&(D[e]=r)}}0===D.length&&(D[0]=0);let N=C-1;v||(N=0);if(!a.cssFontInfo){const e=adjustMapping(D,hasGlyph,N,this.toUnicode);this.toFontChar=e.toFontChar;f.cmap={tag:"cmap",data:createCmapTable(e.charCodeToGlyphId,e.toUnicodeExtraMap,C)};f["OS/2"]&&function validateOS2Table(e,t){t.pos=(t.start||0)+e.offset;const a=t.getUint16();t.skip(60);const r=t.getUint16();if(a<4&&768&r)return!1;if(t.getUint16()>t.getUint16())return!1;t.skip(6);if(0===t.getUint16())return!1;e.data[8]=e.data[9]=0;return!0}(f["OS/2"],t)||(f["OS/2"]={tag:"OS/2",data:createOS2Table(a,e.charCodeToGlyphId,E)})}if(!S)try{w=new y.Stream(f["CFF "].data);b=new n.CFFParser(w,a,i.SEAC_ANALYSIS_ENABLED).parse();b.duplicateFirstGlyph();const e=new n.CFFCompiler(b);f["CFF "].data=e.compile()}catch(e){(0,r.warn)("Failed to compile font "+a.loadedName)}if(f.name){const t=readNameTable(f.name);f.name.data=createNameTable(e,t);this.psName=t[0][6]||null}else f.name={tag:"name",data:createNameTable(this.name)};const R=new m.OpenTypeFileBuilder(d.version);for(const e in f)R.addTable(e,f[e].data);return R.toArray()}convert(e,t,a){a.fixedPitch=!1;a.builtInEncoding&&function adjustToUnicode(e,t){if(e.isInternalFont)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;const a=[],r=(0,o.getGlyphsUnicode)();for(const n in t){if(e.hasIncludedToUnicodeMap){if(e.toUnicode.has(n))continue}else if(e.hasEncoding&&(0===e.differences.length||void 0!==e.differences[n]))continue;const i=t[n],o=(0,s.getUnicodeForGlyph)(i,r);-1!==o&&(a[n]=String.fromCharCode(o))}a.length>0&&e.toUnicode.amend(a)}(a,a.builtInEncoding);let n=1;t instanceof u.CFFFont&&(n=t.numGlyphs-1);const l=t.getGlyphMapping(a);let d=null,f=l,g=null;if(!a.cssFontInfo){d=adjustMapping(l,t.hasGlyphId.bind(t),n,this.toUnicode);this.toFontChar=d.toFontChar;f=d.charCodeToGlyphId;g=d.toUnicodeExtraMap}const p=t.numGlyphs;function getCharCodes(e,t){let a=null;for(const r in e)if(t===e[r]){a||(a=[]);a.push(0|r)}return a}function createCharCode(e,t){for(const a in e)if(t===e[a])return 0|a;d.charCodeToGlyphId[d.nextAvailableFontCharCode]=t;return d.nextAvailableFontCharCode++}const b=t.seacs;if(d&&i.SEAC_ANALYSIS_ENABLED&&b&&b.length){const e=a.fontMatrix||r.FONT_IDENTITY_MATRIX,n=t.getCharset(),i=Object.create(null);for(let t in b){t|=0;const a=b[t],r=c.StandardEncoding[a[2]],s=c.StandardEncoding[a[3]],o=n.indexOf(r),h=n.indexOf(s);if(o<0||h<0)continue;const u={x:a[0]*e[0]+a[1]*e[2]+e[4],y:a[0]*e[1]+a[1]*e[3]+e[5]},f=getCharCodes(l,t);if(f)for(let e=0,t=f.length;et.length%2==1,r=this.toUnicode instanceof h.IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let n=0,i=e.length;n55295&&(i<57344||i>65533)&&n++;if(this.toUnicode){const e=r(i);if(-1!==e){if(hasCurrentBufErrors()){t.push(a.join(""));a.length=0}for(let t=(this.cMap?this.cMap.getCharCodeLength(e):1)-1;t>=0;t--)a.push(String.fromCharCode(e>>8*t&255));continue}}if(!hasCurrentBufErrors()){t.push(a.join(""));a.length=0}a.push(String.fromCodePoint(i))}t.push(a.join(""));return t}};t.ErrorFont=class ErrorFont{constructor(e){this.error=e;this.loadedName="g_font_error";this.missingFile=!0}charsToGlyphs(){return[]}encodeString(e){return[e]}exportData(e=!1){return{error:this.error}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CFFTopDict=t.CFFStrings=t.CFFStandardStrings=t.CFFPrivateDict=t.CFFParser=t.CFFIndex=t.CFFHeader=t.CFFFDSelect=t.CFFCompiler=t.CFFCharset=t.CFF=void 0;var r=a(2),n=a(36),i=a(37);const s=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"];t.CFFStandardStrings=s;const o=391,c=[null,{id:"hstem",min:2,stackClearing:!0,stem:!0},null,{id:"vstem",min:2,stackClearing:!0,stem:!0},{id:"vmoveto",min:1,stackClearing:!0},{id:"rlineto",min:2,resetStack:!0},{id:"hlineto",min:1,resetStack:!0},{id:"vlineto",min:1,resetStack:!0},{id:"rrcurveto",min:6,resetStack:!0},null,{id:"callsubr",min:1,undefStack:!0},{id:"return",min:0,undefStack:!0},null,null,{id:"endchar",min:0,stackClearing:!0},null,null,null,{id:"hstemhm",min:2,stackClearing:!0,stem:!0},{id:"hintmask",min:0,stackClearing:!0},{id:"cntrmask",min:0,stackClearing:!0},{id:"rmoveto",min:2,stackClearing:!0},{id:"hmoveto",min:1,stackClearing:!0},{id:"vstemhm",min:2,stackClearing:!0,stem:!0},{id:"rcurveline",min:8,resetStack:!0},{id:"rlinecurve",min:8,resetStack:!0},{id:"vvcurveto",min:4,resetStack:!0},{id:"hhcurveto",min:4,resetStack:!0},null,{id:"callgsubr",min:1,undefStack:!0},{id:"vhcurveto",min:4,resetStack:!0},{id:"hvcurveto",min:4,resetStack:!0}],l=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]+e[t-1]}},{id:"sub",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]-e[t-1]}},{id:"div",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]/e[t-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn(e,t){e[t-1]=-e[t-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn(e,t){e[t-2]=e[t-2]*e[t-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:!0},{id:"flex",min:13,resetStack:!0},{id:"hflex1",min:9,resetStack:!0},{id:"flex1",min:11,resetStack:!0}];t.CFFParser=class CFFParser{constructor(e,t,a){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!a}parse(){const e=this.properties,t=new CFF;this.cff=t;const a=this.parseHeader(),r=this.parseIndex(a.endPos),n=this.parseIndex(r.endPos),i=this.parseIndex(n.endPos),s=this.parseIndex(i.endPos),o=this.parseDict(n.obj.get(0)),c=this.createDict(CFFTopDict,o,t.strings);t.header=a.obj;t.names=this.parseNameIndex(r.obj);t.strings=this.parseStringIndex(i.obj);t.topDict=c;t.globalSubrIndex=s.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=c.hasName("ROS");const l=c.getByName("CharStrings"),h=this.parseIndex(l).obj,u=c.getByName("FontMatrix");u&&(e.fontMatrix=u);const d=c.getByName("FontBBox");if(d){e.ascent=Math.max(d[3],d[1]);e.descent=Math.min(d[1],d[3]);e.ascentScaled=!0}let f,g;if(t.isCIDFont){const e=this.parseIndex(c.getByName("FDArray")).obj;for(let a=0,r=e.count;a=t)throw new r.FormatError("Invalid CFF header");if(0!==a){(0,r.info)("cff data is shifted");e=e.subarray(a);this.bytes=e}const n=e[0],i=e[1],s=e[2],o=e[3];return{obj:new CFFHeader(n,i,s,o),endPos:s}}parseDict(e){let t=0;function parseOperand(){let a=e[t++];if(30===a)return function parseFloatOperand(){let a="";const r=15,n=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],i=e.length;for(;t>4,o=15&i;if(s===r)break;a+=n[s];if(o===r)break;a+=n[o]}return parseFloat(a)}();if(28===a){a=e[t++];a=(a<<24|e[t++]<<16)>>16;return a}if(29===a){a=e[t++];a=a<<8|e[t++];a=a<<8|e[t++];a=a<<8|e[t++];return a}if(a>=32&&a<=246)return a-139;if(a>=247&&a<=250)return 256*(a-247)+e[t++]+108;if(a>=251&&a<=254)return-256*(a-251)-e[t++]-108;(0,r.warn)('CFFParser_parseDict: "'+a+'" is a reserved command.');return NaN}let a=[];const n=[];t=0;const i=e.length;for(;t10)return!1;let i=e.stackSize;const s=e.stack,o=t.length;for(let h=0;h>16;h+=2;i++}else if(14===o){if(i>=4){i-=4;if(this.seacAnalysisEnabled){e.seac=s.slice(i,i+4);return!1}}u=c[o]}else if(o>=32&&o<=246){s[i]=o-139;i++}else if(o>=247&&o<=254){s[i]=o<251?(o-247<<8)+t[h]+108:-(o-251<<8)-t[h]-108;h++;i++}else if(255===o){s[i]=(t[h]<<24|t[h+1]<<16|t[h+2]<<8|t[h+3])/65536;h+=4;i++}else if(19===o||20===o){e.hints+=i>>1;h+=e.hints+7>>3;i%=2;u=c[o]}else{if(10===o||29===o){let t;t=10===o?a:n;if(!t){u=c[o];(0,r.warn)("Missing subrsIndex for "+u.id);return!1}let l=32768;t.count<1240?l=107:t.count<33900&&(l=1131);const h=s[--i]+l;if(h<0||h>=t.count||isNaN(h)){u=c[o];(0,r.warn)("Out of bounds subrIndex for "+u.id);return!1}e.stackSize=i;e.callDepth++;if(!this.parseCharString(e,t.get(h),a,n))return!1;e.callDepth--;i=e.stackSize;continue}if(11===o){e.stackSize=i;return!0}if(0===o&&h===t.length){t[h-1]=14;u=c[14]}else u=c[o]}if(u){if(u.stem){e.hints+=i>>1;if(3===o||23===o)e.hasVStems=!0;else if(e.hasVStems&&(1===o||18===o)){(0,r.warn)("CFF stem hints are in wrong order");t[h-1]=1===o?3:23}}if("min"in u&&!e.undefStack&&i=2&&u.stem?i%=2:i>1&&(0,r.warn)("Found too many parameters for stack-clearing command");i>0&&(e.width=s[i-1])}if("stackDelta"in u){"stackFn"in u&&u.stackFn(s,i);i+=u.stackDelta}else if(u.stackClearing)i=0;else if(u.resetStack){i=0;e.undefStack=!1}else if(u.undefStack){i=0;e.undefStack=!0;e.firstStackClearing=!1}}}e.stackSize=i;return!0}parseCharStrings({charStrings:e,localSubrIndex:t,globalSubrIndex:a,fdSelect:n,fdArray:i,privateDict:s}){const o=[],c=[],l=e.count;for(let h=0;h=i.length){(0,r.warn)("Invalid fd index for glyph index.");d=!1}if(d){g=i[e].privateDict;f=g.subrsIndex}}else t&&(f=t);d&&(d=this.parseCharString(u,l,f,a));if(null!==u.width){const e=g.getByName("nominalWidthX");c[h]=e+u.width}else{const e=g.getByName("defaultWidthX");c[h]=e}null!==u.seac&&(o[h]=u.seac);d||e.set(h,new Uint8Array([14]))}return{charStrings:e,seacs:o,widths:c}}emptyPrivateDictionary(e){const t=this.createDict(CFFPrivateDict,[],e.strings);e.setByKey(18,[0,0]);e.privateDict=t}parsePrivateDict(e){if(!e.hasName("Private")){this.emptyPrivateDictionary(e);return}const t=e.getByName("Private");if(!Array.isArray(t)||2!==t.length){e.removeByName("Private");return}const a=t[0],r=t[1];if(0===a||r>=this.bytes.length){this.emptyPrivateDictionary(e);return}const n=r+a,i=this.bytes.subarray(r,n),s=this.parseDict(i),o=this.createDict(CFFPrivateDict,s,e.strings);e.privateDict=o;if(!o.getByName("Subrs"))return;const c=o.getByName("Subrs"),l=r+c;if(0===c||l>=this.bytes.length){this.emptyPrivateDictionary(e);return}const h=this.parseIndex(l);o.subrsIndex=h.obj}parseCharsets(e,t,a,i){if(0===e)return new CFFCharset(!0,d.ISO_ADOBE,n.ISOAdobeCharset);if(1===e)return new CFFCharset(!0,d.EXPERT,n.ExpertCharset);if(2===e)return new CFFCharset(!0,d.EXPERT_SUBSET,n.ExpertSubsetCharset);const s=this.bytes,o=e,c=s[e++],l=[i?0:".notdef"];let h,u,f;t-=1;switch(c){case 0:for(f=0;f=65535){(0,r.warn)("Not enough space in charstrings to duplicate first glyph.");return}const e=this.charStrings.get(0);this.charStrings.add(e);this.isCIDFont&&this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0])}hasGlyphId(e){if(e<0||e>=this.charStrings.count)return!1;return this.charStrings.get(e).length>0}}t.CFF=CFF;class CFFHeader{constructor(e,t,a,r){this.major=e;this.minor=t;this.hdrSize=a;this.offSize=r}}t.CFFHeader=CFFHeader;class CFFStrings{constructor(){this.strings=[]}get(e){return e>=0&&e<=390?s[e]:e-o<=this.strings.length?this.strings[e-o]:s[0]}getSID(e){let t=s.indexOf(e);if(-1!==t)return t;t=this.strings.indexOf(e);return-1!==t?t+o:-1}add(e){this.strings.push(e)}get count(){return this.strings.length}}t.CFFStrings=CFFStrings;class CFFIndex{constructor(){this.objects=[];this.length=0}add(e){this.length+=e.length;this.objects.push(e)}set(e,t){this.length+=t.length-this.objects[e].length;this.objects[e]=t}get(e){return this.objects[e]}get count(){return this.objects.length}}t.CFFIndex=CFFIndex;class CFFDict{constructor(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}setByKey(e,t){if(!(e in this.keyToNameMap))return!1;const a=t.length;if(0===a)return!0;for(let n=0;n=this.fdSelect.length?-1:this.fdSelect[e]}}t.CFFFDSelect=CFFFDSelect;class CFFOffsetTracker{constructor(){this.offsets=Object.create(null)}isTracking(e){return e in this.offsets}track(e,t){if(e in this.offsets)throw new r.FormatError(`Already tracking location of ${e}`);this.offsets[e]=t}offset(e){for(const t in this.offsets)this.offsets[t]+=e}setEntryLocation(e,t,a){if(!(e in this.offsets))throw new r.FormatError(`Not tracking location of ${e}`);const n=a.data,i=this.offsets[e];for(let e=0,a=t.length;e>24&255;n[o]=h>>16&255;n[c]=h>>8&255;n[l]=255&h}}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t={data:[],length:0,add(e){this.data=this.data.concat(e);this.length=this.data.length}},a=this.compileHeader(e.header);t.add(a);const n=this.compileNameIndex(e.names);t.add(n);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(let a=0,n=e.fdArray.length;a16&&e.topDict.removeByName("XUID");e.topDict.setByName("charset",0);let s=this.compileTopDicts([e.topDict],t.length,e.isCIDFont);t.add(s.output);const o=s.trackers[0],c=this.compileStringIndex(e.strings.strings);t.add(c);const l=this.compileIndex(e.globalSubrIndex);t.add(l);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)o.setEntryLocation("Encoding",[e.encoding.format],t);else{const a=this.compileEncoding(e.encoding);o.setEntryLocation("Encoding",[t.length],t);t.add(a)}const h=this.compileCharset(e.charset,e.charStrings.count,e.strings,e.isCIDFont);o.setEntryLocation("charset",[t.length],t);t.add(h);const u=this.compileCharStrings(e.charStrings);o.setEntryLocation("CharStrings",[t.length],t);t.add(u);if(e.isCIDFont){o.setEntryLocation("FDSelect",[t.length],t);const a=this.compileFDSelect(e.fdSelect);t.add(a);s=this.compileTopDicts(e.fdArray,t.length,!0);o.setEntryLocation("FDArray",[t.length],t);t.add(s.output);const r=s.trackers;this.compilePrivateDicts(e.fdArray,r,t)}this.compilePrivateDicts([e.topDict],[o],t);t.add([0]);return t.data}encodeNumber(e){return Number.isInteger(e)?this.encodeInteger(e):this.encodeFloat(e)}static get EncodeFloatRegExp(){return(0,r.shadow)(this,"EncodeFloatRegExp",/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/)}encodeFloat(e){let t=e.toString();const a=CFFCompiler.EncodeFloatRegExp.exec(t);if(a){const r=parseFloat("1e"+((a[2]?+a[2]:0)+a[1].length));t=(Math.round(e*r)/r).toString()}let r,n,i="";for(r=0,n=t.length;r=-107&&e<=107?[e+139]:e>=108&&e<=1131?[247+((e-=108)>>8),255&e]:e>=-1131&&e<=-108?[251+((e=-e-108)>>8),255&e]:e>=-32768&&e<=32767?[28,e>>8&255,255&e]:[29,e>>24&255,e>>16&255,e>>8&255,255&e];return t}compileHeader(e){return[e.major,e.minor,4,e.offSize]}compileNameIndex(e){const t=new CFFIndex;for(let a=0,n=e.length;a"~"||"["===t||"]"===t||"("===t||")"===t||"{"===t||"}"===t||"<"===t||">"===t||"/"===t||"%"===t)&&(t="_");s[e]=t}s=s.join("");""===s&&(s="Bad_Font_Name");t.add((0,r.stringToBytes)(s))}return this.compileIndex(t)}compileTopDicts(e,t,a){const r=[];let n=new CFFIndex;for(let i=0,s=e.length;i>8&255,255&s]);else{i=new Uint8Array(1+2*s);i[0]=0;let t=0;const n=e.charset.length;let o=!1;for(let s=1;s>8&255;i[s+1]=255&c}}return this.compileTypedArray(i)}compileEncoding(e){return this.compileTypedArray(e.raw)}compileFDSelect(e){const t=e.format;let a,r;switch(t){case 0:a=new Uint8Array(1+e.fdSelect.length);a[0]=t;for(r=0;r>8&255,255&n,i];for(r=1;r>8&255,255&r,t);i=t}}const o=(s.length-3)/3;s[1]=o>>8&255;s[2]=255&o;s.push(r>>8&255,255&r);a=new Uint8Array(s)}return this.compileTypedArray(a)}compileTypedArray(e){const t=[];for(let a=0,r=e.length;a>8&255,255&r];let i,s,o=1;for(i=0;i>8&255,255&c):3===s?n.push(c>>16&255,c>>8&255,255&c):n.push(c>>>24&255,c>>16&255,c>>8&255,255&c);a[i]&&(c+=a[i].length)}for(i=0;i{Object.defineProperty(t,"__esModule",{value:!0});t.ISOAdobeCharset=t.ExpertSubsetCharset=t.ExpertCharset=void 0;t.ISOAdobeCharset=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"];t.ExpertCharset=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];t.ExpertSubsetCharset=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"]},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ZapfDingbatsEncoding=t.WinAnsiEncoding=t.SymbolSetEncoding=t.StandardEncoding=t.MacRomanEncoding=t.ExpertEncoding=void 0;t.getEncoding=function getEncoding(e){switch(e){case"WinAnsiEncoding":return s;case"StandardEncoding":return i;case"MacRomanEncoding":return n;case"SymbolSetEncoding":return o;case"ZapfDingbatsEncoding":return c;case"ExpertEncoding":return a;case"MacExpertEncoding":return r;default:return null}};const a=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];t.ExpertEncoding=a;const r=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior","centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall","","","",""],n=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"];t.MacRomanEncoding=n;const i=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls","","","",""];t.StandardEncoding=i;const s=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn","ydieresis"];t.WinAnsiEncoding=s;const o=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon","Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset","intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt","bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt",""];t.SymbolSetEncoding=o;const c=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191",""];t.ZapfDingbatsEncoding=c},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SEAC_ANALYSIS_ENABLED=t.MacStandardGlyphOrdering=t.FontFlags=void 0;t.getFontType=function getFontType(e,t,a=!1){switch(e){case"Type1":return a?r.FontType.TYPE1STANDARD:"Type1C"===t?r.FontType.TYPE1C:r.FontType.TYPE1;case"CIDFontType0":return"CIDFontType0C"===t?r.FontType.CIDFONTTYPE0C:r.FontType.CIDFONTTYPE0;case"OpenType":return r.FontType.OPENTYPE;case"TrueType":return r.FontType.TRUETYPE;case"CIDFontType2":return r.FontType.CIDFONTTYPE2;case"MMType1":return r.FontType.MMTYPE1;case"Type0":return r.FontType.TYPE0;default:return r.FontType.UNKNOWN}};t.normalizeFontName=function normalizeFontName(e){return e.replace(/[,_]/g,"-").replace(/\s/g,"")};t.recoverGlyphName=recoverGlyphName;t.type1FontGlyphMapping=function type1FontGlyphMapping(e,t,a){const r=Object.create(null);let s,c,l;const h=!!(e.flags&o.Symbolic);if(e.isInternalFont){l=t;for(c=0;c=0?s:0}}else if(e.baseEncodingName){l=(0,n.getEncoding)(e.baseEncodingName);for(c=0;c=0?s:0}}else if(h)for(c in t)r[c]=t[c];else{l=n.StandardEncoding;for(c=0;c=0?s:0}}const u=e.differences;let d;if(u)for(c in u){const e=u[c];s=a.indexOf(e);if(-1===s){d||(d=(0,i.getGlyphsUnicode)());const t=recoverGlyphName(e,d);t!==e&&(s=a.indexOf(t))}r[c]=s>=0?s:0}return r};var r=a(2),n=a(37),i=a(39),s=a(40);t.SEAC_ANALYSIS_ENABLED=!0;const o={FixedPitch:1,Serif:2,Symbolic:4,Script:8,Nonsymbolic:32,Italic:64,AllCap:65536,SmallCap:131072,ForceBold:262144};t.FontFlags=o;t.MacStandardGlyphOrdering=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior","threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function recoverGlyphName(e,t){if(void 0!==t[e])return e;const a=(0,s.getUnicodeForGlyph)(e,t);if(-1!==a)for(const e in t)if(t[e]===a)return e;(0,r.info)("Unable to recover a standard glyph name for: "+e);return e}},(e,t,a)=>{a.r(t);a.d(t,{getDingbatsGlyphsUnicode:()=>i,getGlyphsUnicode:()=>n});var r=a(6);const n=(0,r.getArrayLookupTableFactory)((function(){return["A",65,"AE",198,"AEacute",508,"AEmacron",482,"AEsmall",63462,"Aacute",193,"Aacutesmall",63457,"Abreve",258,"Abreveacute",7854,"Abrevecyrillic",1232,"Abrevedotbelow",7862,"Abrevegrave",7856,"Abrevehookabove",7858,"Abrevetilde",7860,"Acaron",461,"Acircle",9398,"Acircumflex",194,"Acircumflexacute",7844,"Acircumflexdotbelow",7852,"Acircumflexgrave",7846,"Acircumflexhookabove",7848,"Acircumflexsmall",63458,"Acircumflextilde",7850,"Acute",63177,"Acutesmall",63412,"Acyrillic",1040,"Adblgrave",512,"Adieresis",196,"Adieresiscyrillic",1234,"Adieresismacron",478,"Adieresissmall",63460,"Adotbelow",7840,"Adotmacron",480,"Agrave",192,"Agravesmall",63456,"Ahookabove",7842,"Aiecyrillic",1236,"Ainvertedbreve",514,"Alpha",913,"Alphatonos",902,"Amacron",256,"Amonospace",65313,"Aogonek",260,"Aring",197,"Aringacute",506,"Aringbelow",7680,"Aringsmall",63461,"Asmall",63329,"Atilde",195,"Atildesmall",63459,"Aybarmenian",1329,"B",66,"Bcircle",9399,"Bdotaccent",7682,"Bdotbelow",7684,"Becyrillic",1041,"Benarmenian",1330,"Beta",914,"Bhook",385,"Blinebelow",7686,"Bmonospace",65314,"Brevesmall",63220,"Bsmall",63330,"Btopbar",386,"C",67,"Caarmenian",1342,"Cacute",262,"Caron",63178,"Caronsmall",63221,"Ccaron",268,"Ccedilla",199,"Ccedillaacute",7688,"Ccedillasmall",63463,"Ccircle",9400,"Ccircumflex",264,"Cdot",266,"Cdotaccent",266,"Cedillasmall",63416,"Chaarmenian",1353,"Cheabkhasiancyrillic",1212,"Checyrillic",1063,"Chedescenderabkhasiancyrillic",1214,"Chedescendercyrillic",1206,"Chedieresiscyrillic",1268,"Cheharmenian",1347,"Chekhakassiancyrillic",1227,"Cheverticalstrokecyrillic",1208,"Chi",935,"Chook",391,"Circumflexsmall",63222,"Cmonospace",65315,"Coarmenian",1361,"Csmall",63331,"D",68,"DZ",497,"DZcaron",452,"Daarmenian",1332,"Dafrican",393,"Dcaron",270,"Dcedilla",7696,"Dcircle",9401,"Dcircumflexbelow",7698,"Dcroat",272,"Ddotaccent",7690,"Ddotbelow",7692,"Decyrillic",1044,"Deicoptic",1006,"Delta",8710,"Deltagreek",916,"Dhook",394,"Dieresis",63179,"DieresisAcute",63180,"DieresisGrave",63181,"Dieresissmall",63400,"Digammagreek",988,"Djecyrillic",1026,"Dlinebelow",7694,"Dmonospace",65316,"Dotaccentsmall",63223,"Dslash",272,"Dsmall",63332,"Dtopbar",395,"Dz",498,"Dzcaron",453,"Dzeabkhasiancyrillic",1248,"Dzecyrillic",1029,"Dzhecyrillic",1039,"E",69,"Eacute",201,"Eacutesmall",63465,"Ebreve",276,"Ecaron",282,"Ecedillabreve",7708,"Echarmenian",1333,"Ecircle",9402,"Ecircumflex",202,"Ecircumflexacute",7870,"Ecircumflexbelow",7704,"Ecircumflexdotbelow",7878,"Ecircumflexgrave",7872,"Ecircumflexhookabove",7874,"Ecircumflexsmall",63466,"Ecircumflextilde",7876,"Ecyrillic",1028,"Edblgrave",516,"Edieresis",203,"Edieresissmall",63467,"Edot",278,"Edotaccent",278,"Edotbelow",7864,"Efcyrillic",1060,"Egrave",200,"Egravesmall",63464,"Eharmenian",1335,"Ehookabove",7866,"Eightroman",8551,"Einvertedbreve",518,"Eiotifiedcyrillic",1124,"Elcyrillic",1051,"Elevenroman",8554,"Emacron",274,"Emacronacute",7702,"Emacrongrave",7700,"Emcyrillic",1052,"Emonospace",65317,"Encyrillic",1053,"Endescendercyrillic",1186,"Eng",330,"Enghecyrillic",1188,"Enhookcyrillic",1223,"Eogonek",280,"Eopen",400,"Epsilon",917,"Epsilontonos",904,"Ercyrillic",1056,"Ereversed",398,"Ereversedcyrillic",1069,"Escyrillic",1057,"Esdescendercyrillic",1194,"Esh",425,"Esmall",63333,"Eta",919,"Etarmenian",1336,"Etatonos",905,"Eth",208,"Ethsmall",63472,"Etilde",7868,"Etildebelow",7706,"Euro",8364,"Ezh",439,"Ezhcaron",494,"Ezhreversed",440,"F",70,"Fcircle",9403,"Fdotaccent",7710,"Feharmenian",1366,"Feicoptic",996,"Fhook",401,"Fitacyrillic",1138,"Fiveroman",8548,"Fmonospace",65318,"Fourroman",8547,"Fsmall",63334,"G",71,"GBsquare",13191,"Gacute",500,"Gamma",915,"Gammaafrican",404,"Gangiacoptic",1002,"Gbreve",286,"Gcaron",486,"Gcedilla",290,"Gcircle",9404,"Gcircumflex",284,"Gcommaaccent",290,"Gdot",288,"Gdotaccent",288,"Gecyrillic",1043,"Ghadarmenian",1346,"Ghemiddlehookcyrillic",1172,"Ghestrokecyrillic",1170,"Gheupturncyrillic",1168,"Ghook",403,"Gimarmenian",1331,"Gjecyrillic",1027,"Gmacron",7712,"Gmonospace",65319,"Grave",63182,"Gravesmall",63328,"Gsmall",63335,"Gsmallhook",667,"Gstroke",484,"H",72,"H18533",9679,"H18543",9642,"H18551",9643,"H22073",9633,"HPsquare",13259,"Haabkhasiancyrillic",1192,"Hadescendercyrillic",1202,"Hardsigncyrillic",1066,"Hbar",294,"Hbrevebelow",7722,"Hcedilla",7720,"Hcircle",9405,"Hcircumflex",292,"Hdieresis",7718,"Hdotaccent",7714,"Hdotbelow",7716,"Hmonospace",65320,"Hoarmenian",1344,"Horicoptic",1e3,"Hsmall",63336,"Hungarumlaut",63183,"Hungarumlautsmall",63224,"Hzsquare",13200,"I",73,"IAcyrillic",1071,"IJ",306,"IUcyrillic",1070,"Iacute",205,"Iacutesmall",63469,"Ibreve",300,"Icaron",463,"Icircle",9406,"Icircumflex",206,"Icircumflexsmall",63470,"Icyrillic",1030,"Idblgrave",520,"Idieresis",207,"Idieresisacute",7726,"Idieresiscyrillic",1252,"Idieresissmall",63471,"Idot",304,"Idotaccent",304,"Idotbelow",7882,"Iebrevecyrillic",1238,"Iecyrillic",1045,"Ifraktur",8465,"Igrave",204,"Igravesmall",63468,"Ihookabove",7880,"Iicyrillic",1048,"Iinvertedbreve",522,"Iishortcyrillic",1049,"Imacron",298,"Imacroncyrillic",1250,"Imonospace",65321,"Iniarmenian",1339,"Iocyrillic",1025,"Iogonek",302,"Iota",921,"Iotaafrican",406,"Iotadieresis",938,"Iotatonos",906,"Ismall",63337,"Istroke",407,"Itilde",296,"Itildebelow",7724,"Izhitsacyrillic",1140,"Izhitsadblgravecyrillic",1142,"J",74,"Jaarmenian",1345,"Jcircle",9407,"Jcircumflex",308,"Jecyrillic",1032,"Jheharmenian",1355,"Jmonospace",65322,"Jsmall",63338,"K",75,"KBsquare",13189,"KKsquare",13261,"Kabashkircyrillic",1184,"Kacute",7728,"Kacyrillic",1050,"Kadescendercyrillic",1178,"Kahookcyrillic",1219,"Kappa",922,"Kastrokecyrillic",1182,"Kaverticalstrokecyrillic",1180,"Kcaron",488,"Kcedilla",310,"Kcircle",9408,"Kcommaaccent",310,"Kdotbelow",7730,"Keharmenian",1364,"Kenarmenian",1343,"Khacyrillic",1061,"Kheicoptic",998,"Khook",408,"Kjecyrillic",1036,"Klinebelow",7732,"Kmonospace",65323,"Koppacyrillic",1152,"Koppagreek",990,"Ksicyrillic",1134,"Ksmall",63339,"L",76,"LJ",455,"LL",63167,"Lacute",313,"Lambda",923,"Lcaron",317,"Lcedilla",315,"Lcircle",9409,"Lcircumflexbelow",7740,"Lcommaaccent",315,"Ldot",319,"Ldotaccent",319,"Ldotbelow",7734,"Ldotbelowmacron",7736,"Liwnarmenian",1340,"Lj",456,"Ljecyrillic",1033,"Llinebelow",7738,"Lmonospace",65324,"Lslash",321,"Lslashsmall",63225,"Lsmall",63340,"M",77,"MBsquare",13190,"Macron",63184,"Macronsmall",63407,"Macute",7742,"Mcircle",9410,"Mdotaccent",7744,"Mdotbelow",7746,"Menarmenian",1348,"Mmonospace",65325,"Msmall",63341,"Mturned",412,"Mu",924,"N",78,"NJ",458,"Nacute",323,"Ncaron",327,"Ncedilla",325,"Ncircle",9411,"Ncircumflexbelow",7754,"Ncommaaccent",325,"Ndotaccent",7748,"Ndotbelow",7750,"Nhookleft",413,"Nineroman",8552,"Nj",459,"Njecyrillic",1034,"Nlinebelow",7752,"Nmonospace",65326,"Nowarmenian",1350,"Nsmall",63342,"Ntilde",209,"Ntildesmall",63473,"Nu",925,"O",79,"OE",338,"OEsmall",63226,"Oacute",211,"Oacutesmall",63475,"Obarredcyrillic",1256,"Obarreddieresiscyrillic",1258,"Obreve",334,"Ocaron",465,"Ocenteredtilde",415,"Ocircle",9412,"Ocircumflex",212,"Ocircumflexacute",7888,"Ocircumflexdotbelow",7896,"Ocircumflexgrave",7890,"Ocircumflexhookabove",7892,"Ocircumflexsmall",63476,"Ocircumflextilde",7894,"Ocyrillic",1054,"Odblacute",336,"Odblgrave",524,"Odieresis",214,"Odieresiscyrillic",1254,"Odieresissmall",63478,"Odotbelow",7884,"Ogoneksmall",63227,"Ograve",210,"Ogravesmall",63474,"Oharmenian",1365,"Ohm",8486,"Ohookabove",7886,"Ohorn",416,"Ohornacute",7898,"Ohorndotbelow",7906,"Ohorngrave",7900,"Ohornhookabove",7902,"Ohorntilde",7904,"Ohungarumlaut",336,"Oi",418,"Oinvertedbreve",526,"Omacron",332,"Omacronacute",7762,"Omacrongrave",7760,"Omega",8486,"Omegacyrillic",1120,"Omegagreek",937,"Omegaroundcyrillic",1146,"Omegatitlocyrillic",1148,"Omegatonos",911,"Omicron",927,"Omicrontonos",908,"Omonospace",65327,"Oneroman",8544,"Oogonek",490,"Oogonekmacron",492,"Oopen",390,"Oslash",216,"Oslashacute",510,"Oslashsmall",63480,"Osmall",63343,"Ostrokeacute",510,"Otcyrillic",1150,"Otilde",213,"Otildeacute",7756,"Otildedieresis",7758,"Otildesmall",63477,"P",80,"Pacute",7764,"Pcircle",9413,"Pdotaccent",7766,"Pecyrillic",1055,"Peharmenian",1354,"Pemiddlehookcyrillic",1190,"Phi",934,"Phook",420,"Pi",928,"Piwrarmenian",1363,"Pmonospace",65328,"Psi",936,"Psicyrillic",1136,"Psmall",63344,"Q",81,"Qcircle",9414,"Qmonospace",65329,"Qsmall",63345,"R",82,"Raarmenian",1356,"Racute",340,"Rcaron",344,"Rcedilla",342,"Rcircle",9415,"Rcommaaccent",342,"Rdblgrave",528,"Rdotaccent",7768,"Rdotbelow",7770,"Rdotbelowmacron",7772,"Reharmenian",1360,"Rfraktur",8476,"Rho",929,"Ringsmall",63228,"Rinvertedbreve",530,"Rlinebelow",7774,"Rmonospace",65330,"Rsmall",63346,"Rsmallinverted",641,"Rsmallinvertedsuperior",694,"S",83,"SF010000",9484,"SF020000",9492,"SF030000",9488,"SF040000",9496,"SF050000",9532,"SF060000",9516,"SF070000",9524,"SF080000",9500,"SF090000",9508,"SF100000",9472,"SF110000",9474,"SF190000",9569,"SF200000",9570,"SF210000",9558,"SF220000",9557,"SF230000",9571,"SF240000",9553,"SF250000",9559,"SF260000",9565,"SF270000",9564,"SF280000",9563,"SF360000",9566,"SF370000",9567,"SF380000",9562,"SF390000",9556,"SF400000",9577,"SF410000",9574,"SF420000",9568,"SF430000",9552,"SF440000",9580,"SF450000",9575,"SF460000",9576,"SF470000",9572,"SF480000",9573,"SF490000",9561,"SF500000",9560,"SF510000",9554,"SF520000",9555,"SF530000",9579,"SF540000",9578,"Sacute",346,"Sacutedotaccent",7780,"Sampigreek",992,"Scaron",352,"Scarondotaccent",7782,"Scaronsmall",63229,"Scedilla",350,"Schwa",399,"Schwacyrillic",1240,"Schwadieresiscyrillic",1242,"Scircle",9416,"Scircumflex",348,"Scommaaccent",536,"Sdotaccent",7776,"Sdotbelow",7778,"Sdotbelowdotaccent",7784,"Seharmenian",1357,"Sevenroman",8550,"Shaarmenian",1351,"Shacyrillic",1064,"Shchacyrillic",1065,"Sheicoptic",994,"Shhacyrillic",1210,"Shimacoptic",1004,"Sigma",931,"Sixroman",8549,"Smonospace",65331,"Softsigncyrillic",1068,"Ssmall",63347,"Stigmagreek",986,"T",84,"Tau",932,"Tbar",358,"Tcaron",356,"Tcedilla",354,"Tcircle",9417,"Tcircumflexbelow",7792,"Tcommaaccent",354,"Tdotaccent",7786,"Tdotbelow",7788,"Tecyrillic",1058,"Tedescendercyrillic",1196,"Tenroman",8553,"Tetsecyrillic",1204,"Theta",920,"Thook",428,"Thorn",222,"Thornsmall",63486,"Threeroman",8546,"Tildesmall",63230,"Tiwnarmenian",1359,"Tlinebelow",7790,"Tmonospace",65332,"Toarmenian",1337,"Tonefive",444,"Tonesix",388,"Tonetwo",423,"Tretroflexhook",430,"Tsecyrillic",1062,"Tshecyrillic",1035,"Tsmall",63348,"Twelveroman",8555,"Tworoman",8545,"U",85,"Uacute",218,"Uacutesmall",63482,"Ubreve",364,"Ucaron",467,"Ucircle",9418,"Ucircumflex",219,"Ucircumflexbelow",7798,"Ucircumflexsmall",63483,"Ucyrillic",1059,"Udblacute",368,"Udblgrave",532,"Udieresis",220,"Udieresisacute",471,"Udieresisbelow",7794,"Udieresiscaron",473,"Udieresiscyrillic",1264,"Udieresisgrave",475,"Udieresismacron",469,"Udieresissmall",63484,"Udotbelow",7908,"Ugrave",217,"Ugravesmall",63481,"Uhookabove",7910,"Uhorn",431,"Uhornacute",7912,"Uhorndotbelow",7920,"Uhorngrave",7914,"Uhornhookabove",7916,"Uhorntilde",7918,"Uhungarumlaut",368,"Uhungarumlautcyrillic",1266,"Uinvertedbreve",534,"Ukcyrillic",1144,"Umacron",362,"Umacroncyrillic",1262,"Umacrondieresis",7802,"Umonospace",65333,"Uogonek",370,"Upsilon",933,"Upsilon1",978,"Upsilonacutehooksymbolgreek",979,"Upsilonafrican",433,"Upsilondieresis",939,"Upsilondieresishooksymbolgreek",980,"Upsilonhooksymbol",978,"Upsilontonos",910,"Uring",366,"Ushortcyrillic",1038,"Usmall",63349,"Ustraightcyrillic",1198,"Ustraightstrokecyrillic",1200,"Utilde",360,"Utildeacute",7800,"Utildebelow",7796,"V",86,"Vcircle",9419,"Vdotbelow",7806,"Vecyrillic",1042,"Vewarmenian",1358,"Vhook",434,"Vmonospace",65334,"Voarmenian",1352,"Vsmall",63350,"Vtilde",7804,"W",87,"Wacute",7810,"Wcircle",9420,"Wcircumflex",372,"Wdieresis",7812,"Wdotaccent",7814,"Wdotbelow",7816,"Wgrave",7808,"Wmonospace",65335,"Wsmall",63351,"X",88,"Xcircle",9421,"Xdieresis",7820,"Xdotaccent",7818,"Xeharmenian",1341,"Xi",926,"Xmonospace",65336,"Xsmall",63352,"Y",89,"Yacute",221,"Yacutesmall",63485,"Yatcyrillic",1122,"Ycircle",9422,"Ycircumflex",374,"Ydieresis",376,"Ydieresissmall",63487,"Ydotaccent",7822,"Ydotbelow",7924,"Yericyrillic",1067,"Yerudieresiscyrillic",1272,"Ygrave",7922,"Yhook",435,"Yhookabove",7926,"Yiarmenian",1349,"Yicyrillic",1031,"Yiwnarmenian",1362,"Ymonospace",65337,"Ysmall",63353,"Ytilde",7928,"Yusbigcyrillic",1130,"Yusbigiotifiedcyrillic",1132,"Yuslittlecyrillic",1126,"Yuslittleiotifiedcyrillic",1128,"Z",90,"Zaarmenian",1334,"Zacute",377,"Zcaron",381,"Zcaronsmall",63231,"Zcircle",9423,"Zcircumflex",7824,"Zdot",379,"Zdotaccent",379,"Zdotbelow",7826,"Zecyrillic",1047,"Zedescendercyrillic",1176,"Zedieresiscyrillic",1246,"Zeta",918,"Zhearmenian",1338,"Zhebrevecyrillic",1217,"Zhecyrillic",1046,"Zhedescendercyrillic",1174,"Zhedieresiscyrillic",1244,"Zlinebelow",7828,"Zmonospace",65338,"Zsmall",63354,"Zstroke",437,"a",97,"aabengali",2438,"aacute",225,"aadeva",2310,"aagujarati",2694,"aagurmukhi",2566,"aamatragurmukhi",2622,"aarusquare",13059,"aavowelsignbengali",2494,"aavowelsigndeva",2366,"aavowelsigngujarati",2750,"abbreviationmarkarmenian",1375,"abbreviationsigndeva",2416,"abengali",2437,"abopomofo",12570,"abreve",259,"abreveacute",7855,"abrevecyrillic",1233,"abrevedotbelow",7863,"abrevegrave",7857,"abrevehookabove",7859,"abrevetilde",7861,"acaron",462,"acircle",9424,"acircumflex",226,"acircumflexacute",7845,"acircumflexdotbelow",7853,"acircumflexgrave",7847,"acircumflexhookabove",7849,"acircumflextilde",7851,"acute",180,"acutebelowcmb",791,"acutecmb",769,"acutecomb",769,"acutedeva",2388,"acutelowmod",719,"acutetonecmb",833,"acyrillic",1072,"adblgrave",513,"addakgurmukhi",2673,"adeva",2309,"adieresis",228,"adieresiscyrillic",1235,"adieresismacron",479,"adotbelow",7841,"adotmacron",481,"ae",230,"aeacute",509,"aekorean",12624,"aemacron",483,"afii00208",8213,"afii08941",8356,"afii10017",1040,"afii10018",1041,"afii10019",1042,"afii10020",1043,"afii10021",1044,"afii10022",1045,"afii10023",1025,"afii10024",1046,"afii10025",1047,"afii10026",1048,"afii10027",1049,"afii10028",1050,"afii10029",1051,"afii10030",1052,"afii10031",1053,"afii10032",1054,"afii10033",1055,"afii10034",1056,"afii10035",1057,"afii10036",1058,"afii10037",1059,"afii10038",1060,"afii10039",1061,"afii10040",1062,"afii10041",1063,"afii10042",1064,"afii10043",1065,"afii10044",1066,"afii10045",1067,"afii10046",1068,"afii10047",1069,"afii10048",1070,"afii10049",1071,"afii10050",1168,"afii10051",1026,"afii10052",1027,"afii10053",1028,"afii10054",1029,"afii10055",1030,"afii10056",1031,"afii10057",1032,"afii10058",1033,"afii10059",1034,"afii10060",1035,"afii10061",1036,"afii10062",1038,"afii10063",63172,"afii10064",63173,"afii10065",1072,"afii10066",1073,"afii10067",1074,"afii10068",1075,"afii10069",1076,"afii10070",1077,"afii10071",1105,"afii10072",1078,"afii10073",1079,"afii10074",1080,"afii10075",1081,"afii10076",1082,"afii10077",1083,"afii10078",1084,"afii10079",1085,"afii10080",1086,"afii10081",1087,"afii10082",1088,"afii10083",1089,"afii10084",1090,"afii10085",1091,"afii10086",1092,"afii10087",1093,"afii10088",1094,"afii10089",1095,"afii10090",1096,"afii10091",1097,"afii10092",1098,"afii10093",1099,"afii10094",1100,"afii10095",1101,"afii10096",1102,"afii10097",1103,"afii10098",1169,"afii10099",1106,"afii10100",1107,"afii10101",1108,"afii10102",1109,"afii10103",1110,"afii10104",1111,"afii10105",1112,"afii10106",1113,"afii10107",1114,"afii10108",1115,"afii10109",1116,"afii10110",1118,"afii10145",1039,"afii10146",1122,"afii10147",1138,"afii10148",1140,"afii10192",63174,"afii10193",1119,"afii10194",1123,"afii10195",1139,"afii10196",1141,"afii10831",63175,"afii10832",63176,"afii10846",1241,"afii299",8206,"afii300",8207,"afii301",8205,"afii57381",1642,"afii57388",1548,"afii57392",1632,"afii57393",1633,"afii57394",1634,"afii57395",1635,"afii57396",1636,"afii57397",1637,"afii57398",1638,"afii57399",1639,"afii57400",1640,"afii57401",1641,"afii57403",1563,"afii57407",1567,"afii57409",1569,"afii57410",1570,"afii57411",1571,"afii57412",1572,"afii57413",1573,"afii57414",1574,"afii57415",1575,"afii57416",1576,"afii57417",1577,"afii57418",1578,"afii57419",1579,"afii57420",1580,"afii57421",1581,"afii57422",1582,"afii57423",1583,"afii57424",1584,"afii57425",1585,"afii57426",1586,"afii57427",1587,"afii57428",1588,"afii57429",1589,"afii57430",1590,"afii57431",1591,"afii57432",1592,"afii57433",1593,"afii57434",1594,"afii57440",1600,"afii57441",1601,"afii57442",1602,"afii57443",1603,"afii57444",1604,"afii57445",1605,"afii57446",1606,"afii57448",1608,"afii57449",1609,"afii57450",1610,"afii57451",1611,"afii57452",1612,"afii57453",1613,"afii57454",1614,"afii57455",1615,"afii57456",1616,"afii57457",1617,"afii57458",1618,"afii57470",1607,"afii57505",1700,"afii57506",1662,"afii57507",1670,"afii57508",1688,"afii57509",1711,"afii57511",1657,"afii57512",1672,"afii57513",1681,"afii57514",1722,"afii57519",1746,"afii57534",1749,"afii57636",8362,"afii57645",1470,"afii57658",1475,"afii57664",1488,"afii57665",1489,"afii57666",1490,"afii57667",1491,"afii57668",1492,"afii57669",1493,"afii57670",1494,"afii57671",1495,"afii57672",1496,"afii57673",1497,"afii57674",1498,"afii57675",1499,"afii57676",1500,"afii57677",1501,"afii57678",1502,"afii57679",1503,"afii57680",1504,"afii57681",1505,"afii57682",1506,"afii57683",1507,"afii57684",1508,"afii57685",1509,"afii57686",1510,"afii57687",1511,"afii57688",1512,"afii57689",1513,"afii57690",1514,"afii57694",64298,"afii57695",64299,"afii57700",64331,"afii57705",64287,"afii57716",1520,"afii57717",1521,"afii57718",1522,"afii57723",64309,"afii57793",1460,"afii57794",1461,"afii57795",1462,"afii57796",1467,"afii57797",1464,"afii57798",1463,"afii57799",1456,"afii57800",1458,"afii57801",1457,"afii57802",1459,"afii57803",1474,"afii57804",1473,"afii57806",1465,"afii57807",1468,"afii57839",1469,"afii57841",1471,"afii57842",1472,"afii57929",700,"afii61248",8453,"afii61289",8467,"afii61352",8470,"afii61573",8236,"afii61574",8237,"afii61575",8238,"afii61664",8204,"afii63167",1645,"afii64937",701,"agrave",224,"agujarati",2693,"agurmukhi",2565,"ahiragana",12354,"ahookabove",7843,"aibengali",2448,"aibopomofo",12574,"aideva",2320,"aiecyrillic",1237,"aigujarati",2704,"aigurmukhi",2576,"aimatragurmukhi",2632,"ainarabic",1593,"ainfinalarabic",65226,"aininitialarabic",65227,"ainmedialarabic",65228,"ainvertedbreve",515,"aivowelsignbengali",2504,"aivowelsigndeva",2376,"aivowelsigngujarati",2760,"akatakana",12450,"akatakanahalfwidth",65393,"akorean",12623,"alef",1488,"alefarabic",1575,"alefdageshhebrew",64304,"aleffinalarabic",65166,"alefhamzaabovearabic",1571,"alefhamzaabovefinalarabic",65156,"alefhamzabelowarabic",1573,"alefhamzabelowfinalarabic",65160,"alefhebrew",1488,"aleflamedhebrew",64335,"alefmaddaabovearabic",1570,"alefmaddaabovefinalarabic",65154,"alefmaksuraarabic",1609,"alefmaksurafinalarabic",65264,"alefmaksurainitialarabic",65267,"alefmaksuramedialarabic",65268,"alefpatahhebrew",64302,"alefqamatshebrew",64303,"aleph",8501,"allequal",8780,"alpha",945,"alphatonos",940,"amacron",257,"amonospace",65345,"ampersand",38,"ampersandmonospace",65286,"ampersandsmall",63270,"amsquare",13250,"anbopomofo",12578,"angbopomofo",12580,"angbracketleft",12296,"angbracketright",12297,"angkhankhuthai",3674,"angle",8736,"anglebracketleft",12296,"anglebracketleftvertical",65087,"anglebracketright",12297,"anglebracketrightvertical",65088,"angleleft",9001,"angleright",9002,"angstrom",8491,"anoteleia",903,"anudattadeva",2386,"anusvarabengali",2434,"anusvaradeva",2306,"anusvaragujarati",2690,"aogonek",261,"apaatosquare",13056,"aparen",9372,"apostrophearmenian",1370,"apostrophemod",700,"apple",63743,"approaches",8784,"approxequal",8776,"approxequalorimage",8786,"approximatelyequal",8773,"araeaekorean",12686,"araeakorean",12685,"arc",8978,"arighthalfring",7834,"aring",229,"aringacute",507,"aringbelow",7681,"arrowboth",8596,"arrowdashdown",8675,"arrowdashleft",8672,"arrowdashright",8674,"arrowdashup",8673,"arrowdblboth",8660,"arrowdbldown",8659,"arrowdblleft",8656,"arrowdblright",8658,"arrowdblup",8657,"arrowdown",8595,"arrowdownleft",8601,"arrowdownright",8600,"arrowdownwhite",8681,"arrowheaddownmod",709,"arrowheadleftmod",706,"arrowheadrightmod",707,"arrowheadupmod",708,"arrowhorizex",63719,"arrowleft",8592,"arrowleftdbl",8656,"arrowleftdblstroke",8653,"arrowleftoverright",8646,"arrowleftwhite",8678,"arrowright",8594,"arrowrightdblstroke",8655,"arrowrightheavy",10142,"arrowrightoverleft",8644,"arrowrightwhite",8680,"arrowtableft",8676,"arrowtabright",8677,"arrowup",8593,"arrowupdn",8597,"arrowupdnbse",8616,"arrowupdownbase",8616,"arrowupleft",8598,"arrowupleftofdown",8645,"arrowupright",8599,"arrowupwhite",8679,"arrowvertex",63718,"asciicircum",94,"asciicircummonospace",65342,"asciitilde",126,"asciitildemonospace",65374,"ascript",593,"ascriptturned",594,"asmallhiragana",12353,"asmallkatakana",12449,"asmallkatakanahalfwidth",65383,"asterisk",42,"asteriskaltonearabic",1645,"asteriskarabic",1645,"asteriskmath",8727,"asteriskmonospace",65290,"asterisksmall",65121,"asterism",8258,"asuperior",63209,"asymptoticallyequal",8771,"at",64,"atilde",227,"atmonospace",65312,"atsmall",65131,"aturned",592,"aubengali",2452,"aubopomofo",12576,"audeva",2324,"augujarati",2708,"augurmukhi",2580,"aulengthmarkbengali",2519,"aumatragurmukhi",2636,"auvowelsignbengali",2508,"auvowelsigndeva",2380,"auvowelsigngujarati",2764,"avagrahadeva",2365,"aybarmenian",1377,"ayin",1506,"ayinaltonehebrew",64288,"ayinhebrew",1506,"b",98,"babengali",2476,"backslash",92,"backslashmonospace",65340,"badeva",2348,"bagujarati",2732,"bagurmukhi",2604,"bahiragana",12400,"bahtthai",3647,"bakatakana",12496,"bar",124,"barmonospace",65372,"bbopomofo",12549,"bcircle",9425,"bdotaccent",7683,"bdotbelow",7685,"beamedsixteenthnotes",9836,"because",8757,"becyrillic",1073,"beharabic",1576,"behfinalarabic",65168,"behinitialarabic",65169,"behiragana",12409,"behmedialarabic",65170,"behmeeminitialarabic",64671,"behmeemisolatedarabic",64520,"behnoonfinalarabic",64621,"bekatakana",12505,"benarmenian",1378,"bet",1489,"beta",946,"betasymbolgreek",976,"betdagesh",64305,"betdageshhebrew",64305,"bethebrew",1489,"betrafehebrew",64332,"bhabengali",2477,"bhadeva",2349,"bhagujarati",2733,"bhagurmukhi",2605,"bhook",595,"bihiragana",12403,"bikatakana",12499,"bilabialclick",664,"bindigurmukhi",2562,"birusquare",13105,"blackcircle",9679,"blackdiamond",9670,"blackdownpointingtriangle",9660,"blackleftpointingpointer",9668,"blackleftpointingtriangle",9664,"blacklenticularbracketleft",12304,"blacklenticularbracketleftvertical",65083,"blacklenticularbracketright",12305,"blacklenticularbracketrightvertical",65084,"blacklowerlefttriangle",9699,"blacklowerrighttriangle",9698,"blackrectangle",9644,"blackrightpointingpointer",9658,"blackrightpointingtriangle",9654,"blacksmallsquare",9642,"blacksmilingface",9787,"blacksquare",9632,"blackstar",9733,"blackupperlefttriangle",9700,"blackupperrighttriangle",9701,"blackuppointingsmalltriangle",9652,"blackuppointingtriangle",9650,"blank",9251,"blinebelow",7687,"block",9608,"bmonospace",65346,"bobaimaithai",3610,"bohiragana",12412,"bokatakana",12508,"bparen",9373,"bqsquare",13251,"braceex",63732,"braceleft",123,"braceleftbt",63731,"braceleftmid",63730,"braceleftmonospace",65371,"braceleftsmall",65115,"bracelefttp",63729,"braceleftvertical",65079,"braceright",125,"bracerightbt",63742,"bracerightmid",63741,"bracerightmonospace",65373,"bracerightsmall",65116,"bracerighttp",63740,"bracerightvertical",65080,"bracketleft",91,"bracketleftbt",63728,"bracketleftex",63727,"bracketleftmonospace",65339,"bracketlefttp",63726,"bracketright",93,"bracketrightbt",63739,"bracketrightex",63738,"bracketrightmonospace",65341,"bracketrighttp",63737,"breve",728,"brevebelowcmb",814,"brevecmb",774,"breveinvertedbelowcmb",815,"breveinvertedcmb",785,"breveinverteddoublecmb",865,"bridgebelowcmb",810,"bridgeinvertedbelowcmb",826,"brokenbar",166,"bstroke",384,"bsuperior",63210,"btopbar",387,"buhiragana",12406,"bukatakana",12502,"bullet",8226,"bulletinverse",9688,"bulletoperator",8729,"bullseye",9678,"c",99,"caarmenian",1390,"cabengali",2458,"cacute",263,"cadeva",2330,"cagujarati",2714,"cagurmukhi",2586,"calsquare",13192,"candrabindubengali",2433,"candrabinducmb",784,"candrabindudeva",2305,"candrabindugujarati",2689,"capslock",8682,"careof",8453,"caron",711,"caronbelowcmb",812,"caroncmb",780,"carriagereturn",8629,"cbopomofo",12568,"ccaron",269,"ccedilla",231,"ccedillaacute",7689,"ccircle",9426,"ccircumflex",265,"ccurl",597,"cdot",267,"cdotaccent",267,"cdsquare",13253,"cedilla",184,"cedillacmb",807,"cent",162,"centigrade",8451,"centinferior",63199,"centmonospace",65504,"centoldstyle",63394,"centsuperior",63200,"chaarmenian",1401,"chabengali",2459,"chadeva",2331,"chagujarati",2715,"chagurmukhi",2587,"chbopomofo",12564,"cheabkhasiancyrillic",1213,"checkmark",10003,"checyrillic",1095,"chedescenderabkhasiancyrillic",1215,"chedescendercyrillic",1207,"chedieresiscyrillic",1269,"cheharmenian",1395,"chekhakassiancyrillic",1228,"cheverticalstrokecyrillic",1209,"chi",967,"chieuchacirclekorean",12919,"chieuchaparenkorean",12823,"chieuchcirclekorean",12905,"chieuchkorean",12618,"chieuchparenkorean",12809,"chochangthai",3594,"chochanthai",3592,"chochingthai",3593,"chochoethai",3596,"chook",392,"cieucacirclekorean",12918,"cieucaparenkorean",12822,"cieuccirclekorean",12904,"cieuckorean",12616,"cieucparenkorean",12808,"cieucuparenkorean",12828,"circle",9675,"circlecopyrt",169,"circlemultiply",8855,"circleot",8857,"circleplus",8853,"circlepostalmark",12342,"circlewithlefthalfblack",9680,"circlewithrighthalfblack",9681,"circumflex",710,"circumflexbelowcmb",813,"circumflexcmb",770,"clear",8999,"clickalveolar",450,"clickdental",448,"clicklateral",449,"clickretroflex",451,"club",9827,"clubsuitblack",9827,"clubsuitwhite",9831,"cmcubedsquare",13220,"cmonospace",65347,"cmsquaredsquare",13216,"coarmenian",1409,"colon",58,"colonmonetary",8353,"colonmonospace",65306,"colonsign",8353,"colonsmall",65109,"colontriangularhalfmod",721,"colontriangularmod",720,"comma",44,"commaabovecmb",787,"commaaboverightcmb",789,"commaaccent",63171,"commaarabic",1548,"commaarmenian",1373,"commainferior",63201,"commamonospace",65292,"commareversedabovecmb",788,"commareversedmod",701,"commasmall",65104,"commasuperior",63202,"commaturnedabovecmb",786,"commaturnedmod",699,"compass",9788,"congruent",8773,"contourintegral",8750,"control",8963,"controlACK",6,"controlBEL",7,"controlBS",8,"controlCAN",24,"controlCR",13,"controlDC1",17,"controlDC2",18,"controlDC3",19,"controlDC4",20,"controlDEL",127,"controlDLE",16,"controlEM",25,"controlENQ",5,"controlEOT",4,"controlESC",27,"controlETB",23,"controlETX",3,"controlFF",12,"controlFS",28,"controlGS",29,"controlHT",9,"controlLF",10,"controlNAK",21,"controlNULL",0,"controlRS",30,"controlSI",15,"controlSO",14,"controlSOT",2,"controlSTX",1,"controlSUB",26,"controlSYN",22,"controlUS",31,"controlVT",11,"copyright",169,"copyrightsans",63721,"copyrightserif",63193,"cornerbracketleft",12300,"cornerbracketlefthalfwidth",65378,"cornerbracketleftvertical",65089,"cornerbracketright",12301,"cornerbracketrighthalfwidth",65379,"cornerbracketrightvertical",65090,"corporationsquare",13183,"cosquare",13255,"coverkgsquare",13254,"cparen",9374,"cruzeiro",8354,"cstretched",663,"curlyand",8911,"curlyor",8910,"currency",164,"cyrBreve",63185,"cyrFlex",63186,"cyrbreve",63188,"cyrflex",63189,"d",100,"daarmenian",1380,"dabengali",2470,"dadarabic",1590,"dadeva",2342,"dadfinalarabic",65214,"dadinitialarabic",65215,"dadmedialarabic",65216,"dagesh",1468,"dageshhebrew",1468,"dagger",8224,"daggerdbl",8225,"dagujarati",2726,"dagurmukhi",2598,"dahiragana",12384,"dakatakana",12480,"dalarabic",1583,"dalet",1491,"daletdagesh",64307,"daletdageshhebrew",64307,"dalethebrew",1491,"dalfinalarabic",65194,"dammaarabic",1615,"dammalowarabic",1615,"dammatanaltonearabic",1612,"dammatanarabic",1612,"danda",2404,"dargahebrew",1447,"dargalefthebrew",1447,"dasiapneumatacyrilliccmb",1157,"dblGrave",63187,"dblanglebracketleft",12298,"dblanglebracketleftvertical",65085,"dblanglebracketright",12299,"dblanglebracketrightvertical",65086,"dblarchinvertedbelowcmb",811,"dblarrowleft",8660,"dblarrowright",8658,"dbldanda",2405,"dblgrave",63190,"dblgravecmb",783,"dblintegral",8748,"dbllowline",8215,"dbllowlinecmb",819,"dbloverlinecmb",831,"dblprimemod",698,"dblverticalbar",8214,"dblverticallineabovecmb",782,"dbopomofo",12553,"dbsquare",13256,"dcaron",271,"dcedilla",7697,"dcircle",9427,"dcircumflexbelow",7699,"dcroat",273,"ddabengali",2465,"ddadeva",2337,"ddagujarati",2721,"ddagurmukhi",2593,"ddalarabic",1672,"ddalfinalarabic",64393,"dddhadeva",2396,"ddhabengali",2466,"ddhadeva",2338,"ddhagujarati",2722,"ddhagurmukhi",2594,"ddotaccent",7691,"ddotbelow",7693,"decimalseparatorarabic",1643,"decimalseparatorpersian",1643,"decyrillic",1076,"degree",176,"dehihebrew",1453,"dehiragana",12391,"deicoptic",1007,"dekatakana",12487,"deleteleft",9003,"deleteright",8998,"delta",948,"deltaturned",397,"denominatorminusonenumeratorbengali",2552,"dezh",676,"dhabengali",2471,"dhadeva",2343,"dhagujarati",2727,"dhagurmukhi",2599,"dhook",599,"dialytikatonos",901,"dialytikatonoscmb",836,"diamond",9830,"diamondsuitwhite",9826,"dieresis",168,"dieresisacute",63191,"dieresisbelowcmb",804,"dieresiscmb",776,"dieresisgrave",63192,"dieresistonos",901,"dihiragana",12386,"dikatakana",12482,"dittomark",12291,"divide",247,"divides",8739,"divisionslash",8725,"djecyrillic",1106,"dkshade",9619,"dlinebelow",7695,"dlsquare",13207,"dmacron",273,"dmonospace",65348,"dnblock",9604,"dochadathai",3598,"dodekthai",3604,"dohiragana",12393,"dokatakana",12489,"dollar",36,"dollarinferior",63203,"dollarmonospace",65284,"dollaroldstyle",63268,"dollarsmall",65129,"dollarsuperior",63204,"dong",8363,"dorusquare",13094,"dotaccent",729,"dotaccentcmb",775,"dotbelowcmb",803,"dotbelowcomb",803,"dotkatakana",12539,"dotlessi",305,"dotlessj",63166,"dotlessjstrokehook",644,"dotmath",8901,"dottedcircle",9676,"doubleyodpatah",64287,"doubleyodpatahhebrew",64287,"downtackbelowcmb",798,"downtackmod",725,"dparen",9375,"dsuperior",63211,"dtail",598,"dtopbar",396,"duhiragana",12389,"dukatakana",12485,"dz",499,"dzaltone",675,"dzcaron",454,"dzcurl",677,"dzeabkhasiancyrillic",1249,"dzecyrillic",1109,"dzhecyrillic",1119,"e",101,"eacute",233,"earth",9793,"ebengali",2447,"ebopomofo",12572,"ebreve",277,"ecandradeva",2317,"ecandragujarati",2701,"ecandravowelsigndeva",2373,"ecandravowelsigngujarati",2757,"ecaron",283,"ecedillabreve",7709,"echarmenian",1381,"echyiwnarmenian",1415,"ecircle",9428,"ecircumflex",234,"ecircumflexacute",7871,"ecircumflexbelow",7705,"ecircumflexdotbelow",7879,"ecircumflexgrave",7873,"ecircumflexhookabove",7875,"ecircumflextilde",7877,"ecyrillic",1108,"edblgrave",517,"edeva",2319,"edieresis",235,"edot",279,"edotaccent",279,"edotbelow",7865,"eegurmukhi",2575,"eematragurmukhi",2631,"efcyrillic",1092,"egrave",232,"egujarati",2703,"eharmenian",1383,"ehbopomofo",12573,"ehiragana",12360,"ehookabove",7867,"eibopomofo",12575,"eight",56,"eightarabic",1640,"eightbengali",2542,"eightcircle",9319,"eightcircleinversesansserif",10129,"eightdeva",2414,"eighteencircle",9329,"eighteenparen",9349,"eighteenperiod",9369,"eightgujarati",2798,"eightgurmukhi",2670,"eighthackarabic",1640,"eighthangzhou",12328,"eighthnotebeamed",9835,"eightideographicparen",12839,"eightinferior",8328,"eightmonospace",65304,"eightoldstyle",63288,"eightparen",9339,"eightperiod",9359,"eightpersian",1784,"eightroman",8567,"eightsuperior",8312,"eightthai",3672,"einvertedbreve",519,"eiotifiedcyrillic",1125,"ekatakana",12456,"ekatakanahalfwidth",65396,"ekonkargurmukhi",2676,"ekorean",12628,"elcyrillic",1083,"element",8712,"elevencircle",9322,"elevenparen",9342,"elevenperiod",9362,"elevenroman",8570,"ellipsis",8230,"ellipsisvertical",8942,"emacron",275,"emacronacute",7703,"emacrongrave",7701,"emcyrillic",1084,"emdash",8212,"emdashvertical",65073,"emonospace",65349,"emphasismarkarmenian",1371,"emptyset",8709,"enbopomofo",12579,"encyrillic",1085,"endash",8211,"endashvertical",65074,"endescendercyrillic",1187,"eng",331,"engbopomofo",12581,"enghecyrillic",1189,"enhookcyrillic",1224,"enspace",8194,"eogonek",281,"eokorean",12627,"eopen",603,"eopenclosed",666,"eopenreversed",604,"eopenreversedclosed",606,"eopenreversedhook",605,"eparen",9376,"epsilon",949,"epsilontonos",941,"equal",61,"equalmonospace",65309,"equalsmall",65126,"equalsuperior",8316,"equivalence",8801,"erbopomofo",12582,"ercyrillic",1088,"ereversed",600,"ereversedcyrillic",1101,"escyrillic",1089,"esdescendercyrillic",1195,"esh",643,"eshcurl",646,"eshortdeva",2318,"eshortvowelsigndeva",2374,"eshreversedloop",426,"eshsquatreversed",645,"esmallhiragana",12359,"esmallkatakana",12455,"esmallkatakanahalfwidth",65386,"estimated",8494,"esuperior",63212,"eta",951,"etarmenian",1384,"etatonos",942,"eth",240,"etilde",7869,"etildebelow",7707,"etnahtafoukhhebrew",1425,"etnahtafoukhlefthebrew",1425,"etnahtahebrew",1425,"etnahtalefthebrew",1425,"eturned",477,"eukorean",12641,"euro",8364,"evowelsignbengali",2503,"evowelsigndeva",2375,"evowelsigngujarati",2759,"exclam",33,"exclamarmenian",1372,"exclamdbl",8252,"exclamdown",161,"exclamdownsmall",63393,"exclammonospace",65281,"exclamsmall",63265,"existential",8707,"ezh",658,"ezhcaron",495,"ezhcurl",659,"ezhreversed",441,"ezhtail",442,"f",102,"fadeva",2398,"fagurmukhi",2654,"fahrenheit",8457,"fathaarabic",1614,"fathalowarabic",1614,"fathatanarabic",1611,"fbopomofo",12552,"fcircle",9429,"fdotaccent",7711,"feharabic",1601,"feharmenian",1414,"fehfinalarabic",65234,"fehinitialarabic",65235,"fehmedialarabic",65236,"feicoptic",997,"female",9792,"ff",64256,"f_f",64256,"ffi",64259,"ffl",64260,"fi",64257,"fifteencircle",9326,"fifteenparen",9346,"fifteenperiod",9366,"figuredash",8210,"filledbox",9632,"filledrect",9644,"finalkaf",1498,"finalkafdagesh",64314,"finalkafdageshhebrew",64314,"finalkafhebrew",1498,"finalmem",1501,"finalmemhebrew",1501,"finalnun",1503,"finalnunhebrew",1503,"finalpe",1507,"finalpehebrew",1507,"finaltsadi",1509,"finaltsadihebrew",1509,"firsttonechinese",713,"fisheye",9673,"fitacyrillic",1139,"five",53,"fivearabic",1637,"fivebengali",2539,"fivecircle",9316,"fivecircleinversesansserif",10126,"fivedeva",2411,"fiveeighths",8541,"fivegujarati",2795,"fivegurmukhi",2667,"fivehackarabic",1637,"fivehangzhou",12325,"fiveideographicparen",12836,"fiveinferior",8325,"fivemonospace",65301,"fiveoldstyle",63285,"fiveparen",9336,"fiveperiod",9356,"fivepersian",1781,"fiveroman",8564,"fivesuperior",8309,"fivethai",3669,"fl",64258,"florin",402,"fmonospace",65350,"fmsquare",13209,"fofanthai",3615,"fofathai",3613,"fongmanthai",3663,"forall",8704,"four",52,"fourarabic",1636,"fourbengali",2538,"fourcircle",9315,"fourcircleinversesansserif",10125,"fourdeva",2410,"fourgujarati",2794,"fourgurmukhi",2666,"fourhackarabic",1636,"fourhangzhou",12324,"fourideographicparen",12835,"fourinferior",8324,"fourmonospace",65300,"fournumeratorbengali",2551,"fouroldstyle",63284,"fourparen",9335,"fourperiod",9355,"fourpersian",1780,"fourroman",8563,"foursuperior",8308,"fourteencircle",9325,"fourteenparen",9345,"fourteenperiod",9365,"fourthai",3668,"fourthtonechinese",715,"fparen",9377,"fraction",8260,"franc",8355,"g",103,"gabengali",2455,"gacute",501,"gadeva",2327,"gafarabic",1711,"gaffinalarabic",64403,"gafinitialarabic",64404,"gafmedialarabic",64405,"gagujarati",2711,"gagurmukhi",2583,"gahiragana",12364,"gakatakana",12460,"gamma",947,"gammalatinsmall",611,"gammasuperior",736,"gangiacoptic",1003,"gbopomofo",12557,"gbreve",287,"gcaron",487,"gcedilla",291,"gcircle",9430,"gcircumflex",285,"gcommaaccent",291,"gdot",289,"gdotaccent",289,"gecyrillic",1075,"gehiragana",12370,"gekatakana",12466,"geometricallyequal",8785,"gereshaccenthebrew",1436,"gereshhebrew",1523,"gereshmuqdamhebrew",1437,"germandbls",223,"gershayimaccenthebrew",1438,"gershayimhebrew",1524,"getamark",12307,"ghabengali",2456,"ghadarmenian",1394,"ghadeva",2328,"ghagujarati",2712,"ghagurmukhi",2584,"ghainarabic",1594,"ghainfinalarabic",65230,"ghaininitialarabic",65231,"ghainmedialarabic",65232,"ghemiddlehookcyrillic",1173,"ghestrokecyrillic",1171,"gheupturncyrillic",1169,"ghhadeva",2394,"ghhagurmukhi",2650,"ghook",608,"ghzsquare",13203,"gihiragana",12366,"gikatakana",12462,"gimarmenian",1379,"gimel",1490,"gimeldagesh",64306,"gimeldageshhebrew",64306,"gimelhebrew",1490,"gjecyrillic",1107,"glottalinvertedstroke",446,"glottalstop",660,"glottalstopinverted",662,"glottalstopmod",704,"glottalstopreversed",661,"glottalstopreversedmod",705,"glottalstopreversedsuperior",740,"glottalstopstroke",673,"glottalstopstrokereversed",674,"gmacron",7713,"gmonospace",65351,"gohiragana",12372,"gokatakana",12468,"gparen",9378,"gpasquare",13228,"gradient",8711,"grave",96,"gravebelowcmb",790,"gravecmb",768,"gravecomb",768,"gravedeva",2387,"gravelowmod",718,"gravemonospace",65344,"gravetonecmb",832,"greater",62,"greaterequal",8805,"greaterequalorless",8923,"greatermonospace",65310,"greaterorequivalent",8819,"greaterorless",8823,"greateroverequal",8807,"greatersmall",65125,"gscript",609,"gstroke",485,"guhiragana",12368,"guillemotleft",171,"guillemotright",187,"guilsinglleft",8249,"guilsinglright",8250,"gukatakana",12464,"guramusquare",13080,"gysquare",13257,"h",104,"haabkhasiancyrillic",1193,"haaltonearabic",1729,"habengali",2489,"hadescendercyrillic",1203,"hadeva",2361,"hagujarati",2745,"hagurmukhi",2617,"haharabic",1581,"hahfinalarabic",65186,"hahinitialarabic",65187,"hahiragana",12399,"hahmedialarabic",65188,"haitusquare",13098,"hakatakana",12495,"hakatakanahalfwidth",65418,"halantgurmukhi",2637,"hamzaarabic",1569,"hamzalowarabic",1569,"hangulfiller",12644,"hardsigncyrillic",1098,"harpoonleftbarbup",8636,"harpoonrightbarbup",8640,"hasquare",13258,"hatafpatah",1458,"hatafpatah16",1458,"hatafpatah23",1458,"hatafpatah2f",1458,"hatafpatahhebrew",1458,"hatafpatahnarrowhebrew",1458,"hatafpatahquarterhebrew",1458,"hatafpatahwidehebrew",1458,"hatafqamats",1459,"hatafqamats1b",1459,"hatafqamats28",1459,"hatafqamats34",1459,"hatafqamatshebrew",1459,"hatafqamatsnarrowhebrew",1459,"hatafqamatsquarterhebrew",1459,"hatafqamatswidehebrew",1459,"hatafsegol",1457,"hatafsegol17",1457,"hatafsegol24",1457,"hatafsegol30",1457,"hatafsegolhebrew",1457,"hatafsegolnarrowhebrew",1457,"hatafsegolquarterhebrew",1457,"hatafsegolwidehebrew",1457,"hbar",295,"hbopomofo",12559,"hbrevebelow",7723,"hcedilla",7721,"hcircle",9431,"hcircumflex",293,"hdieresis",7719,"hdotaccent",7715,"hdotbelow",7717,"he",1492,"heart",9829,"heartsuitblack",9829,"heartsuitwhite",9825,"hedagesh",64308,"hedageshhebrew",64308,"hehaltonearabic",1729,"heharabic",1607,"hehebrew",1492,"hehfinalaltonearabic",64423,"hehfinalalttwoarabic",65258,"hehfinalarabic",65258,"hehhamzaabovefinalarabic",64421,"hehhamzaaboveisolatedarabic",64420,"hehinitialaltonearabic",64424,"hehinitialarabic",65259,"hehiragana",12408,"hehmedialaltonearabic",64425,"hehmedialarabic",65260,"heiseierasquare",13179,"hekatakana",12504,"hekatakanahalfwidth",65421,"hekutaarusquare",13110,"henghook",615,"herutusquare",13113,"het",1495,"hethebrew",1495,"hhook",614,"hhooksuperior",689,"hieuhacirclekorean",12923,"hieuhaparenkorean",12827,"hieuhcirclekorean",12909,"hieuhkorean",12622,"hieuhparenkorean",12813,"hihiragana",12402,"hikatakana",12498,"hikatakanahalfwidth",65419,"hiriq",1460,"hiriq14",1460,"hiriq21",1460,"hiriq2d",1460,"hiriqhebrew",1460,"hiriqnarrowhebrew",1460,"hiriqquarterhebrew",1460,"hiriqwidehebrew",1460,"hlinebelow",7830,"hmonospace",65352,"hoarmenian",1392,"hohipthai",3627,"hohiragana",12411,"hokatakana",12507,"hokatakanahalfwidth",65422,"holam",1465,"holam19",1465,"holam26",1465,"holam32",1465,"holamhebrew",1465,"holamnarrowhebrew",1465,"holamquarterhebrew",1465,"holamwidehebrew",1465,"honokhukthai",3630,"hookabovecomb",777,"hookcmb",777,"hookpalatalizedbelowcmb",801,"hookretroflexbelowcmb",802,"hoonsquare",13122,"horicoptic",1001,"horizontalbar",8213,"horncmb",795,"hotsprings",9832,"house",8962,"hparen",9379,"hsuperior",688,"hturned",613,"huhiragana",12405,"huiitosquare",13107,"hukatakana",12501,"hukatakanahalfwidth",65420,"hungarumlaut",733,"hungarumlautcmb",779,"hv",405,"hyphen",45,"hypheninferior",63205,"hyphenmonospace",65293,"hyphensmall",65123,"hyphensuperior",63206,"hyphentwo",8208,"i",105,"iacute",237,"iacyrillic",1103,"ibengali",2439,"ibopomofo",12583,"ibreve",301,"icaron",464,"icircle",9432,"icircumflex",238,"icyrillic",1110,"idblgrave",521,"ideographearthcircle",12943,"ideographfirecircle",12939,"ideographicallianceparen",12863,"ideographiccallparen",12858,"ideographiccentrecircle",12965,"ideographicclose",12294,"ideographiccomma",12289,"ideographiccommaleft",65380,"ideographiccongratulationparen",12855,"ideographiccorrectcircle",12963,"ideographicearthparen",12847,"ideographicenterpriseparen",12861,"ideographicexcellentcircle",12957,"ideographicfestivalparen",12864,"ideographicfinancialcircle",12950,"ideographicfinancialparen",12854,"ideographicfireparen",12843,"ideographichaveparen",12850,"ideographichighcircle",12964,"ideographiciterationmark",12293,"ideographiclaborcircle",12952,"ideographiclaborparen",12856,"ideographicleftcircle",12967,"ideographiclowcircle",12966,"ideographicmedicinecircle",12969,"ideographicmetalparen",12846,"ideographicmoonparen",12842,"ideographicnameparen",12852,"ideographicperiod",12290,"ideographicprintcircle",12958,"ideographicreachparen",12867,"ideographicrepresentparen",12857,"ideographicresourceparen",12862,"ideographicrightcircle",12968,"ideographicsecretcircle",12953,"ideographicselfparen",12866,"ideographicsocietyparen",12851,"ideographicspace",12288,"ideographicspecialparen",12853,"ideographicstockparen",12849,"ideographicstudyparen",12859,"ideographicsunparen",12848,"ideographicsuperviseparen",12860,"ideographicwaterparen",12844,"ideographicwoodparen",12845,"ideographiczero",12295,"ideographmetalcircle",12942,"ideographmooncircle",12938,"ideographnamecircle",12948,"ideographsuncircle",12944,"ideographwatercircle",12940,"ideographwoodcircle",12941,"ideva",2311,"idieresis",239,"idieresisacute",7727,"idieresiscyrillic",1253,"idotbelow",7883,"iebrevecyrillic",1239,"iecyrillic",1077,"ieungacirclekorean",12917,"ieungaparenkorean",12821,"ieungcirclekorean",12903,"ieungkorean",12615,"ieungparenkorean",12807,"igrave",236,"igujarati",2695,"igurmukhi",2567,"ihiragana",12356,"ihookabove",7881,"iibengali",2440,"iicyrillic",1080,"iideva",2312,"iigujarati",2696,"iigurmukhi",2568,"iimatragurmukhi",2624,"iinvertedbreve",523,"iishortcyrillic",1081,"iivowelsignbengali",2496,"iivowelsigndeva",2368,"iivowelsigngujarati",2752,"ij",307,"ikatakana",12452,"ikatakanahalfwidth",65394,"ikorean",12643,"ilde",732,"iluyhebrew",1452,"imacron",299,"imacroncyrillic",1251,"imageorapproximatelyequal",8787,"imatragurmukhi",2623,"imonospace",65353,"increment",8710,"infinity",8734,"iniarmenian",1387,"integral",8747,"integralbottom",8993,"integralbt",8993,"integralex",63733,"integraltop",8992,"integraltp",8992,"intersection",8745,"intisquare",13061,"invbullet",9688,"invcircle",9689,"invsmileface",9787,"iocyrillic",1105,"iogonek",303,"iota",953,"iotadieresis",970,"iotadieresistonos",912,"iotalatin",617,"iotatonos",943,"iparen",9380,"irigurmukhi",2674,"ismallhiragana",12355,"ismallkatakana",12451,"ismallkatakanahalfwidth",65384,"issharbengali",2554,"istroke",616,"isuperior",63213,"iterationhiragana",12445,"iterationkatakana",12541,"itilde",297,"itildebelow",7725,"iubopomofo",12585,"iucyrillic",1102,"ivowelsignbengali",2495,"ivowelsigndeva",2367,"ivowelsigngujarati",2751,"izhitsacyrillic",1141,"izhitsadblgravecyrillic",1143,"j",106,"jaarmenian",1393,"jabengali",2460,"jadeva",2332,"jagujarati",2716,"jagurmukhi",2588,"jbopomofo",12560,"jcaron",496,"jcircle",9433,"jcircumflex",309,"jcrossedtail",669,"jdotlessstroke",607,"jecyrillic",1112,"jeemarabic",1580,"jeemfinalarabic",65182,"jeeminitialarabic",65183,"jeemmedialarabic",65184,"jeharabic",1688,"jehfinalarabic",64395,"jhabengali",2461,"jhadeva",2333,"jhagujarati",2717,"jhagurmukhi",2589,"jheharmenian",1403,"jis",12292,"jmonospace",65354,"jparen",9381,"jsuperior",690,"k",107,"kabashkircyrillic",1185,"kabengali",2453,"kacute",7729,"kacyrillic",1082,"kadescendercyrillic",1179,"kadeva",2325,"kaf",1499,"kafarabic",1603,"kafdagesh",64315,"kafdageshhebrew",64315,"kaffinalarabic",65242,"kafhebrew",1499,"kafinitialarabic",65243,"kafmedialarabic",65244,"kafrafehebrew",64333,"kagujarati",2709,"kagurmukhi",2581,"kahiragana",12363,"kahookcyrillic",1220,"kakatakana",12459,"kakatakanahalfwidth",65398,"kappa",954,"kappasymbolgreek",1008,"kapyeounmieumkorean",12657,"kapyeounphieuphkorean",12676,"kapyeounpieupkorean",12664,"kapyeounssangpieupkorean",12665,"karoriisquare",13069,"kashidaautoarabic",1600,"kashidaautonosidebearingarabic",1600,"kasmallkatakana",12533,"kasquare",13188,"kasraarabic",1616,"kasratanarabic",1613,"kastrokecyrillic",1183,"katahiraprolongmarkhalfwidth",65392,"kaverticalstrokecyrillic",1181,"kbopomofo",12558,"kcalsquare",13193,"kcaron",489,"kcedilla",311,"kcircle",9434,"kcommaaccent",311,"kdotbelow",7731,"keharmenian",1412,"kehiragana",12369,"kekatakana",12465,"kekatakanahalfwidth",65401,"kenarmenian",1391,"kesmallkatakana",12534,"kgreenlandic",312,"khabengali",2454,"khacyrillic",1093,"khadeva",2326,"khagujarati",2710,"khagurmukhi",2582,"khaharabic",1582,"khahfinalarabic",65190,"khahinitialarabic",65191,"khahmedialarabic",65192,"kheicoptic",999,"khhadeva",2393,"khhagurmukhi",2649,"khieukhacirclekorean",12920,"khieukhaparenkorean",12824,"khieukhcirclekorean",12906,"khieukhkorean",12619,"khieukhparenkorean",12810,"khokhaithai",3586,"khokhonthai",3589,"khokhuatthai",3587,"khokhwaithai",3588,"khomutthai",3675,"khook",409,"khorakhangthai",3590,"khzsquare",13201,"kihiragana",12365,"kikatakana",12461,"kikatakanahalfwidth",65399,"kiroguramusquare",13077,"kiromeetorusquare",13078,"kirosquare",13076,"kiyeokacirclekorean",12910,"kiyeokaparenkorean",12814,"kiyeokcirclekorean",12896,"kiyeokkorean",12593,"kiyeokparenkorean",12800,"kiyeoksioskorean",12595,"kjecyrillic",1116,"klinebelow",7733,"klsquare",13208,"kmcubedsquare",13222,"kmonospace",65355,"kmsquaredsquare",13218,"kohiragana",12371,"kohmsquare",13248,"kokaithai",3585,"kokatakana",12467,"kokatakanahalfwidth",65402,"kooposquare",13086,"koppacyrillic",1153,"koreanstandardsymbol",12927,"koroniscmb",835,"kparen",9382,"kpasquare",13226,"ksicyrillic",1135,"ktsquare",13263,"kturned",670,"kuhiragana",12367,"kukatakana",12463,"kukatakanahalfwidth",65400,"kvsquare",13240,"kwsquare",13246,"l",108,"labengali",2482,"lacute",314,"ladeva",2354,"lagujarati",2738,"lagurmukhi",2610,"lakkhangyaothai",3653,"lamaleffinalarabic",65276,"lamalefhamzaabovefinalarabic",65272,"lamalefhamzaaboveisolatedarabic",65271,"lamalefhamzabelowfinalarabic",65274,"lamalefhamzabelowisolatedarabic",65273,"lamalefisolatedarabic",65275,"lamalefmaddaabovefinalarabic",65270,"lamalefmaddaaboveisolatedarabic",65269,"lamarabic",1604,"lambda",955,"lambdastroke",411,"lamed",1500,"lameddagesh",64316,"lameddageshhebrew",64316,"lamedhebrew",1500,"lamfinalarabic",65246,"lamhahinitialarabic",64714,"laminitialarabic",65247,"lamjeeminitialarabic",64713,"lamkhahinitialarabic",64715,"lamlamhehisolatedarabic",65010,"lammedialarabic",65248,"lammeemhahinitialarabic",64904,"lammeeminitialarabic",64716,"largecircle",9711,"lbar",410,"lbelt",620,"lbopomofo",12556,"lcaron",318,"lcedilla",316,"lcircle",9435,"lcircumflexbelow",7741,"lcommaaccent",316,"ldot",320,"ldotaccent",320,"ldotbelow",7735,"ldotbelowmacron",7737,"leftangleabovecmb",794,"lefttackbelowcmb",792,"less",60,"lessequal",8804,"lessequalorgreater",8922,"lessmonospace",65308,"lessorequivalent",8818,"lessorgreater",8822,"lessoverequal",8806,"lesssmall",65124,"lezh",622,"lfblock",9612,"lhookretroflex",621,"lira",8356,"liwnarmenian",1388,"lj",457,"ljecyrillic",1113,"ll",63168,"lladeva",2355,"llagujarati",2739,"llinebelow",7739,"llladeva",2356,"llvocalicbengali",2529,"llvocalicdeva",2401,"llvocalicvowelsignbengali",2531,"llvocalicvowelsigndeva",2403,"lmiddletilde",619,"lmonospace",65356,"lmsquare",13264,"lochulathai",3628,"logicaland",8743,"logicalnot",172,"logicalnotreversed",8976,"logicalor",8744,"lolingthai",3621,"longs",383,"lowlinecenterline",65102,"lowlinecmb",818,"lowlinedashed",65101,"lozenge",9674,"lparen",9383,"lslash",322,"lsquare",8467,"lsuperior",63214,"ltshade",9617,"luthai",3622,"lvocalicbengali",2444,"lvocalicdeva",2316,"lvocalicvowelsignbengali",2530,"lvocalicvowelsigndeva",2402,"lxsquare",13267,"m",109,"mabengali",2478,"macron",175,"macronbelowcmb",817,"macroncmb",772,"macronlowmod",717,"macronmonospace",65507,"macute",7743,"madeva",2350,"magujarati",2734,"magurmukhi",2606,"mahapakhhebrew",1444,"mahapakhlefthebrew",1444,"mahiragana",12414,"maichattawalowleftthai",63637,"maichattawalowrightthai",63636,"maichattawathai",3659,"maichattawaupperleftthai",63635,"maieklowleftthai",63628,"maieklowrightthai",63627,"maiekthai",3656,"maiekupperleftthai",63626,"maihanakatleftthai",63620,"maihanakatthai",3633,"maitaikhuleftthai",63625,"maitaikhuthai",3655,"maitholowleftthai",63631,"maitholowrightthai",63630,"maithothai",3657,"maithoupperleftthai",63629,"maitrilowleftthai",63634,"maitrilowrightthai",63633,"maitrithai",3658,"maitriupperleftthai",63632,"maiyamokthai",3654,"makatakana",12510,"makatakanahalfwidth",65423,"male",9794,"mansyonsquare",13127,"maqafhebrew",1470,"mars",9794,"masoracirclehebrew",1455,"masquare",13187,"mbopomofo",12551,"mbsquare",13268,"mcircle",9436,"mcubedsquare",13221,"mdotaccent",7745,"mdotbelow",7747,"meemarabic",1605,"meemfinalarabic",65250,"meeminitialarabic",65251,"meemmedialarabic",65252,"meemmeeminitialarabic",64721,"meemmeemisolatedarabic",64584,"meetorusquare",13133,"mehiragana",12417,"meizierasquare",13182,"mekatakana",12513,"mekatakanahalfwidth",65426,"mem",1502,"memdagesh",64318,"memdageshhebrew",64318,"memhebrew",1502,"menarmenian",1396,"merkhahebrew",1445,"merkhakefulahebrew",1446,"merkhakefulalefthebrew",1446,"merkhalefthebrew",1445,"mhook",625,"mhzsquare",13202,"middledotkatakanahalfwidth",65381,"middot",183,"mieumacirclekorean",12914,"mieumaparenkorean",12818,"mieumcirclekorean",12900,"mieumkorean",12609,"mieumpansioskorean",12656,"mieumparenkorean",12804,"mieumpieupkorean",12654,"mieumsioskorean",12655,"mihiragana",12415,"mikatakana",12511,"mikatakanahalfwidth",65424,"minus",8722,"minusbelowcmb",800,"minuscircle",8854,"minusmod",727,"minusplus",8723,"minute",8242,"miribaarusquare",13130,"mirisquare",13129,"mlonglegturned",624,"mlsquare",13206,"mmcubedsquare",13219,"mmonospace",65357,"mmsquaredsquare",13215,"mohiragana",12418,"mohmsquare",13249,"mokatakana",12514,"mokatakanahalfwidth",65427,"molsquare",13270,"momathai",3617,"moverssquare",13223,"moverssquaredsquare",13224,"mparen",9384,"mpasquare",13227,"mssquare",13235,"msuperior",63215,"mturned",623,"mu",181,"mu1",181,"muasquare",13186,"muchgreater",8811,"muchless",8810,"mufsquare",13196,"mugreek",956,"mugsquare",13197,"muhiragana",12416,"mukatakana",12512,"mukatakanahalfwidth",65425,"mulsquare",13205,"multiply",215,"mumsquare",13211,"munahhebrew",1443,"munahlefthebrew",1443,"musicalnote",9834,"musicalnotedbl",9835,"musicflatsign",9837,"musicsharpsign",9839,"mussquare",13234,"muvsquare",13238,"muwsquare",13244,"mvmegasquare",13241,"mvsquare",13239,"mwmegasquare",13247,"mwsquare",13245,"n",110,"nabengali",2472,"nabla",8711,"nacute",324,"nadeva",2344,"nagujarati",2728,"nagurmukhi",2600,"nahiragana",12394,"nakatakana",12490,"nakatakanahalfwidth",65413,"napostrophe",329,"nasquare",13185,"nbopomofo",12555,"nbspace",160,"ncaron",328,"ncedilla",326,"ncircle",9437,"ncircumflexbelow",7755,"ncommaaccent",326,"ndotaccent",7749,"ndotbelow",7751,"nehiragana",12397,"nekatakana",12493,"nekatakanahalfwidth",65416,"newsheqelsign",8362,"nfsquare",13195,"ngabengali",2457,"ngadeva",2329,"ngagujarati",2713,"ngagurmukhi",2585,"ngonguthai",3591,"nhiragana",12435,"nhookleft",626,"nhookretroflex",627,"nieunacirclekorean",12911,"nieunaparenkorean",12815,"nieuncieuckorean",12597,"nieuncirclekorean",12897,"nieunhieuhkorean",12598,"nieunkorean",12596,"nieunpansioskorean",12648,"nieunparenkorean",12801,"nieunsioskorean",12647,"nieuntikeutkorean",12646,"nihiragana",12395,"nikatakana",12491,"nikatakanahalfwidth",65414,"nikhahitleftthai",63641,"nikhahitthai",3661,"nine",57,"ninearabic",1641,"ninebengali",2543,"ninecircle",9320,"ninecircleinversesansserif",10130,"ninedeva",2415,"ninegujarati",2799,"ninegurmukhi",2671,"ninehackarabic",1641,"ninehangzhou",12329,"nineideographicparen",12840,"nineinferior",8329,"ninemonospace",65305,"nineoldstyle",63289,"nineparen",9340,"nineperiod",9360,"ninepersian",1785,"nineroman",8568,"ninesuperior",8313,"nineteencircle",9330,"nineteenparen",9350,"nineteenperiod",9370,"ninethai",3673,"nj",460,"njecyrillic",1114,"nkatakana",12531,"nkatakanahalfwidth",65437,"nlegrightlong",414,"nlinebelow",7753,"nmonospace",65358,"nmsquare",13210,"nnabengali",2467,"nnadeva",2339,"nnagujarati",2723,"nnagurmukhi",2595,"nnnadeva",2345,"nohiragana",12398,"nokatakana",12494,"nokatakanahalfwidth",65417,"nonbreakingspace",160,"nonenthai",3603,"nonuthai",3609,"noonarabic",1606,"noonfinalarabic",65254,"noonghunnaarabic",1722,"noonghunnafinalarabic",64415,"nooninitialarabic",65255,"noonjeeminitialarabic",64722,"noonjeemisolatedarabic",64587,"noonmedialarabic",65256,"noonmeeminitialarabic",64725,"noonmeemisolatedarabic",64590,"noonnoonfinalarabic",64653,"notcontains",8716,"notelement",8713,"notelementof",8713,"notequal",8800,"notgreater",8815,"notgreaternorequal",8817,"notgreaternorless",8825,"notidentical",8802,"notless",8814,"notlessnorequal",8816,"notparallel",8742,"notprecedes",8832,"notsubset",8836,"notsucceeds",8833,"notsuperset",8837,"nowarmenian",1398,"nparen",9385,"nssquare",13233,"nsuperior",8319,"ntilde",241,"nu",957,"nuhiragana",12396,"nukatakana",12492,"nukatakanahalfwidth",65415,"nuktabengali",2492,"nuktadeva",2364,"nuktagujarati",2748,"nuktagurmukhi",2620,"numbersign",35,"numbersignmonospace",65283,"numbersignsmall",65119,"numeralsigngreek",884,"numeralsignlowergreek",885,"numero",8470,"nun",1504,"nundagesh",64320,"nundageshhebrew",64320,"nunhebrew",1504,"nvsquare",13237,"nwsquare",13243,"nyabengali",2462,"nyadeva",2334,"nyagujarati",2718,"nyagurmukhi",2590,"o",111,"oacute",243,"oangthai",3629,"obarred",629,"obarredcyrillic",1257,"obarreddieresiscyrillic",1259,"obengali",2451,"obopomofo",12571,"obreve",335,"ocandradeva",2321,"ocandragujarati",2705,"ocandravowelsigndeva",2377,"ocandravowelsigngujarati",2761,"ocaron",466,"ocircle",9438,"ocircumflex",244,"ocircumflexacute",7889,"ocircumflexdotbelow",7897,"ocircumflexgrave",7891,"ocircumflexhookabove",7893,"ocircumflextilde",7895,"ocyrillic",1086,"odblacute",337,"odblgrave",525,"odeva",2323,"odieresis",246,"odieresiscyrillic",1255,"odotbelow",7885,"oe",339,"oekorean",12634,"ogonek",731,"ogonekcmb",808,"ograve",242,"ogujarati",2707,"oharmenian",1413,"ohiragana",12362,"ohookabove",7887,"ohorn",417,"ohornacute",7899,"ohorndotbelow",7907,"ohorngrave",7901,"ohornhookabove",7903,"ohorntilde",7905,"ohungarumlaut",337,"oi",419,"oinvertedbreve",527,"okatakana",12458,"okatakanahalfwidth",65397,"okorean",12631,"olehebrew",1451,"omacron",333,"omacronacute",7763,"omacrongrave",7761,"omdeva",2384,"omega",969,"omega1",982,"omegacyrillic",1121,"omegalatinclosed",631,"omegaroundcyrillic",1147,"omegatitlocyrillic",1149,"omegatonos",974,"omgujarati",2768,"omicron",959,"omicrontonos",972,"omonospace",65359,"one",49,"onearabic",1633,"onebengali",2535,"onecircle",9312,"onecircleinversesansserif",10122,"onedeva",2407,"onedotenleader",8228,"oneeighth",8539,"onefitted",63196,"onegujarati",2791,"onegurmukhi",2663,"onehackarabic",1633,"onehalf",189,"onehangzhou",12321,"oneideographicparen",12832,"oneinferior",8321,"onemonospace",65297,"onenumeratorbengali",2548,"oneoldstyle",63281,"oneparen",9332,"oneperiod",9352,"onepersian",1777,"onequarter",188,"oneroman",8560,"onesuperior",185,"onethai",3665,"onethird",8531,"oogonek",491,"oogonekmacron",493,"oogurmukhi",2579,"oomatragurmukhi",2635,"oopen",596,"oparen",9386,"openbullet",9702,"option",8997,"ordfeminine",170,"ordmasculine",186,"orthogonal",8735,"oshortdeva",2322,"oshortvowelsigndeva",2378,"oslash",248,"oslashacute",511,"osmallhiragana",12361,"osmallkatakana",12457,"osmallkatakanahalfwidth",65387,"ostrokeacute",511,"osuperior",63216,"otcyrillic",1151,"otilde",245,"otildeacute",7757,"otildedieresis",7759,"oubopomofo",12577,"overline",8254,"overlinecenterline",65098,"overlinecmb",773,"overlinedashed",65097,"overlinedblwavy",65100,"overlinewavy",65099,"overscore",175,"ovowelsignbengali",2507,"ovowelsigndeva",2379,"ovowelsigngujarati",2763,"p",112,"paampssquare",13184,"paasentosquare",13099,"pabengali",2474,"pacute",7765,"padeva",2346,"pagedown",8671,"pageup",8670,"pagujarati",2730,"pagurmukhi",2602,"pahiragana",12401,"paiyannoithai",3631,"pakatakana",12497,"palatalizationcyrilliccmb",1156,"palochkacyrillic",1216,"pansioskorean",12671,"paragraph",182,"parallel",8741,"parenleft",40,"parenleftaltonearabic",64830,"parenleftbt",63725,"parenleftex",63724,"parenleftinferior",8333,"parenleftmonospace",65288,"parenleftsmall",65113,"parenleftsuperior",8317,"parenlefttp",63723,"parenleftvertical",65077,"parenright",41,"parenrightaltonearabic",64831,"parenrightbt",63736,"parenrightex",63735,"parenrightinferior",8334,"parenrightmonospace",65289,"parenrightsmall",65114,"parenrightsuperior",8318,"parenrighttp",63734,"parenrightvertical",65078,"partialdiff",8706,"paseqhebrew",1472,"pashtahebrew",1433,"pasquare",13225,"patah",1463,"patah11",1463,"patah1d",1463,"patah2a",1463,"patahhebrew",1463,"patahnarrowhebrew",1463,"patahquarterhebrew",1463,"patahwidehebrew",1463,"pazerhebrew",1441,"pbopomofo",12550,"pcircle",9439,"pdotaccent",7767,"pe",1508,"pecyrillic",1087,"pedagesh",64324,"pedageshhebrew",64324,"peezisquare",13115,"pefinaldageshhebrew",64323,"peharabic",1662,"peharmenian",1402,"pehebrew",1508,"pehfinalarabic",64343,"pehinitialarabic",64344,"pehiragana",12410,"pehmedialarabic",64345,"pekatakana",12506,"pemiddlehookcyrillic",1191,"perafehebrew",64334,"percent",37,"percentarabic",1642,"percentmonospace",65285,"percentsmall",65130,"period",46,"periodarmenian",1417,"periodcentered",183,"periodhalfwidth",65377,"periodinferior",63207,"periodmonospace",65294,"periodsmall",65106,"periodsuperior",63208,"perispomenigreekcmb",834,"perpendicular",8869,"perthousand",8240,"peseta",8359,"pfsquare",13194,"phabengali",2475,"phadeva",2347,"phagujarati",2731,"phagurmukhi",2603,"phi",966,"phi1",981,"phieuphacirclekorean",12922,"phieuphaparenkorean",12826,"phieuphcirclekorean",12908,"phieuphkorean",12621,"phieuphparenkorean",12812,"philatin",632,"phinthuthai",3642,"phisymbolgreek",981,"phook",421,"phophanthai",3614,"phophungthai",3612,"phosamphaothai",3616,"pi",960,"pieupacirclekorean",12915,"pieupaparenkorean",12819,"pieupcieuckorean",12662,"pieupcirclekorean",12901,"pieupkiyeokkorean",12658,"pieupkorean",12610,"pieupparenkorean",12805,"pieupsioskiyeokkorean",12660,"pieupsioskorean",12612,"pieupsiostikeutkorean",12661,"pieupthieuthkorean",12663,"pieuptikeutkorean",12659,"pihiragana",12404,"pikatakana",12500,"pisymbolgreek",982,"piwrarmenian",1411,"plus",43,"plusbelowcmb",799,"pluscircle",8853,"plusminus",177,"plusmod",726,"plusmonospace",65291,"plussmall",65122,"plussuperior",8314,"pmonospace",65360,"pmsquare",13272,"pohiragana",12413,"pointingindexdownwhite",9759,"pointingindexleftwhite",9756,"pointingindexrightwhite",9758,"pointingindexupwhite",9757,"pokatakana",12509,"poplathai",3611,"postalmark",12306,"postalmarkface",12320,"pparen",9387,"precedes",8826,"prescription",8478,"primemod",697,"primereversed",8245,"product",8719,"projective",8965,"prolongedkana",12540,"propellor",8984,"propersubset",8834,"propersuperset",8835,"proportion",8759,"proportional",8733,"psi",968,"psicyrillic",1137,"psilipneumatacyrilliccmb",1158,"pssquare",13232,"puhiragana",12407,"pukatakana",12503,"pvsquare",13236,"pwsquare",13242,"q",113,"qadeva",2392,"qadmahebrew",1448,"qafarabic",1602,"qaffinalarabic",65238,"qafinitialarabic",65239,"qafmedialarabic",65240,"qamats",1464,"qamats10",1464,"qamats1a",1464,"qamats1c",1464,"qamats27",1464,"qamats29",1464,"qamats33",1464,"qamatsde",1464,"qamatshebrew",1464,"qamatsnarrowhebrew",1464,"qamatsqatanhebrew",1464,"qamatsqatannarrowhebrew",1464,"qamatsqatanquarterhebrew",1464,"qamatsqatanwidehebrew",1464,"qamatsquarterhebrew",1464,"qamatswidehebrew",1464,"qarneyparahebrew",1439,"qbopomofo",12561,"qcircle",9440,"qhook",672,"qmonospace",65361,"qof",1511,"qofdagesh",64327,"qofdageshhebrew",64327,"qofhebrew",1511,"qparen",9388,"quarternote",9833,"qubuts",1467,"qubuts18",1467,"qubuts25",1467,"qubuts31",1467,"qubutshebrew",1467,"qubutsnarrowhebrew",1467,"qubutsquarterhebrew",1467,"qubutswidehebrew",1467,"question",63,"questionarabic",1567,"questionarmenian",1374,"questiondown",191,"questiondownsmall",63423,"questiongreek",894,"questionmonospace",65311,"questionsmall",63295,"quotedbl",34,"quotedblbase",8222,"quotedblleft",8220,"quotedblmonospace",65282,"quotedblprime",12318,"quotedblprimereversed",12317,"quotedblright",8221,"quoteleft",8216,"quoteleftreversed",8219,"quotereversed",8219,"quoteright",8217,"quoterightn",329,"quotesinglbase",8218,"quotesingle",39,"quotesinglemonospace",65287,"r",114,"raarmenian",1404,"rabengali",2480,"racute",341,"radeva",2352,"radical",8730,"radicalex",63717,"radoverssquare",13230,"radoverssquaredsquare",13231,"radsquare",13229,"rafe",1471,"rafehebrew",1471,"ragujarati",2736,"ragurmukhi",2608,"rahiragana",12425,"rakatakana",12521,"rakatakanahalfwidth",65431,"ralowerdiagonalbengali",2545,"ramiddlediagonalbengali",2544,"ramshorn",612,"ratio",8758,"rbopomofo",12566,"rcaron",345,"rcedilla",343,"rcircle",9441,"rcommaaccent",343,"rdblgrave",529,"rdotaccent",7769,"rdotbelow",7771,"rdotbelowmacron",7773,"referencemark",8251,"reflexsubset",8838,"reflexsuperset",8839,"registered",174,"registersans",63720,"registerserif",63194,"reharabic",1585,"reharmenian",1408,"rehfinalarabic",65198,"rehiragana",12428,"rekatakana",12524,"rekatakanahalfwidth",65434,"resh",1512,"reshdageshhebrew",64328,"reshhebrew",1512,"reversedtilde",8765,"reviahebrew",1431,"reviamugrashhebrew",1431,"revlogicalnot",8976,"rfishhook",638,"rfishhookreversed",639,"rhabengali",2525,"rhadeva",2397,"rho",961,"rhook",637,"rhookturned",635,"rhookturnedsuperior",693,"rhosymbolgreek",1009,"rhotichookmod",734,"rieulacirclekorean",12913,"rieulaparenkorean",12817,"rieulcirclekorean",12899,"rieulhieuhkorean",12608,"rieulkiyeokkorean",12602,"rieulkiyeoksioskorean",12649,"rieulkorean",12601,"rieulmieumkorean",12603,"rieulpansioskorean",12652,"rieulparenkorean",12803,"rieulphieuphkorean",12607,"rieulpieupkorean",12604,"rieulpieupsioskorean",12651,"rieulsioskorean",12605,"rieulthieuthkorean",12606,"rieultikeutkorean",12650,"rieulyeorinhieuhkorean",12653,"rightangle",8735,"righttackbelowcmb",793,"righttriangle",8895,"rihiragana",12426,"rikatakana",12522,"rikatakanahalfwidth",65432,"ring",730,"ringbelowcmb",805,"ringcmb",778,"ringhalfleft",703,"ringhalfleftarmenian",1369,"ringhalfleftbelowcmb",796,"ringhalfleftcentered",723,"ringhalfright",702,"ringhalfrightbelowcmb",825,"ringhalfrightcentered",722,"rinvertedbreve",531,"rittorusquare",13137,"rlinebelow",7775,"rlongleg",636,"rlonglegturned",634,"rmonospace",65362,"rohiragana",12429,"rokatakana",12525,"rokatakanahalfwidth",65435,"roruathai",3619,"rparen",9389,"rrabengali",2524,"rradeva",2353,"rragurmukhi",2652,"rreharabic",1681,"rrehfinalarabic",64397,"rrvocalicbengali",2528,"rrvocalicdeva",2400,"rrvocalicgujarati",2784,"rrvocalicvowelsignbengali",2500,"rrvocalicvowelsigndeva",2372,"rrvocalicvowelsigngujarati",2756,"rsuperior",63217,"rtblock",9616,"rturned",633,"rturnedsuperior",692,"ruhiragana",12427,"rukatakana",12523,"rukatakanahalfwidth",65433,"rupeemarkbengali",2546,"rupeesignbengali",2547,"rupiah",63197,"ruthai",3620,"rvocalicbengali",2443,"rvocalicdeva",2315,"rvocalicgujarati",2699,"rvocalicvowelsignbengali",2499,"rvocalicvowelsigndeva",2371,"rvocalicvowelsigngujarati",2755,"s",115,"sabengali",2488,"sacute",347,"sacutedotaccent",7781,"sadarabic",1589,"sadeva",2360,"sadfinalarabic",65210,"sadinitialarabic",65211,"sadmedialarabic",65212,"sagujarati",2744,"sagurmukhi",2616,"sahiragana",12373,"sakatakana",12469,"sakatakanahalfwidth",65403,"sallallahoualayhewasallamarabic",65018,"samekh",1505,"samekhdagesh",64321,"samekhdageshhebrew",64321,"samekhhebrew",1505,"saraaathai",3634,"saraaethai",3649,"saraaimaimalaithai",3652,"saraaimaimuanthai",3651,"saraamthai",3635,"saraathai",3632,"saraethai",3648,"saraiileftthai",63622,"saraiithai",3637,"saraileftthai",63621,"saraithai",3636,"saraothai",3650,"saraueeleftthai",63624,"saraueethai",3639,"saraueleftthai",63623,"sarauethai",3638,"sarauthai",3640,"sarauuthai",3641,"sbopomofo",12569,"scaron",353,"scarondotaccent",7783,"scedilla",351,"schwa",601,"schwacyrillic",1241,"schwadieresiscyrillic",1243,"schwahook",602,"scircle",9442,"scircumflex",349,"scommaaccent",537,"sdotaccent",7777,"sdotbelow",7779,"sdotbelowdotaccent",7785,"seagullbelowcmb",828,"second",8243,"secondtonechinese",714,"section",167,"seenarabic",1587,"seenfinalarabic",65202,"seeninitialarabic",65203,"seenmedialarabic",65204,"segol",1462,"segol13",1462,"segol1f",1462,"segol2c",1462,"segolhebrew",1462,"segolnarrowhebrew",1462,"segolquarterhebrew",1462,"segoltahebrew",1426,"segolwidehebrew",1462,"seharmenian",1405,"sehiragana",12379,"sekatakana",12475,"sekatakanahalfwidth",65406,"semicolon",59,"semicolonarabic",1563,"semicolonmonospace",65307,"semicolonsmall",65108,"semivoicedmarkkana",12444,"semivoicedmarkkanahalfwidth",65439,"sentisquare",13090,"sentosquare",13091,"seven",55,"sevenarabic",1639,"sevenbengali",2541,"sevencircle",9318,"sevencircleinversesansserif",10128,"sevendeva",2413,"seveneighths",8542,"sevengujarati",2797,"sevengurmukhi",2669,"sevenhackarabic",1639,"sevenhangzhou",12327,"sevenideographicparen",12838,"seveninferior",8327,"sevenmonospace",65303,"sevenoldstyle",63287,"sevenparen",9338,"sevenperiod",9358,"sevenpersian",1783,"sevenroman",8566,"sevensuperior",8311,"seventeencircle",9328,"seventeenparen",9348,"seventeenperiod",9368,"seventhai",3671,"sfthyphen",173,"shaarmenian",1399,"shabengali",2486,"shacyrillic",1096,"shaddaarabic",1617,"shaddadammaarabic",64609,"shaddadammatanarabic",64606,"shaddafathaarabic",64608,"shaddakasraarabic",64610,"shaddakasratanarabic",64607,"shade",9618,"shadedark",9619,"shadelight",9617,"shademedium",9618,"shadeva",2358,"shagujarati",2742,"shagurmukhi",2614,"shalshelethebrew",1427,"shbopomofo",12565,"shchacyrillic",1097,"sheenarabic",1588,"sheenfinalarabic",65206,"sheeninitialarabic",65207,"sheenmedialarabic",65208,"sheicoptic",995,"sheqel",8362,"sheqelhebrew",8362,"sheva",1456,"sheva115",1456,"sheva15",1456,"sheva22",1456,"sheva2e",1456,"shevahebrew",1456,"shevanarrowhebrew",1456,"shevaquarterhebrew",1456,"shevawidehebrew",1456,"shhacyrillic",1211,"shimacoptic",1005,"shin",1513,"shindagesh",64329,"shindageshhebrew",64329,"shindageshshindot",64300,"shindageshshindothebrew",64300,"shindageshsindot",64301,"shindageshsindothebrew",64301,"shindothebrew",1473,"shinhebrew",1513,"shinshindot",64298,"shinshindothebrew",64298,"shinsindot",64299,"shinsindothebrew",64299,"shook",642,"sigma",963,"sigma1",962,"sigmafinal",962,"sigmalunatesymbolgreek",1010,"sihiragana",12375,"sikatakana",12471,"sikatakanahalfwidth",65404,"siluqhebrew",1469,"siluqlefthebrew",1469,"similar",8764,"sindothebrew",1474,"siosacirclekorean",12916,"siosaparenkorean",12820,"sioscieuckorean",12670,"sioscirclekorean",12902,"sioskiyeokkorean",12666,"sioskorean",12613,"siosnieunkorean",12667,"siosparenkorean",12806,"siospieupkorean",12669,"siostikeutkorean",12668,"six",54,"sixarabic",1638,"sixbengali",2540,"sixcircle",9317,"sixcircleinversesansserif",10127,"sixdeva",2412,"sixgujarati",2796,"sixgurmukhi",2668,"sixhackarabic",1638,"sixhangzhou",12326,"sixideographicparen",12837,"sixinferior",8326,"sixmonospace",65302,"sixoldstyle",63286,"sixparen",9337,"sixperiod",9357,"sixpersian",1782,"sixroman",8565,"sixsuperior",8310,"sixteencircle",9327,"sixteencurrencydenominatorbengali",2553,"sixteenparen",9347,"sixteenperiod",9367,"sixthai",3670,"slash",47,"slashmonospace",65295,"slong",383,"slongdotaccent",7835,"smileface",9786,"smonospace",65363,"sofpasuqhebrew",1475,"softhyphen",173,"softsigncyrillic",1100,"sohiragana",12381,"sokatakana",12477,"sokatakanahalfwidth",65407,"soliduslongoverlaycmb",824,"solidusshortoverlaycmb",823,"sorusithai",3625,"sosalathai",3624,"sosothai",3595,"sosuathai",3626,"space",32,"spacehackarabic",32,"spade",9824,"spadesuitblack",9824,"spadesuitwhite",9828,"sparen",9390,"squarebelowcmb",827,"squarecc",13252,"squarecm",13213,"squarediagonalcrosshatchfill",9641,"squarehorizontalfill",9636,"squarekg",13199,"squarekm",13214,"squarekmcapital",13262,"squareln",13265,"squarelog",13266,"squaremg",13198,"squaremil",13269,"squaremm",13212,"squaremsquared",13217,"squareorthogonalcrosshatchfill",9638,"squareupperlefttolowerrightfill",9639,"squareupperrighttolowerleftfill",9640,"squareverticalfill",9637,"squarewhitewithsmallblack",9635,"srsquare",13275,"ssabengali",2487,"ssadeva",2359,"ssagujarati",2743,"ssangcieuckorean",12617,"ssanghieuhkorean",12677,"ssangieungkorean",12672,"ssangkiyeokkorean",12594,"ssangnieunkorean",12645,"ssangpieupkorean",12611,"ssangsioskorean",12614,"ssangtikeutkorean",12600,"ssuperior",63218,"sterling",163,"sterlingmonospace",65505,"strokelongoverlaycmb",822,"strokeshortoverlaycmb",821,"subset",8834,"subsetnotequal",8842,"subsetorequal",8838,"succeeds",8827,"suchthat",8715,"suhiragana",12377,"sukatakana",12473,"sukatakanahalfwidth",65405,"sukunarabic",1618,"summation",8721,"sun",9788,"superset",8835,"supersetnotequal",8843,"supersetorequal",8839,"svsquare",13276,"syouwaerasquare",13180,"t",116,"tabengali",2468,"tackdown",8868,"tackleft",8867,"tadeva",2340,"tagujarati",2724,"tagurmukhi",2596,"taharabic",1591,"tahfinalarabic",65218,"tahinitialarabic",65219,"tahiragana",12383,"tahmedialarabic",65220,"taisyouerasquare",13181,"takatakana",12479,"takatakanahalfwidth",65408,"tatweelarabic",1600,"tau",964,"tav",1514,"tavdages",64330,"tavdagesh",64330,"tavdageshhebrew",64330,"tavhebrew",1514,"tbar",359,"tbopomofo",12554,"tcaron",357,"tccurl",680,"tcedilla",355,"tcheharabic",1670,"tchehfinalarabic",64379,"tchehinitialarabic",64380,"tchehmedialarabic",64381,"tcircle",9443,"tcircumflexbelow",7793,"tcommaaccent",355,"tdieresis",7831,"tdotaccent",7787,"tdotbelow",7789,"tecyrillic",1090,"tedescendercyrillic",1197,"teharabic",1578,"tehfinalarabic",65174,"tehhahinitialarabic",64674,"tehhahisolatedarabic",64524,"tehinitialarabic",65175,"tehiragana",12390,"tehjeeminitialarabic",64673,"tehjeemisolatedarabic",64523,"tehmarbutaarabic",1577,"tehmarbutafinalarabic",65172,"tehmedialarabic",65176,"tehmeeminitialarabic",64676,"tehmeemisolatedarabic",64526,"tehnoonfinalarabic",64627,"tekatakana",12486,"tekatakanahalfwidth",65411,"telephone",8481,"telephoneblack",9742,"telishagedolahebrew",1440,"telishaqetanahebrew",1449,"tencircle",9321,"tenideographicparen",12841,"tenparen",9341,"tenperiod",9361,"tenroman",8569,"tesh",679,"tet",1496,"tetdagesh",64312,"tetdageshhebrew",64312,"tethebrew",1496,"tetsecyrillic",1205,"tevirhebrew",1435,"tevirlefthebrew",1435,"thabengali",2469,"thadeva",2341,"thagujarati",2725,"thagurmukhi",2597,"thalarabic",1584,"thalfinalarabic",65196,"thanthakhatlowleftthai",63640,"thanthakhatlowrightthai",63639,"thanthakhatthai",3660,"thanthakhatupperleftthai",63638,"theharabic",1579,"thehfinalarabic",65178,"thehinitialarabic",65179,"thehmedialarabic",65180,"thereexists",8707,"therefore",8756,"theta",952,"theta1",977,"thetasymbolgreek",977,"thieuthacirclekorean",12921,"thieuthaparenkorean",12825,"thieuthcirclekorean",12907,"thieuthkorean",12620,"thieuthparenkorean",12811,"thirteencircle",9324,"thirteenparen",9344,"thirteenperiod",9364,"thonangmonthothai",3601,"thook",429,"thophuthaothai",3602,"thorn",254,"thothahanthai",3607,"thothanthai",3600,"thothongthai",3608,"thothungthai",3606,"thousandcyrillic",1154,"thousandsseparatorarabic",1644,"thousandsseparatorpersian",1644,"three",51,"threearabic",1635,"threebengali",2537,"threecircle",9314,"threecircleinversesansserif",10124,"threedeva",2409,"threeeighths",8540,"threegujarati",2793,"threegurmukhi",2665,"threehackarabic",1635,"threehangzhou",12323,"threeideographicparen",12834,"threeinferior",8323,"threemonospace",65299,"threenumeratorbengali",2550,"threeoldstyle",63283,"threeparen",9334,"threeperiod",9354,"threepersian",1779,"threequarters",190,"threequartersemdash",63198,"threeroman",8562,"threesuperior",179,"threethai",3667,"thzsquare",13204,"tihiragana",12385,"tikatakana",12481,"tikatakanahalfwidth",65409,"tikeutacirclekorean",12912,"tikeutaparenkorean",12816,"tikeutcirclekorean",12898,"tikeutkorean",12599,"tikeutparenkorean",12802,"tilde",732,"tildebelowcmb",816,"tildecmb",771,"tildecomb",771,"tildedoublecmb",864,"tildeoperator",8764,"tildeoverlaycmb",820,"tildeverticalcmb",830,"timescircle",8855,"tipehahebrew",1430,"tipehalefthebrew",1430,"tippigurmukhi",2672,"titlocyrilliccmb",1155,"tiwnarmenian",1407,"tlinebelow",7791,"tmonospace",65364,"toarmenian",1385,"tohiragana",12392,"tokatakana",12488,"tokatakanahalfwidth",65412,"tonebarextrahighmod",741,"tonebarextralowmod",745,"tonebarhighmod",742,"tonebarlowmod",744,"tonebarmidmod",743,"tonefive",445,"tonesix",389,"tonetwo",424,"tonos",900,"tonsquare",13095,"topatakthai",3599,"tortoiseshellbracketleft",12308,"tortoiseshellbracketleftsmall",65117,"tortoiseshellbracketleftvertical",65081,"tortoiseshellbracketright",12309,"tortoiseshellbracketrightsmall",65118,"tortoiseshellbracketrightvertical",65082,"totaothai",3605,"tpalatalhook",427,"tparen",9391,"trademark",8482,"trademarksans",63722,"trademarkserif",63195,"tretroflexhook",648,"triagdn",9660,"triaglf",9668,"triagrt",9658,"triagup",9650,"ts",678,"tsadi",1510,"tsadidagesh",64326,"tsadidageshhebrew",64326,"tsadihebrew",1510,"tsecyrillic",1094,"tsere",1461,"tsere12",1461,"tsere1e",1461,"tsere2b",1461,"tserehebrew",1461,"tserenarrowhebrew",1461,"tserequarterhebrew",1461,"tserewidehebrew",1461,"tshecyrillic",1115,"tsuperior",63219,"ttabengali",2463,"ttadeva",2335,"ttagujarati",2719,"ttagurmukhi",2591,"tteharabic",1657,"ttehfinalarabic",64359,"ttehinitialarabic",64360,"ttehmedialarabic",64361,"tthabengali",2464,"tthadeva",2336,"tthagujarati",2720,"tthagurmukhi",2592,"tturned",647,"tuhiragana",12388,"tukatakana",12484,"tukatakanahalfwidth",65410,"tusmallhiragana",12387,"tusmallkatakana",12483,"tusmallkatakanahalfwidth",65391,"twelvecircle",9323,"twelveparen",9343,"twelveperiod",9363,"twelveroman",8571,"twentycircle",9331,"twentyhangzhou",21316,"twentyparen",9351,"twentyperiod",9371,"two",50,"twoarabic",1634,"twobengali",2536,"twocircle",9313,"twocircleinversesansserif",10123,"twodeva",2408,"twodotenleader",8229,"twodotleader",8229,"twodotleadervertical",65072,"twogujarati",2792,"twogurmukhi",2664,"twohackarabic",1634,"twohangzhou",12322,"twoideographicparen",12833,"twoinferior",8322,"twomonospace",65298,"twonumeratorbengali",2549,"twooldstyle",63282,"twoparen",9333,"twoperiod",9353,"twopersian",1778,"tworoman",8561,"twostroke",443,"twosuperior",178,"twothai",3666,"twothirds",8532,"u",117,"uacute",250,"ubar",649,"ubengali",2441,"ubopomofo",12584,"ubreve",365,"ucaron",468,"ucircle",9444,"ucircumflex",251,"ucircumflexbelow",7799,"ucyrillic",1091,"udattadeva",2385,"udblacute",369,"udblgrave",533,"udeva",2313,"udieresis",252,"udieresisacute",472,"udieresisbelow",7795,"udieresiscaron",474,"udieresiscyrillic",1265,"udieresisgrave",476,"udieresismacron",470,"udotbelow",7909,"ugrave",249,"ugujarati",2697,"ugurmukhi",2569,"uhiragana",12358,"uhookabove",7911,"uhorn",432,"uhornacute",7913,"uhorndotbelow",7921,"uhorngrave",7915,"uhornhookabove",7917,"uhorntilde",7919,"uhungarumlaut",369,"uhungarumlautcyrillic",1267,"uinvertedbreve",535,"ukatakana",12454,"ukatakanahalfwidth",65395,"ukcyrillic",1145,"ukorean",12636,"umacron",363,"umacroncyrillic",1263,"umacrondieresis",7803,"umatragurmukhi",2625,"umonospace",65365,"underscore",95,"underscoredbl",8215,"underscoremonospace",65343,"underscorevertical",65075,"underscorewavy",65103,"union",8746,"universal",8704,"uogonek",371,"uparen",9392,"upblock",9600,"upperdothebrew",1476,"upsilon",965,"upsilondieresis",971,"upsilondieresistonos",944,"upsilonlatin",650,"upsilontonos",973,"uptackbelowcmb",797,"uptackmod",724,"uragurmukhi",2675,"uring",367,"ushortcyrillic",1118,"usmallhiragana",12357,"usmallkatakana",12453,"usmallkatakanahalfwidth",65385,"ustraightcyrillic",1199,"ustraightstrokecyrillic",1201,"utilde",361,"utildeacute",7801,"utildebelow",7797,"uubengali",2442,"uudeva",2314,"uugujarati",2698,"uugurmukhi",2570,"uumatragurmukhi",2626,"uuvowelsignbengali",2498,"uuvowelsigndeva",2370,"uuvowelsigngujarati",2754,"uvowelsignbengali",2497,"uvowelsigndeva",2369,"uvowelsigngujarati",2753,"v",118,"vadeva",2357,"vagujarati",2741,"vagurmukhi",2613,"vakatakana",12535,"vav",1493,"vavdagesh",64309,"vavdagesh65",64309,"vavdageshhebrew",64309,"vavhebrew",1493,"vavholam",64331,"vavholamhebrew",64331,"vavvavhebrew",1520,"vavyodhebrew",1521,"vcircle",9445,"vdotbelow",7807,"vecyrillic",1074,"veharabic",1700,"vehfinalarabic",64363,"vehinitialarabic",64364,"vehmedialarabic",64365,"vekatakana",12537,"venus",9792,"verticalbar",124,"verticallineabovecmb",781,"verticallinebelowcmb",809,"verticallinelowmod",716,"verticallinemod",712,"vewarmenian",1406,"vhook",651,"vikatakana",12536,"viramabengali",2509,"viramadeva",2381,"viramagujarati",2765,"visargabengali",2435,"visargadeva",2307,"visargagujarati",2691,"vmonospace",65366,"voarmenian",1400,"voicediterationhiragana",12446,"voicediterationkatakana",12542,"voicedmarkkana",12443,"voicedmarkkanahalfwidth",65438,"vokatakana",12538,"vparen",9393,"vtilde",7805,"vturned",652,"vuhiragana",12436,"vukatakana",12532,"w",119,"wacute",7811,"waekorean",12633,"wahiragana",12431,"wakatakana",12527,"wakatakanahalfwidth",65436,"wakorean",12632,"wasmallhiragana",12430,"wasmallkatakana",12526,"wattosquare",13143,"wavedash",12316,"wavyunderscorevertical",65076,"wawarabic",1608,"wawfinalarabic",65262,"wawhamzaabovearabic",1572,"wawhamzaabovefinalarabic",65158,"wbsquare",13277,"wcircle",9446,"wcircumflex",373,"wdieresis",7813,"wdotaccent",7815,"wdotbelow",7817,"wehiragana",12433,"weierstrass",8472,"wekatakana",12529,"wekorean",12638,"weokorean",12637,"wgrave",7809,"whitebullet",9702,"whitecircle",9675,"whitecircleinverse",9689,"whitecornerbracketleft",12302,"whitecornerbracketleftvertical",65091,"whitecornerbracketright",12303,"whitecornerbracketrightvertical",65092,"whitediamond",9671,"whitediamondcontainingblacksmalldiamond",9672,"whitedownpointingsmalltriangle",9663,"whitedownpointingtriangle",9661,"whiteleftpointingsmalltriangle",9667,"whiteleftpointingtriangle",9665,"whitelenticularbracketleft",12310,"whitelenticularbracketright",12311,"whiterightpointingsmalltriangle",9657,"whiterightpointingtriangle",9655,"whitesmallsquare",9643,"whitesmilingface",9786,"whitesquare",9633,"whitestar",9734,"whitetelephone",9743,"whitetortoiseshellbracketleft",12312,"whitetortoiseshellbracketright",12313,"whiteuppointingsmalltriangle",9653,"whiteuppointingtriangle",9651,"wihiragana",12432,"wikatakana",12528,"wikorean",12639,"wmonospace",65367,"wohiragana",12434,"wokatakana",12530,"wokatakanahalfwidth",65382,"won",8361,"wonmonospace",65510,"wowaenthai",3623,"wparen",9394,"wring",7832,"wsuperior",695,"wturned",653,"wynn",447,"x",120,"xabovecmb",829,"xbopomofo",12562,"xcircle",9447,"xdieresis",7821,"xdotaccent",7819,"xeharmenian",1389,"xi",958,"xmonospace",65368,"xparen",9395,"xsuperior",739,"y",121,"yaadosquare",13134,"yabengali",2479,"yacute",253,"yadeva",2351,"yaekorean",12626,"yagujarati",2735,"yagurmukhi",2607,"yahiragana",12420,"yakatakana",12516,"yakatakanahalfwidth",65428,"yakorean",12625,"yamakkanthai",3662,"yasmallhiragana",12419,"yasmallkatakana",12515,"yasmallkatakanahalfwidth",65388,"yatcyrillic",1123,"ycircle",9448,"ycircumflex",375,"ydieresis",255,"ydotaccent",7823,"ydotbelow",7925,"yeharabic",1610,"yehbarreearabic",1746,"yehbarreefinalarabic",64431,"yehfinalarabic",65266,"yehhamzaabovearabic",1574,"yehhamzaabovefinalarabic",65162,"yehhamzaaboveinitialarabic",65163,"yehhamzaabovemedialarabic",65164,"yehinitialarabic",65267,"yehmedialarabic",65268,"yehmeeminitialarabic",64733,"yehmeemisolatedarabic",64600,"yehnoonfinalarabic",64660,"yehthreedotsbelowarabic",1745,"yekorean",12630,"yen",165,"yenmonospace",65509,"yeokorean",12629,"yeorinhieuhkorean",12678,"yerahbenyomohebrew",1450,"yerahbenyomolefthebrew",1450,"yericyrillic",1099,"yerudieresiscyrillic",1273,"yesieungkorean",12673,"yesieungpansioskorean",12675,"yesieungsioskorean",12674,"yetivhebrew",1434,"ygrave",7923,"yhook",436,"yhookabove",7927,"yiarmenian",1397,"yicyrillic",1111,"yikorean",12642,"yinyang",9775,"yiwnarmenian",1410,"ymonospace",65369,"yod",1497,"yoddagesh",64313,"yoddageshhebrew",64313,"yodhebrew",1497,"yodyodhebrew",1522,"yodyodpatahhebrew",64287,"yohiragana",12424,"yoikorean",12681,"yokatakana",12520,"yokatakanahalfwidth",65430,"yokorean",12635,"yosmallhiragana",12423,"yosmallkatakana",12519,"yosmallkatakanahalfwidth",65390,"yotgreek",1011,"yoyaekorean",12680,"yoyakorean",12679,"yoyakthai",3618,"yoyingthai",3597,"yparen",9396,"ypogegrammeni",890,"ypogegrammenigreekcmb",837,"yr",422,"yring",7833,"ysuperior",696,"ytilde",7929,"yturned",654,"yuhiragana",12422,"yuikorean",12684,"yukatakana",12518,"yukatakanahalfwidth",65429,"yukorean",12640,"yusbigcyrillic",1131,"yusbigiotifiedcyrillic",1133,"yuslittlecyrillic",1127,"yuslittleiotifiedcyrillic",1129,"yusmallhiragana",12421,"yusmallkatakana",12517,"yusmallkatakanahalfwidth",65389,"yuyekorean",12683,"yuyeokorean",12682,"yyabengali",2527,"yyadeva",2399,"z",122,"zaarmenian",1382,"zacute",378,"zadeva",2395,"zagurmukhi",2651,"zaharabic",1592,"zahfinalarabic",65222,"zahinitialarabic",65223,"zahiragana",12374,"zahmedialarabic",65224,"zainarabic",1586,"zainfinalarabic",65200,"zakatakana",12470,"zaqefgadolhebrew",1429,"zaqefqatanhebrew",1428,"zarqahebrew",1432,"zayin",1494,"zayindagesh",64310,"zayindageshhebrew",64310,"zayinhebrew",1494,"zbopomofo",12567,"zcaron",382,"zcircle",9449,"zcircumflex",7825,"zcurl",657,"zdot",380,"zdotaccent",380,"zdotbelow",7827,"zecyrillic",1079,"zedescendercyrillic",1177,"zedieresiscyrillic",1247,"zehiragana",12380,"zekatakana",12476,"zero",48,"zeroarabic",1632,"zerobengali",2534,"zerodeva",2406,"zerogujarati",2790,"zerogurmukhi",2662,"zerohackarabic",1632,"zeroinferior",8320,"zeromonospace",65296,"zerooldstyle",63280,"zeropersian",1776,"zerosuperior",8304,"zerothai",3664,"zerowidthjoiner",65279,"zerowidthnonjoiner",8204,"zerowidthspace",8203,"zeta",950,"zhbopomofo",12563,"zhearmenian",1386,"zhebrevecyrillic",1218,"zhecyrillic",1078,"zhedescendercyrillic",1175,"zhedieresiscyrillic",1245,"zihiragana",12376,"zikatakana",12472,"zinorhebrew",1454,"zlinebelow",7829,"zmonospace",65370,"zohiragana",12382,"zokatakana",12478,"zparen",9397,"zretroflexhook",656,"zstroke",438,"zuhiragana",12378,"zukatakana",12474,".notdef",0,"angbracketleftbig",9001,"angbracketleftBig",9001,"angbracketleftbigg",9001,"angbracketleftBigg",9001,"angbracketrightBig",9002,"angbracketrightbig",9002,"angbracketrightBigg",9002,"angbracketrightbigg",9002,"arrowhookleft",8618,"arrowhookright",8617,"arrowlefttophalf",8636,"arrowleftbothalf",8637,"arrownortheast",8599,"arrownorthwest",8598,"arrowrighttophalf",8640,"arrowrightbothalf",8641,"arrowsoutheast",8600,"arrowsouthwest",8601,"backslashbig",8726,"backslashBig",8726,"backslashBigg",8726,"backslashbigg",8726,"bardbl",8214,"bracehtipdownleft",65079,"bracehtipdownright",65079,"bracehtipupleft",65080,"bracehtipupright",65080,"braceleftBig",123,"braceleftbig",123,"braceleftbigg",123,"braceleftBigg",123,"bracerightBig",125,"bracerightbig",125,"bracerightbigg",125,"bracerightBigg",125,"bracketleftbig",91,"bracketleftBig",91,"bracketleftbigg",91,"bracketleftBigg",91,"bracketrightBig",93,"bracketrightbig",93,"bracketrightbigg",93,"bracketrightBigg",93,"ceilingleftbig",8968,"ceilingleftBig",8968,"ceilingleftBigg",8968,"ceilingleftbigg",8968,"ceilingrightbig",8969,"ceilingrightBig",8969,"ceilingrightbigg",8969,"ceilingrightBigg",8969,"circledotdisplay",8857,"circledottext",8857,"circlemultiplydisplay",8855,"circlemultiplytext",8855,"circleplusdisplay",8853,"circleplustext",8853,"contintegraldisplay",8750,"contintegraltext",8750,"coproductdisplay",8720,"coproducttext",8720,"floorleftBig",8970,"floorleftbig",8970,"floorleftbigg",8970,"floorleftBigg",8970,"floorrightbig",8971,"floorrightBig",8971,"floorrightBigg",8971,"floorrightbigg",8971,"hatwide",770,"hatwider",770,"hatwidest",770,"intercal",7488,"integraldisplay",8747,"integraltext",8747,"intersectiondisplay",8898,"intersectiontext",8898,"logicalanddisplay",8743,"logicalandtext",8743,"logicalordisplay",8744,"logicalortext",8744,"parenleftBig",40,"parenleftbig",40,"parenleftBigg",40,"parenleftbigg",40,"parenrightBig",41,"parenrightbig",41,"parenrightBigg",41,"parenrightbigg",41,"prime",8242,"productdisplay",8719,"producttext",8719,"radicalbig",8730,"radicalBig",8730,"radicalBigg",8730,"radicalbigg",8730,"radicalbt",8730,"radicaltp",8730,"radicalvertex",8730,"slashbig",47,"slashBig",47,"slashBigg",47,"slashbigg",47,"summationdisplay",8721,"summationtext",8721,"tildewide",732,"tildewider",732,"tildewidest",732,"uniondisplay",8899,"unionmultidisplay",8846,"unionmultitext",8846,"unionsqdisplay",8852,"unionsqtext",8852,"uniontext",8899,"vextenddouble",8741,"vextendsingle",8739]})),i=(0,r.getArrayLookupTableFactory)((function(){return["space",32,"a1",9985,"a2",9986,"a202",9987,"a3",9988,"a4",9742,"a5",9990,"a119",9991,"a118",9992,"a117",9993,"a11",9755,"a12",9758,"a13",9996,"a14",9997,"a15",9998,"a16",9999,"a105",1e4,"a17",10001,"a18",10002,"a19",10003,"a20",10004,"a21",10005,"a22",10006,"a23",10007,"a24",10008,"a25",10009,"a26",10010,"a27",10011,"a28",10012,"a6",10013,"a7",10014,"a8",10015,"a9",10016,"a10",10017,"a29",10018,"a30",10019,"a31",10020,"a32",10021,"a33",10022,"a34",10023,"a35",9733,"a36",10025,"a37",10026,"a38",10027,"a39",10028,"a40",10029,"a41",10030,"a42",10031,"a43",10032,"a44",10033,"a45",10034,"a46",10035,"a47",10036,"a48",10037,"a49",10038,"a50",10039,"a51",10040,"a52",10041,"a53",10042,"a54",10043,"a55",10044,"a56",10045,"a57",10046,"a58",10047,"a59",10048,"a60",10049,"a61",10050,"a62",10051,"a63",10052,"a64",10053,"a65",10054,"a66",10055,"a67",10056,"a68",10057,"a69",10058,"a70",10059,"a71",9679,"a72",10061,"a73",9632,"a74",10063,"a203",10064,"a75",10065,"a204",10066,"a76",9650,"a77",9660,"a78",9670,"a79",10070,"a81",9687,"a82",10072,"a83",10073,"a84",10074,"a97",10075,"a98",10076,"a99",10077,"a100",10078,"a101",10081,"a102",10082,"a103",10083,"a104",10084,"a106",10085,"a107",10086,"a108",10087,"a112",9827,"a111",9830,"a110",9829,"a109",9824,"a120",9312,"a121",9313,"a122",9314,"a123",9315,"a124",9316,"a125",9317,"a126",9318,"a127",9319,"a128",9320,"a129",9321,"a130",10102,"a131",10103,"a132",10104,"a133",10105,"a134",10106,"a135",10107,"a136",10108,"a137",10109,"a138",10110,"a139",10111,"a140",10112,"a141",10113,"a142",10114,"a143",10115,"a144",10116,"a145",10117,"a146",10118,"a147",10119,"a148",10120,"a149",10121,"a150",10122,"a151",10123,"a152",10124,"a153",10125,"a154",10126,"a155",10127,"a156",10128,"a157",10129,"a158",10130,"a159",10131,"a160",10132,"a161",8594,"a163",8596,"a164",8597,"a196",10136,"a165",10137,"a192",10138,"a166",10139,"a167",10140,"a168",10141,"a169",10142,"a170",10143,"a171",10144,"a172",10145,"a173",10146,"a162",10147,"a174",10148,"a175",10149,"a176",10150,"a177",10151,"a178",10152,"a179",10153,"a193",10154,"a180",10155,"a199",10156,"a181",10157,"a200",10158,"a182",10159,"a201",10161,"a183",10162,"a184",10163,"a197",10164,"a185",10165,"a194",10166,"a198",10167,"a186",10168,"a195",10169,"a187",10170,"a188",10171,"a189",10172,"a190",10173,"a191",10174,"a89",10088,"a90",10089,"a93",10090,"a94",10091,"a91",10092,"a92",10093,"a205",10094,"a85",10095,"a206",10096,"a86",10097,"a87",10098,"a88",10099,"a95",10100,"a96",10101,".notdef",0]}))},(e,t,a)=>{a.r(t);a.d(t,{clearUnicodeCaches:()=>clearUnicodeCaches,getCharUnicodeCategory:()=>getCharUnicodeCategory,getNormalizedUnicodes:()=>s,getUnicodeForGlyph:()=>getUnicodeForGlyph,getUnicodeRangeFor:()=>getUnicodeRangeFor,mapSpecialUnicodeValues:()=>mapSpecialUnicodeValues,reverseIfRtl:()=>reverseIfRtl});var r=a(6);const n=(0,r.getLookupTableFactory)((function(e){e[63721]=169;e[63193]=169;e[63720]=174;e[63194]=174;e[63722]=8482;e[63195]=8482;e[63729]=9127;e[63730]=9128;e[63731]=9129;e[63740]=9131;e[63741]=9132;e[63742]=9133;e[63726]=9121;e[63727]=9122;e[63728]=9123;e[63737]=9124;e[63738]=9125;e[63739]=9126;e[63723]=9115;e[63724]=9116;e[63725]=9117;e[63734]=9118;e[63735]=9119;e[63736]=9120}));function mapSpecialUnicodeValues(e){return e>=65520&&e<=65535?0:e>=62976&&e<=63743?n()[e]||e:173===e?45:e}function getUnicodeForGlyph(e,t){let a=t[e];if(void 0!==a)return a;if(!e)return-1;if("u"===e[0]){const t=e.length;let r;if(7===t&&"n"===e[1]&&"i"===e[2])r=e.substring(3);else{if(!(t>=5&&t<=7))return-1;r=e.substring(1)}if(r===r.toUpperCase()){a=parseInt(r,16);if(a>=0)return a}}return-1}const i=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];function getUnicodeRangeFor(e){for(let t=0,a=i.length;t=a.begin&&e=t.begin&&e=t.begin&&e=0;r--)a.push(e[r]);return a.join("")}const o=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),c=new Map;function getCharUnicodeCategory(e){const t=c.get(e);if(t)return t;const a=e.match(o),r={isWhitespace:!(!a||!a[1]),isZeroWidthDiacritic:!(!a||!a[2]),isInvisibleFormatMark:!(!a||!a[3])};c.set(e,r);return r}function clearUnicodeCaches(){c.clear()}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.getSerifFonts=t.getNonStdFontMap=t.getGlyphMapForStandardFonts=t.getFontNameToFileMap=void 0;t.getStandardFontName=function getStandardFontName(e){const t=(0,n.normalizeFontName)(e);return i()[t]};t.getSymbolsFonts=t.getSupplementalGlyphMapForCalibri=t.getSupplementalGlyphMapForArialBlack=t.getStdFontMap=void 0;var r=a(6),n=a(38);const i=(0,r.getLookupTableFactory)((function(e){e["Times-Roman"]="Times-Roman";e.Helvetica="Helvetica";e.Courier="Courier";e.Symbol="Symbol";e["Times-Bold"]="Times-Bold";e["Helvetica-Bold"]="Helvetica-Bold";e["Courier-Bold"]="Courier-Bold";e.ZapfDingbats="ZapfDingbats";e["Times-Italic"]="Times-Italic";e["Helvetica-Oblique"]="Helvetica-Oblique";e["Courier-Oblique"]="Courier-Oblique";e["Times-BoldItalic"]="Times-BoldItalic";e["Helvetica-BoldOblique"]="Helvetica-BoldOblique";e["Courier-BoldOblique"]="Courier-BoldOblique";e.ArialNarrow="Helvetica";e["ArialNarrow-Bold"]="Helvetica-Bold";e["ArialNarrow-BoldItalic"]="Helvetica-BoldOblique";e["ArialNarrow-Italic"]="Helvetica-Oblique";e.ArialBlack="Helvetica";e["ArialBlack-Bold"]="Helvetica-Bold";e["ArialBlack-BoldItalic"]="Helvetica-BoldOblique";e["ArialBlack-Italic"]="Helvetica-Oblique";e["Arial-Black"]="Helvetica";e["Arial-Black-Bold"]="Helvetica-Bold";e["Arial-Black-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Black-Italic"]="Helvetica-Oblique";e.Arial="Helvetica";e["Arial-Bold"]="Helvetica-Bold";e["Arial-BoldItalic"]="Helvetica-BoldOblique";e["Arial-Italic"]="Helvetica-Oblique";e.ArialMT="Helvetica";e["Arial-BoldItalicMT"]="Helvetica-BoldOblique";e["Arial-BoldMT"]="Helvetica-Bold";e["Arial-ItalicMT"]="Helvetica-Oblique";e.ArialUnicodeMS="Helvetica";e["ArialUnicodeMS-Bold"]="Helvetica-Bold";e["ArialUnicodeMS-BoldItalic"]="Helvetica-BoldOblique";e["ArialUnicodeMS-Italic"]="Helvetica-Oblique";e["Courier-BoldItalic"]="Courier-BoldOblique";e["Courier-Italic"]="Courier-Oblique";e.CourierNew="Courier";e["CourierNew-Bold"]="Courier-Bold";e["CourierNew-BoldItalic"]="Courier-BoldOblique";e["CourierNew-Italic"]="Courier-Oblique";e["CourierNewPS-BoldItalicMT"]="Courier-BoldOblique";e["CourierNewPS-BoldMT"]="Courier-Bold";e["CourierNewPS-ItalicMT"]="Courier-Oblique";e.CourierNewPSMT="Courier";e["Helvetica-BoldItalic"]="Helvetica-BoldOblique";e["Helvetica-Italic"]="Helvetica-Oblique";e["Symbol-Bold"]="Symbol";e["Symbol-BoldItalic"]="Symbol";e["Symbol-Italic"]="Symbol";e.TimesNewRoman="Times-Roman";e["TimesNewRoman-Bold"]="Times-Bold";e["TimesNewRoman-BoldItalic"]="Times-BoldItalic";e["TimesNewRoman-Italic"]="Times-Italic";e.TimesNewRomanPS="Times-Roman";e["TimesNewRomanPS-Bold"]="Times-Bold";e["TimesNewRomanPS-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPS-BoldItalicMT"]="Times-BoldItalic";e["TimesNewRomanPS-BoldMT"]="Times-Bold";e["TimesNewRomanPS-Italic"]="Times-Italic";e["TimesNewRomanPS-ItalicMT"]="Times-Italic";e.TimesNewRomanPSMT="Times-Roman";e["TimesNewRomanPSMT-Bold"]="Times-Bold";e["TimesNewRomanPSMT-BoldItalic"]="Times-BoldItalic";e["TimesNewRomanPSMT-Italic"]="Times-Italic"}));t.getStdFontMap=i;const s=(0,r.getLookupTableFactory)((function(e){e.Courier="FoxitFixed.pfb";e["Courier-Bold"]="FoxitFixedBold.pfb";e["Courier-BoldOblique"]="FoxitFixedBoldItalic.pfb";e["Courier-Oblique"]="FoxitFixedItalic.pfb";e.Helvetica="FoxitSans.pfb";e["Helvetica-Bold"]="FoxitSansBold.pfb";e["Helvetica-BoldOblique"]="FoxitSansBoldItalic.pfb";e["Helvetica-Oblique"]="FoxitSansItalic.pfb";e["Times-Roman"]="FoxitSerif.pfb";e["Times-Bold"]="FoxitSerifBold.pfb";e["Times-BoldItalic"]="FoxitSerifBoldItalic.pfb";e["Times-Italic"]="FoxitSerifItalic.pfb";e.Symbol="FoxitSymbol.pfb";e.ZapfDingbats="FoxitDingbats.pfb";e["LiberationSans-Regular"]="LiberationSans-Regular.ttf";e["LiberationSans-Bold"]="LiberationSans-Bold.ttf";e["LiberationSans-Italic"]="LiberationSans-Italic.ttf";e["LiberationSans-BoldItalic"]="LiberationSans-BoldItalic.ttf"}));t.getFontNameToFileMap=s;const o=(0,r.getLookupTableFactory)((function(e){e.Calibri="Helvetica";e["Calibri-Bold"]="Helvetica-Bold";e["Calibri-BoldItalic"]="Helvetica-BoldOblique";e["Calibri-Italic"]="Helvetica-Oblique";e.CenturyGothic="Helvetica";e["CenturyGothic-Bold"]="Helvetica-Bold";e["CenturyGothic-BoldItalic"]="Helvetica-BoldOblique";e["CenturyGothic-Italic"]="Helvetica-Oblique";e.ComicSansMS="Comic Sans MS";e["ComicSansMS-Bold"]="Comic Sans MS-Bold";e["ComicSansMS-BoldItalic"]="Comic Sans MS-BoldItalic";e["ComicSansMS-Italic"]="Comic Sans MS-Italic";e["ItcSymbol-Bold"]="Helvetica-Bold";e["ItcSymbol-BoldItalic"]="Helvetica-BoldOblique";e["ItcSymbol-Book"]="Helvetica";e["ItcSymbol-BookItalic"]="Helvetica-Oblique";e["ItcSymbol-Medium"]="Helvetica";e["ItcSymbol-MediumItalic"]="Helvetica-Oblique";e.LucidaConsole="Courier";e["LucidaConsole-Bold"]="Courier-Bold";e["LucidaConsole-BoldItalic"]="Courier-BoldOblique";e["LucidaConsole-Italic"]="Courier-Oblique";e["LucidaSans-Demi"]="Helvetica-Bold";e["MS-Gothic"]="MS Gothic";e["MS-Gothic-Bold"]="MS Gothic-Bold";e["MS-Gothic-BoldItalic"]="MS Gothic-BoldItalic";e["MS-Gothic-Italic"]="MS Gothic-Italic";e["MS-Mincho"]="MS Mincho";e["MS-Mincho-Bold"]="MS Mincho-Bold";e["MS-Mincho-BoldItalic"]="MS Mincho-BoldItalic";e["MS-Mincho-Italic"]="MS Mincho-Italic";e["MS-PGothic"]="MS PGothic";e["MS-PGothic-Bold"]="MS PGothic-Bold";e["MS-PGothic-BoldItalic"]="MS PGothic-BoldItalic";e["MS-PGothic-Italic"]="MS PGothic-Italic";e["MS-PMincho"]="MS PMincho";e["MS-PMincho-Bold"]="MS PMincho-Bold";e["MS-PMincho-BoldItalic"]="MS PMincho-BoldItalic";e["MS-PMincho-Italic"]="MS PMincho-Italic";e.NuptialScript="Times-Italic";e.SegoeUISymbol="Helvetica";e.Wingdings="ZapfDingbats";e["Wingdings-Regular"]="ZapfDingbats"}));t.getNonStdFontMap=o;const c=(0,r.getLookupTableFactory)((function(e){e["Adobe Jenson"]=!0;e["Adobe Text"]=!0;e.Albertus=!0;e.Aldus=!0;e.Alexandria=!0;e.Algerian=!0;e["American Typewriter"]=!0;e.Antiqua=!0;e.Apex=!0;e.Arno=!0;e.Aster=!0;e.Aurora=!0;e.Baskerville=!0;e.Bell=!0;e.Bembo=!0;e["Bembo Schoolbook"]=!0;e.Benguiat=!0;e["Berkeley Old Style"]=!0;e["Bernhard Modern"]=!0;e["Berthold City"]=!0;e.Bodoni=!0;e["Bauer Bodoni"]=!0;e["Book Antiqua"]=!0;e.Bookman=!0;e["Bordeaux Roman"]=!0;e["Californian FB"]=!0;e.Calisto=!0;e.Calvert=!0;e.Capitals=!0;e.Cambria=!0;e.Cartier=!0;e.Caslon=!0;e.Catull=!0;e.Centaur=!0;e["Century Old Style"]=!0;e["Century Schoolbook"]=!0;e.Chaparral=!0;e["Charis SIL"]=!0;e.Cheltenham=!0;e["Cholla Slab"]=!0;e.Clarendon=!0;e.Clearface=!0;e.Cochin=!0;e.Colonna=!0;e["Computer Modern"]=!0;e["Concrete Roman"]=!0;e.Constantia=!0;e["Cooper Black"]=!0;e.Corona=!0;e.Ecotype=!0;e.Egyptienne=!0;e.Elephant=!0;e.Excelsior=!0;e.Fairfield=!0;e["FF Scala"]=!0;e.Folkard=!0;e.Footlight=!0;e.FreeSerif=!0;e["Friz Quadrata"]=!0;e.Garamond=!0;e.Gentium=!0;e.Georgia=!0;e.Gloucester=!0;e["Goudy Old Style"]=!0;e["Goudy Schoolbook"]=!0;e["Goudy Pro Font"]=!0;e.Granjon=!0;e["Guardian Egyptian"]=!0;e.Heather=!0;e.Hercules=!0;e["High Tower Text"]=!0;e.Hiroshige=!0;e["Hoefler Text"]=!0;e["Humana Serif"]=!0;e.Imprint=!0;e["Ionic No. 5"]=!0;e.Janson=!0;e.Joanna=!0;e.Korinna=!0;e.Lexicon=!0;e.LiberationSerif=!0;e["Liberation Serif"]=!0;e["Linux Libertine"]=!0;e.Literaturnaya=!0;e.Lucida=!0;e["Lucida Bright"]=!0;e.Melior=!0;e.Memphis=!0;e.Miller=!0;e.Minion=!0;e.Modern=!0;e["Mona Lisa"]=!0;e["Mrs Eaves"]=!0;e["MS Serif"]=!0;e["Museo Slab"]=!0;e["New York"]=!0;e["Nimbus Roman"]=!0;e["NPS Rawlinson Roadway"]=!0;e.NuptialScript=!0;e.Palatino=!0;e.Perpetua=!0;e.Plantin=!0;e["Plantin Schoolbook"]=!0;e.Playbill=!0;e["Poor Richard"]=!0;e["Rawlinson Roadway"]=!0;e.Renault=!0;e.Requiem=!0;e.Rockwell=!0;e.Roman=!0;e["Rotis Serif"]=!0;e.Sabon=!0;e.Scala=!0;e.Seagull=!0;e.Sistina=!0;e.Souvenir=!0;e.STIX=!0;e["Stone Informal"]=!0;e["Stone Serif"]=!0;e.Sylfaen=!0;e.Times=!0;e.Trajan=!0;e["Trinité"]=!0;e["Trump Mediaeval"]=!0;e.Utopia=!0;e["Vale Type"]=!0;e["Bitstream Vera"]=!0;e["Vera Serif"]=!0;e.Versailles=!0;e.Wanted=!0;e.Weiss=!0;e["Wide Latin"]=!0;e.Windsor=!0;e.XITS=!0}));t.getSerifFonts=c;const l=(0,r.getLookupTableFactory)((function(e){e.Dingbats=!0;e.Symbol=!0;e.ZapfDingbats=!0}));t.getSymbolsFonts=l;const h=(0,r.getLookupTableFactory)((function(e){e[2]=10;e[3]=32;e[4]=33;e[5]=34;e[6]=35;e[7]=36;e[8]=37;e[9]=38;e[10]=39;e[11]=40;e[12]=41;e[13]=42;e[14]=43;e[15]=44;e[16]=45;e[17]=46;e[18]=47;e[19]=48;e[20]=49;e[21]=50;e[22]=51;e[23]=52;e[24]=53;e[25]=54;e[26]=55;e[27]=56;e[28]=57;e[29]=58;e[30]=894;e[31]=60;e[32]=61;e[33]=62;e[34]=63;e[35]=64;e[36]=65;e[37]=66;e[38]=67;e[39]=68;e[40]=69;e[41]=70;e[42]=71;e[43]=72;e[44]=73;e[45]=74;e[46]=75;e[47]=76;e[48]=77;e[49]=78;e[50]=79;e[51]=80;e[52]=81;e[53]=82;e[54]=83;e[55]=84;e[56]=85;e[57]=86;e[58]=87;e[59]=88;e[60]=89;e[61]=90;e[62]=91;e[63]=92;e[64]=93;e[65]=94;e[66]=95;e[67]=96;e[68]=97;e[69]=98;e[70]=99;e[71]=100;e[72]=101;e[73]=102;e[74]=103;e[75]=104;e[76]=105;e[77]=106;e[78]=107;e[79]=108;e[80]=109;e[81]=110;e[82]=111;e[83]=112;e[84]=113;e[85]=114;e[86]=115;e[87]=116;e[88]=117;e[89]=118;e[90]=119;e[91]=120;e[92]=121;e[93]=122;e[94]=123;e[95]=124;e[96]=125;e[97]=126;e[98]=196;e[99]=197;e[100]=199;e[101]=201;e[102]=209;e[103]=214;e[104]=220;e[105]=225;e[106]=224;e[107]=226;e[108]=228;e[109]=227;e[110]=229;e[111]=231;e[112]=233;e[113]=232;e[114]=234;e[115]=235;e[116]=237;e[117]=236;e[118]=238;e[119]=239;e[120]=241;e[121]=243;e[122]=242;e[123]=244;e[124]=246;e[125]=245;e[126]=250;e[127]=249;e[128]=251;e[129]=252;e[130]=8224;e[131]=176;e[132]=162;e[133]=163;e[134]=167;e[135]=8226;e[136]=182;e[137]=223;e[138]=174;e[139]=169;e[140]=8482;e[141]=180;e[142]=168;e[143]=8800;e[144]=198;e[145]=216;e[146]=8734;e[147]=177;e[148]=8804;e[149]=8805;e[150]=165;e[151]=181;e[152]=8706;e[153]=8721;e[154]=8719;e[156]=8747;e[157]=170;e[158]=186;e[159]=8486;e[160]=230;e[161]=248;e[162]=191;e[163]=161;e[164]=172;e[165]=8730;e[166]=402;e[167]=8776;e[168]=8710;e[169]=171;e[170]=187;e[171]=8230;e[200]=193;e[203]=205;e[210]=218;e[223]=711;e[224]=321;e[225]=322;e[226]=352;e[227]=353;e[228]=381;e[229]=382;e[233]=221;e[234]=253;e[252]=263;e[253]=268;e[254]=269;e[258]=258;e[260]=260;e[261]=261;e[265]=280;e[266]=281;e[267]=282;e[268]=283;e[269]=313;e[275]=323;e[276]=324;e[278]=328;e[283]=344;e[284]=345;e[285]=346;e[286]=347;e[292]=367;e[295]=377;e[296]=378;e[298]=380;e[305]=963;e[306]=964;e[307]=966;e[308]=8215;e[309]=8252;e[310]=8319;e[311]=8359;e[312]=8592;e[313]=8593;e[337]=9552;e[493]=1039;e[494]=1040;e[672]=1488;e[673]=1489;e[674]=1490;e[675]=1491;e[676]=1492;e[677]=1493;e[678]=1494;e[679]=1495;e[680]=1496;e[681]=1497;e[682]=1498;e[683]=1499;e[684]=1500;e[685]=1501;e[686]=1502;e[687]=1503;e[688]=1504;e[689]=1505;e[690]=1506;e[691]=1507;e[692]=1508;e[693]=1509;e[694]=1510;e[695]=1511;e[696]=1512;e[697]=1513;e[698]=1514;e[705]=1524;e[706]=8362;e[710]=64288;e[711]=64298;e[759]=1617;e[761]=1776;e[763]=1778;e[775]=1652;e[777]=1764;e[778]=1780;e[779]=1781;e[780]=1782;e[782]=771;e[783]=64726;e[786]=8363;e[788]=8532;e[790]=768;e[791]=769;e[792]=768;e[795]=803;e[797]=64336;e[798]=64337;e[799]=64342;e[800]=64343;e[801]=64344;e[802]=64345;e[803]=64362;e[804]=64363;e[805]=64364;e[2424]=7821;e[2425]=7822;e[2426]=7823;e[2427]=7824;e[2428]=7825;e[2429]=7826;e[2430]=7827;e[2433]=7682;e[2678]=8045;e[2679]=8046;e[2830]=1552;e[2838]=686;e[2840]=751;e[2842]=753;e[2843]=754;e[2844]=755;e[2846]=757;e[2856]=767;e[2857]=848;e[2858]=849;e[2862]=853;e[2863]=854;e[2864]=855;e[2865]=861;e[2866]=862;e[2906]=7460;e[2908]=7462;e[2909]=7463;e[2910]=7464;e[2912]=7466;e[2913]=7467;e[2914]=7468;e[2916]=7470;e[2917]=7471;e[2918]=7472;e[2920]=7474;e[2921]=7475;e[2922]=7476;e[2924]=7478;e[2925]=7479;e[2926]=7480;e[2928]=7482;e[2929]=7483;e[2930]=7484;e[2932]=7486;e[2933]=7487;e[2934]=7488;e[2936]=7490;e[2937]=7491;e[2938]=7492;e[2940]=7494;e[2941]=7495;e[2942]=7496;e[2944]=7498;e[2946]=7500;e[2948]=7502;e[2950]=7504;e[2951]=7505;e[2952]=7506;e[2954]=7508;e[2955]=7509;e[2956]=7510;e[2958]=7512;e[2959]=7513;e[2960]=7514;e[2962]=7516;e[2963]=7517;e[2964]=7518;e[2966]=7520;e[2967]=7521;e[2968]=7522;e[2970]=7524;e[2971]=7525;e[2972]=7526;e[2974]=7528;e[2975]=7529;e[2976]=7530;e[2978]=1537;e[2979]=1538;e[2980]=1539;e[2982]=1549;e[2983]=1551;e[2984]=1552;e[2986]=1554;e[2987]=1555;e[2988]=1556;e[2990]=1623;e[2991]=1624;e[2995]=1775;e[2999]=1791;e[3002]=64290;e[3003]=64291;e[3004]=64292;e[3006]=64294;e[3007]=64295;e[3008]=64296;e[3011]=1900;e[3014]=8223;e[3015]=8244;e[3017]=7532;e[3018]=7533;e[3019]=7534;e[3075]=7590;e[3076]=7591;e[3079]=7594;e[3080]=7595;e[3083]=7598;e[3084]=7599;e[3087]=7602;e[3088]=7603;e[3091]=7606;e[3092]=7607;e[3095]=7610;e[3096]=7611;e[3099]=7614;e[3100]=7615;e[3103]=7618;e[3104]=7619;e[3107]=8337;e[3108]=8338;e[3116]=1884;e[3119]=1885;e[3120]=1885;e[3123]=1886;e[3124]=1886;e[3127]=1887;e[3128]=1887;e[3131]=1888;e[3132]=1888;e[3135]=1889;e[3136]=1889;e[3139]=1890;e[3140]=1890;e[3143]=1891;e[3144]=1891;e[3147]=1892;e[3148]=1892;e[3153]=580;e[3154]=581;e[3157]=584;e[3158]=585;e[3161]=588;e[3162]=589;e[3165]=891;e[3166]=892;e[3169]=1274;e[3170]=1275;e[3173]=1278;e[3174]=1279;e[3181]=7622;e[3182]=7623;e[3282]=11799;e[3316]=578;e[3379]=42785;e[3393]=1159;e[3416]=8377}));t.getGlyphMapForStandardFonts=h;const u=(0,r.getLookupTableFactory)((function(e){e[227]=322;e[264]=261;e[291]=346}));t.getSupplementalGlyphMapForArialBlack=u;const d=(0,r.getLookupTableFactory)((function(e){e[1]=32;e[4]=65;e[6]=193;e[17]=66;e[18]=67;e[21]=268;e[24]=68;e[28]=69;e[30]=201;e[32]=282;e[38]=70;e[39]=71;e[44]=72;e[47]=73;e[49]=205;e[58]=74;e[60]=75;e[62]=76;e[68]=77;e[69]=78;e[75]=79;e[87]=80;e[89]=81;e[90]=82;e[92]=344;e[94]=83;e[97]=352;e[100]=84;e[104]=85;e[115]=86;e[116]=87;e[121]=88;e[122]=89;e[124]=221;e[127]=90;e[129]=381;e[258]=97;e[260]=225;e[268]=261;e[271]=98;e[272]=99;e[273]=263;e[275]=269;e[282]=100;e[286]=101;e[288]=233;e[290]=283;e[295]=281;e[296]=102;e[336]=103;e[346]=104;e[349]=105;e[351]=237;e[361]=106;e[364]=107;e[367]=108;e[371]=322;e[373]=109;e[374]=110;e[381]=111;e[383]=243;e[393]=112;e[395]=113;e[396]=114;e[398]=345;e[400]=115;e[401]=347;e[403]=353;e[410]=116;e[437]=117;e[448]=118;e[449]=119;e[454]=120;e[455]=121;e[457]=253;e[460]=122;e[462]=382;e[463]=380;e[853]=44;e[855]=58;e[856]=46;e[876]=47;e[878]=45;e[882]=45;e[894]=40;e[895]=41;e[896]=91;e[897]=93;e[923]=64;e[1004]=48;e[1005]=49;e[1006]=50;e[1007]=51;e[1008]=52;e[1009]=53;e[1010]=54;e[1011]=55;e[1012]=56;e[1013]=57;e[1081]=37;e[1085]=43;e[1086]=45}));t.getSupplementalGlyphMapForCalibri=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ToUnicodeMap=t.IdentityToUnicodeMap=void 0;var r=a(2);t.ToUnicodeMap=class ToUnicodeMap{constructor(e=[]){this._map=e}get length(){return this._map.length}forEach(e){for(const t in this._map)e(t,this._map[t].charCodeAt(0))}has(e){return void 0!==this._map[e]}get(e){return this._map[e]}charCodeOf(e){const t=this._map;if(t.length<=65536)return t.indexOf(e);for(const a in t)if(t[a]===e)return 0|a;return-1}amend(e){for(const t in e)this._map[t]=e[t]}};t.IdentityToUnicodeMap=class IdentityToUnicodeMap{constructor(e,t){this.firstChar=e;this.lastChar=t}get length(){return this.lastChar+1-this.firstChar}forEach(e){for(let t=this.firstChar,a=this.lastChar;t<=a;t++)e(t,t)}has(e){return this.firstChar<=e&&e<=this.lastChar}get(e){if(this.firstChar<=e&&e<=this.lastChar)return String.fromCharCode(e)}charCodeOf(e){return Number.isInteger(e)&&e>=this.firstChar&&e<=this.lastChar?e:-1}amend(e){(0,r.unreachable)("Should not call amend()")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CFFFont=void 0;var r=a(35),n=a(38),i=a(2);t.CFFFont=class CFFFont{constructor(e,t){this.properties=t;const a=new r.CFFParser(e,t,n.SEAC_ANALYSIS_ENABLED);this.cff=a.parse();this.cff.duplicateFirstGlyph();const s=new r.CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=s.compile()}catch(a){(0,i.warn)("Failed to compile font "+t.loadedName);this.data=e}this._createBuiltInEncoding()}get numGlyphs(){return this.cff.charStrings.count}getCharset(){return this.cff.charset.charset}getGlyphMapping(){const e=this.cff,t=this.properties,a=e.charset.charset;let r,i;if(t.composite){r=Object.create(null);let n;if(e.isCIDFont)for(i=0;i=0){const r=a[t];r&&(n[e]=r)}}n.length>0&&(this.properties.builtInEncoding=n)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FontRendererFactory=void 0;var r=a(2),n=a(35),i=a(39),s=a(37),o=a(10);function getUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function getUint16(e,t){return e[t]<<8|e[t+1]}function getInt16(e,t){return(e[t]<<24|e[t+1]<<16)>>16}function getInt8(e,t){return e[t]<<24>>24}function getFloat214(e,t){return getInt16(e,t)/16384}function getSubroutineBias(e){const t=e.length;let a=32768;t<1240?a=107:t<33900&&(a=1131);return a}function parseCmap(e,t,a){const n=1===getUint16(e,t+2)?getUint32(e,t+8):getUint32(e,t+16),i=getUint16(e,t+n);let s,o,c;if(4===i){getUint16(e,t+n+2);const a=getUint16(e,t+n+6)>>1;o=t+n+14;s=[];for(c=0;c>1;a0;)h.push({flags:i})}for(a=0;a>1;S=!0;break;case 4:c+=i.pop();moveTo(o,c);S=!0;break;case 5:for(;i.length>0;){o+=i.shift();c+=i.shift();lineTo(o,c)}break;case 6:for(;i.length>0;){o+=i.shift();lineTo(o,c);if(0===i.length)break;c+=i.shift();lineTo(o,c)}break;case 7:for(;i.length>0;){c+=i.shift();lineTo(o,c);if(0===i.length)break;o+=i.shift();lineTo(o,c)}break;case 8:for(;i.length>0;){u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 10:y=i.pop();w=null;if(a.isCFFCIDFont){const e=a.fdSelect.getFDIndex(n);if(e>=0&&eMath.abs(c-t)?o+=i.shift():c+=i.shift();bezierCurveTo(u,f,d,g,o,c);break;default:throw new r.FormatError(`unknown operator: 12 ${x}`)}break;case 14:if(i.length>=4){const e=i.pop(),r=i.pop();c=i.pop();o=i.pop();t.push({cmd:"save"},{cmd:"translate",args:[o,c]});let n=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[e]]));compileCharString(a.glyphs[n.glyphId],t,a,n.glyphId);t.push({cmd:"restore"});n=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[r]]));compileCharString(a.glyphs[n.glyphId],t,a,n.glyphId)}return;case 19:case 20:l+=i.length>>1;h+=l+7>>3;S=!0;break;case 21:c+=i.pop();o+=i.pop();moveTo(o,c);S=!0;break;case 22:o+=i.pop();moveTo(o,c);S=!0;break;case 24:for(;i.length>2;){u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}o+=i.shift();c+=i.shift();lineTo(o,c);break;case 25:for(;i.length>6;){o+=i.shift();c+=i.shift();lineTo(o,c)}u=o+i.shift();f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+i.shift();bezierCurveTo(u,f,d,g,o,c);break;case 26:i.length%2&&(o+=i.shift());for(;i.length>0;){u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d;c=g+i.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 27:i.length%2&&(c+=i.shift());for(;i.length>0;){u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g;bezierCurveTo(u,f,d,g,o,c)}break;case 28:i.push((e[h]<<24|e[h+1]<<16)>>16);h+=2;break;case 29:y=i.pop()+a.gsubrsBias;w=a.gsubrs[y];w&&parse(w);break;case 30:for(;i.length>0;){u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===i.length)break;u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();c=g+i.shift();o=d+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;case 31:for(;i.length>0;){u=o+i.shift();f=c;d=u+i.shift();g=f+i.shift();c=g+i.shift();o=d+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===i.length)break;u=o;f=c+i.shift();d=u+i.shift();g=f+i.shift();o=d+i.shift();c=g+(1===i.length?i.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;default:if(x<32)throw new r.FormatError(`unknown operator: ${x}`);if(x<247)i.push(x-139);else if(x<251)i.push(256*(x-247)+e[h++]+108);else if(x<255)i.push(256*-(x-251)-e[h++]-108);else{i.push((e[h]<<24|e[h+1]<<16|e[h+2]<<8|e[h+3])/65536);h+=4}}S&&(i.length=0)}}(e)}const c=[];class CompiledFont{constructor(e){this.constructor===CompiledFont&&(0,r.unreachable)("Cannot initialize CompiledFont.");this.fontMatrix=e;this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null)}getPathJs(e){const{charCode:t,glyphId:a}=lookupCmap(this.cmap,e);let r=this.compiledGlyphs[a];if(!r)try{r=this.compileGlyph(this.glyphs[a],a);this.compiledGlyphs[a]=r}catch(e){this.compiledGlyphs[a]=c;void 0===this.compiledCharCodeToGlyphId[t]&&(this.compiledCharCodeToGlyphId[t]=a);throw e}void 0===this.compiledCharCodeToGlyphId[t]&&(this.compiledCharCodeToGlyphId[t]=a);return r}compileGlyph(e,t){if(!e||0===e.length||14===e[0])return c;let a=this.fontMatrix;if(this.isCFFCIDFont){const e=this.fdSelect.getFDIndex(t);if(e>=0&&e2*getUint16(e,t)}const i=[];let s=n(t,0);for(let a=r;a{Object.defineProperty(t,"__esModule",{value:!0});t.getMetrics=t.getFontBasicMetrics=void 0;var r=a(6);const n=(0,r.getLookupTableFactory)((function(e){e.Courier=600;e["Courier-Bold"]=600;e["Courier-BoldOblique"]=600;e["Courier-Oblique"]=600;e.Helvetica=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Bold"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-BoldOblique"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=333;e.quotedbl=474;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=722;e.quoteright=278;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=333;e.semicolon=333;e.less=584;e.equal=584;e.greater=584;e.question=611;e.at=975;e.A=722;e.B=722;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=556;e.K=722;e.L=611;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=584;e.underscore=556;e.quoteleft=278;e.a=556;e.b=611;e.c=556;e.d=611;e.e=556;e.f=333;e.g=611;e.h=611;e.i=278;e.j=278;e.k=556;e.l=278;e.m=889;e.n=611;e.o=611;e.p=611;e.q=611;e.r=389;e.s=556;e.t=333;e.u=611;e.v=556;e.w=778;e.x=556;e.y=556;e.z=500;e.braceleft=389;e.bar=280;e.braceright=389;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=238;e.quotedblleft=500;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=611;e.fl=611;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=556;e.bullet=350;e.quotesinglbase=278;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=611;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=278;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=611;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=722;e.aacute=556;e.Ucircumflex=722;e.yacute=556;e.scommaaccent=556;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=611;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=556;e.aring=556;e.Ncommaaccent=722;e.lacute=278;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=556;e.scedilla=556;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=611;e.acircumflex=556;e.Amacron=722;e.rcaron=389;e.ccedilla=556;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=743;e.Umacron=722;e.uring=611;e.threesuperior=333;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=584;e.uacute=611;e.Tcaron=611;e.partialdiff=494;e.ydieresis=556;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=556;e.nacute=611;e.umacron=611;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=280;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=611;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=389;e.eogonek=556;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=556;e.zacute=500;e.iogonek=278;e.Oacute=778;e.oacute=611;e.amacron=556;e.sacute=556;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=611;e.twosuperior=333;e.Odieresis=778;e.mu=611;e.igrave=278;e.ohungarumlaut=611;e.Eogonek=667;e.dcroat=611;e.threequarters=834;e.Scedilla=667;e.lcaron=400;e.Kcommaaccent=722;e.Lacute=611;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=611;e.onehalf=834;e.lessequal=549;e.ocircumflex=611;e.ntilde=611;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=611;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=611;e.Ccaron=722;e.ugrave=611;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=611;e.Rcommaaccent=722;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=556;e.minus=584;e.Icircumflex=278;e.ncaron=611;e.tcommaaccent=333;e.logicalnot=584;e.odieresis=611;e.udieresis=611;e.notequal=549;e.gcommaaccent=611;e.eth=611;e.zcaron=500;e.ncommaaccent=611;e.onesuperior=333;e.imacron=278;e.Euro=556}));e["Helvetica-Oblique"]=(0,r.getLookupTableFactory)((function(e){e.space=278;e.exclam=278;e.quotedbl=355;e.numbersign=556;e.dollar=556;e.percent=889;e.ampersand=667;e.quoteright=222;e.parenleft=333;e.parenright=333;e.asterisk=389;e.plus=584;e.comma=278;e.hyphen=333;e.period=278;e.slash=278;e.zero=556;e.one=556;e.two=556;e.three=556;e.four=556;e.five=556;e.six=556;e.seven=556;e.eight=556;e.nine=556;e.colon=278;e.semicolon=278;e.less=584;e.equal=584;e.greater=584;e.question=556;e.at=1015;e.A=667;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=722;e.I=278;e.J=500;e.K=667;e.L=556;e.M=833;e.N=722;e.O=778;e.P=667;e.Q=778;e.R=722;e.S=667;e.T=611;e.U=722;e.V=667;e.W=944;e.X=667;e.Y=667;e.Z=611;e.bracketleft=278;e.backslash=278;e.bracketright=278;e.asciicircum=469;e.underscore=556;e.quoteleft=222;e.a=556;e.b=556;e.c=500;e.d=556;e.e=556;e.f=278;e.g=556;e.h=556;e.i=222;e.j=222;e.k=500;e.l=222;e.m=833;e.n=556;e.o=556;e.p=556;e.q=556;e.r=333;e.s=500;e.t=278;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=500;e.braceleft=334;e.bar=260;e.braceright=334;e.asciitilde=584;e.exclamdown=333;e.cent=556;e.sterling=556;e.fraction=167;e.yen=556;e.florin=556;e.section=556;e.currency=556;e.quotesingle=191;e.quotedblleft=333;e.guillemotleft=556;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=556;e.dagger=556;e.daggerdbl=556;e.periodcentered=278;e.paragraph=537;e.bullet=350;e.quotesinglbase=222;e.quotedblbase=333;e.quotedblright=333;e.guillemotright=556;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=611;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=370;e.Lslash=556;e.Oslash=778;e.OE=1e3;e.ordmasculine=365;e.ae=889;e.dotlessi=278;e.lslash=222;e.oslash=611;e.oe=944;e.germandbls=611;e.Idieresis=278;e.eacute=556;e.abreve=556;e.uhungarumlaut=556;e.ecaron=556;e.Ydieresis=667;e.divide=584;e.Yacute=667;e.Acircumflex=667;e.aacute=556;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=500;e.ecircumflex=556;e.Uring=722;e.Udieresis=722;e.aogonek=556;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=737;e.Emacron=667;e.ccaron=500;e.aring=556;e.Ncommaaccent=722;e.lacute=222;e.agrave=556;e.Tcommaaccent=611;e.Cacute=722;e.atilde=556;e.Edotaccent=667;e.scaron=500;e.scedilla=500;e.iacute=278;e.lozenge=471;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=556;e.Amacron=667;e.rcaron=333;e.ccedilla=500;e.Zdotaccent=611;e.Thorn=667;e.Omacron=778;e.Racute=722;e.Sacute=667;e.dcaron=643;e.Umacron=722;e.uring=556;e.threesuperior=333;e.Ograve=778;e.Agrave=667;e.Abreve=667;e.multiply=584;e.uacute=556;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=556;e.edieresis=556;e.cacute=500;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=278;e.plusminus=584;e.brokenbar=260;e.registered=737;e.Gbreve=778;e.Idotaccent=278;e.summation=600;e.Egrave=667;e.racute=333;e.omacron=556;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=222;e.tcaron=317;e.eogonek=556;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=556;e.zacute=500;e.iogonek=222;e.Oacute=778;e.oacute=556;e.amacron=556;e.sacute=500;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=333;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=556;e.Eogonek=667;e.dcroat=556;e.threequarters=834;e.Scedilla=667;e.lcaron=299;e.Kcommaaccent=667;e.Lacute=556;e.trademark=1e3;e.edotaccent=556;e.Igrave=278;e.Imacron=278;e.Lcaron=556;e.onehalf=834;e.lessequal=549;e.ocircumflex=556;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=556;e.gbreve=556;e.onequarter=834;e.Scaron=667;e.Scommaaccent=667;e.Ohungarumlaut=778;e.degree=400;e.ograve=556;e.Ccaron=722;e.ugrave=556;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=556;e.Rcommaaccent=722;e.Lcommaaccent=556;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=778;e.zdotaccent=500;e.Ecaron=667;e.Iogonek=278;e.kcommaaccent=500;e.minus=584;e.Icircumflex=278;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=584;e.odieresis=556;e.udieresis=556;e.notequal=549;e.gcommaaccent=556;e.eth=556;e.zcaron=500;e.ncommaaccent=556;e.onesuperior=333;e.imacron=278;e.Euro=556}));e.Symbol=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.universal=713;e.numbersign=500;e.existential=549;e.percent=833;e.ampersand=778;e.suchthat=439;e.parenleft=333;e.parenright=333;e.asteriskmath=500;e.plus=549;e.comma=250;e.minus=549;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=549;e.equal=549;e.greater=549;e.question=444;e.congruent=549;e.Alpha=722;e.Beta=667;e.Chi=722;e.Delta=612;e.Epsilon=611;e.Phi=763;e.Gamma=603;e.Eta=722;e.Iota=333;e.theta1=631;e.Kappa=722;e.Lambda=686;e.Mu=889;e.Nu=722;e.Omicron=722;e.Pi=768;e.Theta=741;e.Rho=556;e.Sigma=592;e.Tau=611;e.Upsilon=690;e.sigma1=439;e.Omega=768;e.Xi=645;e.Psi=795;e.Zeta=611;e.bracketleft=333;e.therefore=863;e.bracketright=333;e.perpendicular=658;e.underscore=500;e.radicalex=500;e.alpha=631;e.beta=549;e.chi=549;e.delta=494;e.epsilon=439;e.phi=521;e.gamma=411;e.eta=603;e.iota=329;e.phi1=603;e.kappa=549;e.lambda=549;e.mu=576;e.nu=521;e.omicron=549;e.pi=549;e.theta=521;e.rho=549;e.sigma=603;e.tau=439;e.upsilon=576;e.omega1=713;e.omega=686;e.xi=493;e.psi=686;e.zeta=494;e.braceleft=480;e.bar=200;e.braceright=480;e.similar=549;e.Euro=750;e.Upsilon1=620;e.minute=247;e.lessequal=549;e.fraction=167;e.infinity=713;e.florin=500;e.club=753;e.diamond=753;e.heart=753;e.spade=753;e.arrowboth=1042;e.arrowleft=987;e.arrowup=603;e.arrowright=987;e.arrowdown=603;e.degree=400;e.plusminus=549;e.second=411;e.greaterequal=549;e.multiply=549;e.proportional=713;e.partialdiff=494;e.bullet=460;e.divide=549;e.notequal=549;e.equivalence=549;e.approxequal=549;e.ellipsis=1e3;e.arrowvertex=603;e.arrowhorizex=1e3;e.carriagereturn=658;e.aleph=823;e.Ifraktur=686;e.Rfraktur=795;e.weierstrass=987;e.circlemultiply=768;e.circleplus=768;e.emptyset=823;e.intersection=768;e.union=768;e.propersuperset=713;e.reflexsuperset=713;e.notsubset=713;e.propersubset=713;e.reflexsubset=713;e.element=713;e.notelement=713;e.angle=768;e.gradient=713;e.registerserif=790;e.copyrightserif=790;e.trademarkserif=890;e.product=823;e.radical=549;e.dotmath=250;e.logicalnot=713;e.logicaland=603;e.logicalor=603;e.arrowdblboth=1042;e.arrowdblleft=987;e.arrowdblup=603;e.arrowdblright=987;e.arrowdbldown=603;e.lozenge=494;e.angleleft=329;e.registersans=790;e.copyrightsans=790;e.trademarksans=786;e.summation=713;e.parenlefttp=384;e.parenleftex=384;e.parenleftbt=384;e.bracketlefttp=384;e.bracketleftex=384;e.bracketleftbt=384;e.bracelefttp=494;e.braceleftmid=494;e.braceleftbt=494;e.braceex=494;e.angleright=329;e.integral=274;e.integraltp=686;e.integralex=686;e.integralbt=686;e.parenrighttp=384;e.parenrightex=384;e.parenrightbt=384;e.bracketrighttp=384;e.bracketrightex=384;e.bracketrightbt=384;e.bracerighttp=494;e.bracerightmid=494;e.bracerightbt=494;e.apple=790}));e["Times-Roman"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=408;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=564;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=278;e.semicolon=278;e.less=564;e.equal=564;e.greater=564;e.question=444;e.at=921;e.A=722;e.B=667;e.C=667;e.D=722;e.E=611;e.F=556;e.G=722;e.H=722;e.I=333;e.J=389;e.K=722;e.L=611;e.M=889;e.N=722;e.O=722;e.P=556;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=722;e.W=944;e.X=722;e.Y=722;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=469;e.underscore=500;e.quoteleft=333;e.a=444;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=500;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=500;e.o=500;e.p=500;e.q=500;e.r=333;e.s=389;e.t=278;e.u=500;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=480;e.bar=200;e.braceright=480;e.asciitilde=541;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=180;e.quotedblleft=444;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=453;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=444;e.quotedblright=444;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=444;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=889;e.ordfeminine=276;e.Lslash=611;e.Oslash=722;e.OE=889;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=444;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=722;e.divide=564;e.Yacute=722;e.Acircumflex=722;e.aacute=444;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=444;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=444;e.Ncommaaccent=722;e.lacute=278;e.agrave=444;e.Tcommaaccent=611;e.Cacute=667;e.atilde=444;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=444;e.Amacron=722;e.rcaron=333;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=556;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=588;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=722;e.Abreve=722;e.multiply=564;e.uacute=500;e.Tcaron=611;e.partialdiff=476;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=444;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=722;e.Iacute=333;e.plusminus=564;e.brokenbar=200;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=333;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=326;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=444;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=344;e.Kcommaaccent=722;e.Lacute=611;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=333;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=722;e.zdotaccent=444;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=500;e.minus=564;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=564;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Bold"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=1e3;e.ampersand=833;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=930;e.A=722;e.B=667;e.C=722;e.D=722;e.E=667;e.F=611;e.G=778;e.H=778;e.I=389;e.J=500;e.K=778;e.L=667;e.M=944;e.N=722;e.O=778;e.P=611;e.Q=778;e.R=722;e.S=556;e.T=667;e.U=722;e.V=722;e.W=1e3;e.X=722;e.Y=722;e.Z=667;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=581;e.underscore=500;e.quoteleft=333;e.a=500;e.b=556;e.c=444;e.d=556;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=333;e.k=556;e.l=278;e.m=833;e.n=556;e.o=500;e.p=556;e.q=556;e.r=444;e.s=389;e.t=333;e.u=556;e.v=500;e.w=722;e.x=500;e.y=500;e.z=444;e.braceleft=394;e.bar=220;e.braceright=394;e.asciitilde=520;e.exclamdown=333;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=540;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=1e3;e.ordfeminine=300;e.Lslash=667;e.Oslash=778;e.OE=1e3;e.ordmasculine=330;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=556;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=722;e.divide=570;e.Yacute=722;e.Acircumflex=722;e.aacute=500;e.Ucircumflex=722;e.yacute=500;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=667;e.Cacute=722;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=722;e.Gcommaaccent=778;e.ucircumflex=556;e.acircumflex=500;e.Amacron=722;e.rcaron=444;e.ccedilla=444;e.Zdotaccent=667;e.Thorn=611;e.Omacron=778;e.Racute=722;e.Sacute=556;e.dcaron=672;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=778;e.Agrave=722;e.Abreve=722;e.multiply=570;e.uacute=556;e.Tcaron=667;e.partialdiff=494;e.ydieresis=500;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=778;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=444;e.omacron=500;e.Zacute=667;e.Zcaron=667;e.greaterequal=549;e.Eth=722;e.Ccedilla=722;e.lcommaaccent=278;e.tcaron=416;e.eogonek=444;e.Uogonek=722;e.Aacute=722;e.Adieresis=722;e.egrave=444;e.zacute=444;e.iogonek=278;e.Oacute=778;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=778;e.Ugrave=722;e.Delta=612;e.thorn=556;e.twosuperior=300;e.Odieresis=778;e.mu=556;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=556;e.threequarters=750;e.Scedilla=556;e.lcaron=394;e.Kcommaaccent=778;e.Lacute=667;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=667;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=778;e.degree=400;e.ograve=500;e.Ccaron=722;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=444;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=722;e.Lcommaaccent=667;e.Atilde=722;e.Aogonek=722;e.Aring=722;e.Otilde=778;e.zdotaccent=444;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=556;e.minus=570;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=333;e.logicalnot=570;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=444;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-BoldItalic"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=389;e.quotedbl=555;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=570;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=570;e.equal=570;e.greater=570;e.question=500;e.at=832;e.A=667;e.B=667;e.C=667;e.D=722;e.E=667;e.F=667;e.G=722;e.H=778;e.I=389;e.J=500;e.K=667;e.L=611;e.M=889;e.N=722;e.O=722;e.P=611;e.Q=722;e.R=667;e.S=556;e.T=611;e.U=722;e.V=667;e.W=889;e.X=667;e.Y=611;e.Z=611;e.bracketleft=333;e.backslash=278;e.bracketright=333;e.asciicircum=570;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=333;e.g=500;e.h=556;e.i=278;e.j=278;e.k=500;e.l=278;e.m=778;e.n=556;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=556;e.v=444;e.w=667;e.x=500;e.y=444;e.z=389;e.braceleft=348;e.bar=220;e.braceright=348;e.asciitilde=570;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=278;e.quotedblleft=500;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=556;e.fl=556;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=500;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=500;e.quotedblright=500;e.guillemotright=500;e.ellipsis=1e3;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=1e3;e.AE=944;e.ordfeminine=266;e.Lslash=611;e.Oslash=722;e.OE=944;e.ordmasculine=300;e.ae=722;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=722;e.germandbls=500;e.Idieresis=389;e.eacute=444;e.abreve=500;e.uhungarumlaut=556;e.ecaron=444;e.Ydieresis=611;e.divide=570;e.Yacute=611;e.Acircumflex=667;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=556;e.Edieresis=667;e.Dcroat=722;e.commaaccent=250;e.copyright=747;e.Emacron=667;e.ccaron=444;e.aring=500;e.Ncommaaccent=722;e.lacute=278;e.agrave=500;e.Tcommaaccent=611;e.Cacute=667;e.atilde=500;e.Edotaccent=667;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=494;e.Rcaron=667;e.Gcommaaccent=722;e.ucircumflex=556;e.acircumflex=500;e.Amacron=667;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=611;e.Thorn=611;e.Omacron=722;e.Racute=667;e.Sacute=556;e.dcaron=608;e.Umacron=722;e.uring=556;e.threesuperior=300;e.Ograve=722;e.Agrave=667;e.Abreve=667;e.multiply=570;e.uacute=556;e.Tcaron=611;e.partialdiff=494;e.ydieresis=444;e.Nacute=722;e.icircumflex=278;e.Ecircumflex=667;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=556;e.umacron=556;e.Ncaron=722;e.Iacute=389;e.plusminus=570;e.brokenbar=220;e.registered=747;e.Gbreve=722;e.Idotaccent=389;e.summation=600;e.Egrave=667;e.racute=389;e.omacron=500;e.Zacute=611;e.Zcaron=611;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=366;e.eogonek=444;e.Uogonek=722;e.Aacute=667;e.Adieresis=667;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=576;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=667;e.dcroat=500;e.threequarters=750;e.Scedilla=556;e.lcaron=382;e.Kcommaaccent=667;e.Lacute=611;e.trademark=1e3;e.edotaccent=444;e.Igrave=389;e.Imacron=389;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=556;e.Uhungarumlaut=722;e.Eacute=667;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=556;e.Scommaaccent=556;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=556;e.radical=549;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=722;e.otilde=500;e.Rcommaaccent=667;e.Lcommaaccent=611;e.Atilde=667;e.Aogonek=667;e.Aring=667;e.Otilde=722;e.zdotaccent=389;e.Ecaron=667;e.Iogonek=389;e.kcommaaccent=500;e.minus=606;e.Icircumflex=389;e.ncaron=556;e.tcommaaccent=278;e.logicalnot=606;e.odieresis=500;e.udieresis=556;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=556;e.onesuperior=300;e.imacron=278;e.Euro=500}));e["Times-Italic"]=(0,r.getLookupTableFactory)((function(e){e.space=250;e.exclam=333;e.quotedbl=420;e.numbersign=500;e.dollar=500;e.percent=833;e.ampersand=778;e.quoteright=333;e.parenleft=333;e.parenright=333;e.asterisk=500;e.plus=675;e.comma=250;e.hyphen=333;e.period=250;e.slash=278;e.zero=500;e.one=500;e.two=500;e.three=500;e.four=500;e.five=500;e.six=500;e.seven=500;e.eight=500;e.nine=500;e.colon=333;e.semicolon=333;e.less=675;e.equal=675;e.greater=675;e.question=500;e.at=920;e.A=611;e.B=611;e.C=667;e.D=722;e.E=611;e.F=611;e.G=722;e.H=722;e.I=333;e.J=444;e.K=667;e.L=556;e.M=833;e.N=667;e.O=722;e.P=611;e.Q=722;e.R=611;e.S=500;e.T=556;e.U=722;e.V=611;e.W=833;e.X=611;e.Y=556;e.Z=556;e.bracketleft=389;e.backslash=278;e.bracketright=389;e.asciicircum=422;e.underscore=500;e.quoteleft=333;e.a=500;e.b=500;e.c=444;e.d=500;e.e=444;e.f=278;e.g=500;e.h=500;e.i=278;e.j=278;e.k=444;e.l=278;e.m=722;e.n=500;e.o=500;e.p=500;e.q=500;e.r=389;e.s=389;e.t=278;e.u=500;e.v=444;e.w=667;e.x=444;e.y=444;e.z=389;e.braceleft=400;e.bar=275;e.braceright=400;e.asciitilde=541;e.exclamdown=389;e.cent=500;e.sterling=500;e.fraction=167;e.yen=500;e.florin=500;e.section=500;e.currency=500;e.quotesingle=214;e.quotedblleft=556;e.guillemotleft=500;e.guilsinglleft=333;e.guilsinglright=333;e.fi=500;e.fl=500;e.endash=500;e.dagger=500;e.daggerdbl=500;e.periodcentered=250;e.paragraph=523;e.bullet=350;e.quotesinglbase=333;e.quotedblbase=556;e.quotedblright=556;e.guillemotright=500;e.ellipsis=889;e.perthousand=1e3;e.questiondown=500;e.grave=333;e.acute=333;e.circumflex=333;e.tilde=333;e.macron=333;e.breve=333;e.dotaccent=333;e.dieresis=333;e.ring=333;e.cedilla=333;e.hungarumlaut=333;e.ogonek=333;e.caron=333;e.emdash=889;e.AE=889;e.ordfeminine=276;e.Lslash=556;e.Oslash=722;e.OE=944;e.ordmasculine=310;e.ae=667;e.dotlessi=278;e.lslash=278;e.oslash=500;e.oe=667;e.germandbls=500;e.Idieresis=333;e.eacute=444;e.abreve=500;e.uhungarumlaut=500;e.ecaron=444;e.Ydieresis=556;e.divide=675;e.Yacute=556;e.Acircumflex=611;e.aacute=500;e.Ucircumflex=722;e.yacute=444;e.scommaaccent=389;e.ecircumflex=444;e.Uring=722;e.Udieresis=722;e.aogonek=500;e.Uacute=722;e.uogonek=500;e.Edieresis=611;e.Dcroat=722;e.commaaccent=250;e.copyright=760;e.Emacron=611;e.ccaron=444;e.aring=500;e.Ncommaaccent=667;e.lacute=278;e.agrave=500;e.Tcommaaccent=556;e.Cacute=667;e.atilde=500;e.Edotaccent=611;e.scaron=389;e.scedilla=389;e.iacute=278;e.lozenge=471;e.Rcaron=611;e.Gcommaaccent=722;e.ucircumflex=500;e.acircumflex=500;e.Amacron=611;e.rcaron=389;e.ccedilla=444;e.Zdotaccent=556;e.Thorn=611;e.Omacron=722;e.Racute=611;e.Sacute=500;e.dcaron=544;e.Umacron=722;e.uring=500;e.threesuperior=300;e.Ograve=722;e.Agrave=611;e.Abreve=611;e.multiply=675;e.uacute=500;e.Tcaron=556;e.partialdiff=476;e.ydieresis=444;e.Nacute=667;e.icircumflex=278;e.Ecircumflex=611;e.adieresis=500;e.edieresis=444;e.cacute=444;e.nacute=500;e.umacron=500;e.Ncaron=667;e.Iacute=333;e.plusminus=675;e.brokenbar=275;e.registered=760;e.Gbreve=722;e.Idotaccent=333;e.summation=600;e.Egrave=611;e.racute=389;e.omacron=500;e.Zacute=556;e.Zcaron=556;e.greaterequal=549;e.Eth=722;e.Ccedilla=667;e.lcommaaccent=278;e.tcaron=300;e.eogonek=444;e.Uogonek=722;e.Aacute=611;e.Adieresis=611;e.egrave=444;e.zacute=389;e.iogonek=278;e.Oacute=722;e.oacute=500;e.amacron=500;e.sacute=389;e.idieresis=278;e.Ocircumflex=722;e.Ugrave=722;e.Delta=612;e.thorn=500;e.twosuperior=300;e.Odieresis=722;e.mu=500;e.igrave=278;e.ohungarumlaut=500;e.Eogonek=611;e.dcroat=500;e.threequarters=750;e.Scedilla=500;e.lcaron=300;e.Kcommaaccent=667;e.Lacute=556;e.trademark=980;e.edotaccent=444;e.Igrave=333;e.Imacron=333;e.Lcaron=611;e.onehalf=750;e.lessequal=549;e.ocircumflex=500;e.ntilde=500;e.Uhungarumlaut=722;e.Eacute=611;e.emacron=444;e.gbreve=500;e.onequarter=750;e.Scaron=500;e.Scommaaccent=500;e.Ohungarumlaut=722;e.degree=400;e.ograve=500;e.Ccaron=667;e.ugrave=500;e.radical=453;e.Dcaron=722;e.rcommaaccent=389;e.Ntilde=667;e.otilde=500;e.Rcommaaccent=611;e.Lcommaaccent=556;e.Atilde=611;e.Aogonek=611;e.Aring=611;e.Otilde=722;e.zdotaccent=389;e.Ecaron=611;e.Iogonek=333;e.kcommaaccent=444;e.minus=675;e.Icircumflex=333;e.ncaron=500;e.tcommaaccent=278;e.logicalnot=675;e.odieresis=500;e.udieresis=500;e.notequal=549;e.gcommaaccent=500;e.eth=500;e.zcaron=389;e.ncommaaccent=500;e.onesuperior=300;e.imacron=278;e.Euro=500}));e.ZapfDingbats=(0,r.getLookupTableFactory)((function(e){e.space=278;e.a1=974;e.a2=961;e.a202=974;e.a3=980;e.a4=719;e.a5=789;e.a119=790;e.a118=791;e.a117=690;e.a11=960;e.a12=939;e.a13=549;e.a14=855;e.a15=911;e.a16=933;e.a105=911;e.a17=945;e.a18=974;e.a19=755;e.a20=846;e.a21=762;e.a22=761;e.a23=571;e.a24=677;e.a25=763;e.a26=760;e.a27=759;e.a28=754;e.a6=494;e.a7=552;e.a8=537;e.a9=577;e.a10=692;e.a29=786;e.a30=788;e.a31=788;e.a32=790;e.a33=793;e.a34=794;e.a35=816;e.a36=823;e.a37=789;e.a38=841;e.a39=823;e.a40=833;e.a41=816;e.a42=831;e.a43=923;e.a44=744;e.a45=723;e.a46=749;e.a47=790;e.a48=792;e.a49=695;e.a50=776;e.a51=768;e.a52=792;e.a53=759;e.a54=707;e.a55=708;e.a56=682;e.a57=701;e.a58=826;e.a59=815;e.a60=789;e.a61=789;e.a62=707;e.a63=687;e.a64=696;e.a65=689;e.a66=786;e.a67=787;e.a68=713;e.a69=791;e.a70=785;e.a71=791;e.a72=873;e.a73=761;e.a74=762;e.a203=762;e.a75=759;e.a204=759;e.a76=892;e.a77=892;e.a78=788;e.a79=784;e.a81=438;e.a82=138;e.a83=277;e.a84=415;e.a97=392;e.a98=392;e.a99=668;e.a100=668;e.a89=390;e.a90=390;e.a93=317;e.a94=317;e.a91=276;e.a92=276;e.a205=509;e.a85=509;e.a206=410;e.a86=410;e.a87=234;e.a88=234;e.a95=334;e.a96=334;e.a101=732;e.a102=544;e.a103=544;e.a104=910;e.a106=667;e.a107=760;e.a108=760;e.a112=776;e.a111=595;e.a110=694;e.a109=626;e.a120=788;e.a121=788;e.a122=788;e.a123=788;e.a124=788;e.a125=788;e.a126=788;e.a127=788;e.a128=788;e.a129=788;e.a130=788;e.a131=788;e.a132=788;e.a133=788;e.a134=788;e.a135=788;e.a136=788;e.a137=788;e.a138=788;e.a139=788;e.a140=788;e.a141=788;e.a142=788;e.a143=788;e.a144=788;e.a145=788;e.a146=788;e.a147=788;e.a148=788;e.a149=788;e.a150=788;e.a151=788;e.a152=788;e.a153=788;e.a154=788;e.a155=788;e.a156=788;e.a157=788;e.a158=788;e.a159=788;e.a160=894;e.a161=838;e.a163=1016;e.a164=458;e.a196=748;e.a165=924;e.a192=748;e.a166=918;e.a167=927;e.a168=928;e.a169=928;e.a170=834;e.a171=873;e.a172=828;e.a173=924;e.a162=924;e.a174=917;e.a175=930;e.a176=931;e.a177=463;e.a178=883;e.a179=836;e.a193=836;e.a180=867;e.a199=867;e.a181=696;e.a200=696;e.a182=874;e.a201=874;e.a183=760;e.a184=946;e.a197=771;e.a185=865;e.a194=771;e.a198=888;e.a186=967;e.a195=888;e.a187=831;e.a188=873;e.a189=927;e.a190=970;e.a191=918}))}));t.getMetrics=n;const i=(0,r.getLookupTableFactory)((function(e){e.Courier={ascent:629,descent:-157,capHeight:562,xHeight:-426};e["Courier-Bold"]={ascent:629,descent:-157,capHeight:562,xHeight:439};e["Courier-Oblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e["Courier-BoldOblique"]={ascent:629,descent:-157,capHeight:562,xHeight:426};e.Helvetica={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-Bold"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Helvetica-Oblique"]={ascent:718,descent:-207,capHeight:718,xHeight:523};e["Helvetica-BoldOblique"]={ascent:718,descent:-207,capHeight:718,xHeight:532};e["Times-Roman"]={ascent:683,descent:-217,capHeight:662,xHeight:450};e["Times-Bold"]={ascent:683,descent:-217,capHeight:676,xHeight:461};e["Times-Italic"]={ascent:683,descent:-217,capHeight:653,xHeight:441};e["Times-BoldItalic"]={ascent:683,descent:-217,capHeight:669,xHeight:462};e.Symbol={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN};e.ZapfDingbats={ascent:Math.NaN,descent:Math.NaN,capHeight:Math.NaN,xHeight:Math.NaN}}));t.getFontBasicMetrics=i},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.GlyfTable=void 0;t.GlyfTable=class GlyfTable{constructor({glyfTable:e,isGlyphLocationsLong:t,locaTable:a,numGlyphs:r}){this.glyphs=[];const n=new DataView(a.buffer,a.byteOffset,a.byteLength),i=new DataView(e.buffer,e.byteOffset,e.byteLength),s=t?4:2;let o=t?n.getUint32(0):2*n.getUint16(0),c=0;for(let e=0;ee+(t.getSize()+3&-4)),0)}write(){const e=this.getSize(),t=new DataView(new ArrayBuffer(e)),a=e>131070,r=a?4:2,n=new DataView(new ArrayBuffer((this.glyphs.length+1)*r));a?n.setUint32(0,0):n.setUint16(0,0);let i=0,s=0;for(const e of this.glyphs){i+=e.write(i,t);i=i+3&-4;s+=r;a?n.setUint32(s,i):n.setUint16(s,i>>1)}return{isLocationLong:a,loca:new Uint8Array(n.buffer),glyf:new Uint8Array(t.buffer)}}scale(e){for(let t=0,a=this.glyphs.length;te+t.getSize()),0);return this.header.getSize()+e}write(e,t){if(!this.header)return 0;const a=e;e+=this.header.write(e,t);if(this.simple)e+=this.simple.write(e,t);else for(const a of this.composites)e+=a.write(e,t);return e-a}scale(e){if(!this.header)return;const t=(this.header.xMin+this.header.xMax)/2;this.header.scale(t,e);if(this.simple)this.simple.scale(t,e);else for(const a of this.composites)a.scale(t,e)}}class GlyphHeader{constructor({numberOfContours:e,xMin:t,yMin:a,xMax:r,yMax:n}){this.numberOfContours=e;this.xMin=t;this.yMin=a;this.xMax=r;this.yMax=n}static parse(e,t){return[10,new GlyphHeader({numberOfContours:t.getInt16(e),xMin:t.getInt16(e+2),yMin:t.getInt16(e+4),xMax:t.getInt16(e+6),yMax:t.getInt16(e+8)})]}getSize(){return 10}write(e,t){t.setInt16(e,this.numberOfContours);t.setInt16(e+2,this.xMin);t.setInt16(e+4,this.yMin);t.setInt16(e+6,this.xMax);t.setInt16(e+8,this.yMax);return 10}scale(e,t){this.xMin=Math.round(e+(this.xMin-e)*t);this.xMax=Math.round(e+(this.xMax-e)*t)}}class Contour{constructor({flags:e,xCoordinates:t,yCoordinates:a}){this.xCoordinates=t;this.yCoordinates=a;this.flags=e}}class SimpleGlyph{constructor({contours:e,instructions:t}){this.contours=e;this.instructions=t}static parse(e,t,a){const r=[];for(let n=0;n255?e+=2:o>0&&(e+=1);t=i;o=Math.abs(s-a);o>255?e+=2:o>0&&(e+=1);a=s}}return e}write(e,t){const a=e,r=[],n=[],i=[];let s=0,o=0;for(const a of this.contours){for(let e=0,t=a.xCoordinates.length;e=0?18:2;r.push(e)}else r.push(l)}s=c;const h=a.yCoordinates[e];l=h-o;if(0===l){t|=32;n.push(0)}else{const e=Math.abs(l);if(e<=255){t|=l>=0?36:4;n.push(e)}else n.push(l)}o=h;i.push(t)}t.setUint16(e,r.length-1);e+=2}t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}for(const a of i)t.setUint8(e++,a);for(let a=0,n=r.length;a=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(e+=2):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(e+=2);return e}write(e,t){const a=e;2&this.flags?this.argument1>=-128&&this.argument1<=127&&this.argument2>=-128&&this.argument2<=127||(this.flags|=1):this.argument1>=0&&this.argument1<=255&&this.argument2>=0&&this.argument2<=255||(this.flags|=1);t.setUint16(e,this.flags);t.setUint16(e+2,this.glyphIndex);e+=4;if(1&this.flags){if(2&this.flags){t.setInt16(e,this.argument1);t.setInt16(e+2,this.argument2)}else{t.setUint16(e,this.argument1);t.setUint16(e+2,this.argument2)}e+=4}else{t.setUint8(e,this.argument1);t.setUint8(e+1,this.argument2);e+=2}if(256&this.flags){t.setUint16(e,this.instructions.length);e+=2;if(this.instructions.length){new Uint8Array(t.buffer,0,t.buffer.byteLength).set(this.instructions,e);e+=this.instructions.length}}return e-a}scale(e,t){}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.OpenTypeFileBuilder=void 0;var r=a(6),n=a(2);function writeInt16(e,t,a){e[t]=a>>8&255;e[t+1]=255&a}function writeInt32(e,t,a){e[t]=a>>24&255;e[t+1]=a>>16&255;e[t+2]=a>>8&255;e[t+3]=255&a}function writeData(e,t,a){if(a instanceof Uint8Array)e.set(a,t);else if("string"==typeof a)for(let r=0,n=a.length;ra;){a<<=1;r++}const n=a*t;return{range:n,entry:r,rangeShift:t*e-n}}toArray(){let e=this.sfnt;const t=this.tables,a=Object.keys(t);a.sort();const i=a.length;let s,o,c,l,h,u=12+16*i;const d=[u];for(s=0;s>>0;d.push(u)}const f=new Uint8Array(u);for(s=0;s>>0}writeInt32(f,u+4,e);writeInt32(f,u+8,d[s]);writeInt32(f,u+12,t[h].length);u+=16}return f}addTable(e,t){if(e in this.tables)throw new Error("Table "+e+" already exists");this.tables[e]=t}}t.OpenTypeFileBuilder=OpenTypeFileBuilder},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Type1Font=void 0;var r=a(35),n=a(38),i=a(6),s=a(10),o=a(49),c=a(2);function findBlock(e,t,a){const r=e.length,n=t.length,s=r-n;let o=a,c=!1;for(;o=n){o+=a;for(;o=0&&(r[e]=i)}}return(0,n.type1FontGlyphMapping)(e,r,a)}hasGlyphId(e){if(e<0||e>=this.numGlyphs)return!1;if(0===e)return!0;return this.charstrings[e-1].charstring.length>0}getSeacs(e){const t=[];for(let a=0,r=e.length;a0;e--)t[e]-=t[e-1];g.setByName(e,t)}s.topDict.privateDict=g;const m=new r.CFFIndex;for(u=0,d=n.length;u{Object.defineProperty(t,"__esModule",{value:!0});t.Type1Parser=void 0;var r=a(37),n=a(6),i=a(10),s=a(2);const o=[4],c=[5],l=[6],h=[7],u=[8],d=[12,35],f=[14],g=[21],p=[22],m=[30],b=[31];class Type1CharString{constructor(){this.width=0;this.lsb=0;this.flexing=!1;this.output=[];this.stack=[]}convert(e,t,a){const r=e.length;let n,i,y,w=!1;for(let S=0;Sr)return!0;const n=r-e;for(let e=n;e>8&255,255&t);else{t=65536*t|0;this.output.push(255,t>>24&255,t>>16&255,t>>8&255,255&t)}}this.output.push(...t);a?this.stack.splice(n,e):this.stack.length=0;return!1}}function isHexDigit(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function decrypt(e,t,a){if(a>=e.length)return new Uint8Array(0);let r,n,i=0|t;for(r=0;r>8;i=52845*(t+i)+22719&65535}return o}function isSpecial(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}t.Type1Parser=class Type1Parser{constructor(e,t,a){if(t){const t=e.getBytes(),a=!((isHexDigit(t[0])||(0,n.isWhiteSpace)(t[0]))&&isHexDigit(t[1])&&isHexDigit(t[2])&&isHexDigit(t[3])&&isHexDigit(t[4])&&isHexDigit(t[5])&&isHexDigit(t[6])&&isHexDigit(t[7]));e=new i.Stream(a?decrypt(t,55665,4):function decryptAscii(e,t,a){let r=0|t;const n=e.length,i=new Uint8Array(n>>>1);let s,o;for(s=0,o=0;s>8;r=52845*(e+r)+22719&65535}}return i.slice(a,o)}(t,55665,4))}this.seacAnalysisEnabled=!!a;this.stream=e;this.nextChar()}readNumberArray(){this.getToken();const e=[];for(;;){const t=this.getToken();if(null===t||"]"===t||"}"===t)break;e.push(parseFloat(t||0))}return e}readNumber(){const e=this.getToken();return parseFloat(e||0)}readInt(){const e=this.getToken();return 0|parseInt(e||0,10)}readBoolean(){return"true"===this.getToken()?1:0}nextChar(){return this.currentChar=this.stream.getByte()}prevChar(){this.stream.skip(-2);return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(-1===t)return null;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,n.isWhiteSpace)(t))break;t=this.nextChar()}if(isSpecial(t)){this.nextChar();return String.fromCharCode(t)}let a="";do{a+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!(0,n.isWhiteSpace)(t)&&!isSpecial(t));return a}readCharStrings(e,t){return-1===t?e:decrypt(e,4330,t)}extractFontProgram(e){const t=this.stream,a=[],r=[],n=Object.create(null);n.lenIV=4;const i={subrs:[],charstrings:[],properties:{privateData:n}};let s,o,c,l;for(;null!==(s=this.getToken());)if("/"===s){s=this.getToken();switch(s){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;;){s=this.getToken();if(null===s||"end"===s)break;if("/"!==s)continue;const e=this.getToken();o=this.readInt();this.getToken();c=o>0?t.getBytes(o):new Uint8Array(0);l=i.properties.privateData.lenIV;const a=this.readCharStrings(c,l);this.nextChar();s=this.getToken();"noaccess"===s?this.getToken():"/"===s&&this.prevChar();r.push({glyph:e,encoded:a})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){const e=this.readInt();o=this.readInt();this.getToken();c=o>0?t.getBytes(o):new Uint8Array(0);l=i.properties.privateData.lenIV;const r=this.readCharStrings(c,l);this.nextChar();s=this.getToken();"noaccess"===s&&this.getToken();a[e]=r}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":const e=this.readNumberArray();e.length>0&&e.length,0;break;case"StemSnapH":case"StemSnapV":i.properties.privateData[s]=this.readNumberArray();break;case"StdHW":case"StdVW":i.properties.privateData[s]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":case"ExpansionFactor":i.properties.privateData[s]=this.readNumber();break;case"ForceBold":i.properties.privateData[s]=this.readBoolean()}}for(const{encoded:t,glyph:n}of r){const r=new Type1CharString,s=r.convert(t,a,this.seacAnalysisEnabled);let o=r.output;s&&(o=[14]);const c={glyphName:n,charstring:o,width:r.width,lsb:r.lsb,seac:r.seac};".notdef"===n?i.charstrings.unshift(c):i.charstrings.push(c);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(n);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=r.width)}}return i}extractFontHeader(e){let t;for(;null!==(t=this.getToken());)if("/"===t){t=this.getToken();switch(t){case"FontMatrix":const a=this.readNumberArray();e.fontMatrix=a;break;case"Encoding":const n=this.getToken();let i;if(/^\d+$/.test(n)){i=[];const e=0|parseInt(n,10);this.getToken();for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.Pattern=void 0;t.getTilingPatternIR=function getTilingPatternIR(e,t,a){const n=t.getArray("Matrix"),i=r.Util.normalizeRect(t.getArray("BBox")),s=t.get("XStep"),o=t.get("YStep"),c=t.get("PaintType"),l=t.get("TilingType");if(i[2]-i[0]==0||i[3]-i[1]==0)throw new r.FormatError(`Invalid getTilingPatternIR /BBox array: [${i}].`);return["TilingPattern",a,e,n,i,s,o,c,l]};var r=a(2),n=a(7),i=a(14),s=a(6);const o=2,c=3,l=4,h=5,u=6,d=7;t.Pattern=class Pattern{constructor(){(0,r.unreachable)("Cannot initialize Pattern.")}static parseShading(e,t,a,i,f,g){const p=e instanceof n.BaseStream?e.dict:e,m=p.get("ShadingType");try{switch(m){case o:case c:return new RadialAxialShading(p,t,a,f,g);case l:case h:case u:case d:return new MeshShading(e,t,a,f,g);default:throw new r.FormatError("Unsupported ShadingType: "+m)}}catch(e){if(e instanceof s.MissingDataException)throw e;i.send("UnsupportedFeature",{featureId:r.UNSUPPORTED_FEATURES.shadingPattern});(0,r.warn)(e);return new DummyShading}}};class BaseShading{static get SMALL_NUMBER(){return(0,r.shadow)(this,"SMALL_NUMBER",1e-6)}constructor(){this.constructor===BaseShading&&(0,r.unreachable)("Cannot initialize BaseShading.")}getIR(){(0,r.unreachable)("Abstract method `getIR` called.")}}class RadialAxialShading extends BaseShading{constructor(e,t,a,n,s){super();this.coordsArr=e.getArray("Coords");this.shadingType=e.get("ShadingType");const o=i.ColorSpace.parse({cs:e.getRaw("CS")||e.getRaw("ColorSpace"),xref:t,resources:a,pdfFunctionFactory:n,localColorSpaceCache:s}),l=e.getArray("BBox");Array.isArray(l)&&4===l.length?this.bbox=r.Util.normalizeRect(l):this.bbox=null;let h=0,u=1;if(e.has("Domain")){const t=e.getArray("Domain");h=t[0];u=t[1]}let d=!1,f=!1;if(e.has("Extend")){const t=e.getArray("Extend");d=t[0];f=t[1]}if(!(this.shadingType!==c||d&&f)){const[e,t,a,n,i,s]=this.coordsArr,o=Math.hypot(e-n,t-i);a<=s+o&&s<=a+o&&(0,r.warn)("Unsupported radial gradient.")}this.extendStart=d;this.extendEnd=f;const g=e.getRaw("Function"),p=n.createFromArray(g),m=(u-h)/10,b=this.colorStops=[];if(h>=u||m<=0){(0,r.info)("Bad shading domain.");return}const y=new Float32Array(o.numComps),w=new Float32Array(1);let S;for(let e=0;e<=10;e++){w[0]=h+e*m;p(w,0,y,0);S=o.getRgb(y,0);const t=r.Util.makeHexColor(S[0],S[1],S[2]);b.push([e/10,t])}let x="transparent";if(e.has("Background")){S=o.getRgb(e.get("Background"),0);x=r.Util.makeHexColor(S[0],S[1],S[2])}if(!d){b.unshift([0,x]);b[1][0]+=BaseShading.SMALL_NUMBER}if(!f){b.at(-1)[0]-=BaseShading.SMALL_NUMBER;b.push([1,x])}this.colorStops=b}getIR(){const e=this.coordsArr,t=this.shadingType;let a,n,i,s,l;if(t===o){n=[e[0],e[1]];i=[e[2],e[3]];s=null;l=null;a="axial"}else if(t===c){n=[e[0],e[1]];i=[e[3],e[4]];s=e[2];l=e[5];a="radial"}else(0,r.unreachable)(`getPattern type unknown: ${t}`);return["RadialAxial",a,this.bbox,this.colorStops,n,i,s,l]}}class MeshStreamReader{constructor(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;const a=t.numComps;this.tmpCompsBuf=new Float32Array(a);const r=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(r):this.tmpCompsBuf}get hasData(){if(this.stream.end)return this.stream.pos0)return!0;const e=this.stream.getByte();if(e<0)return!1;this.buffer=e;this.bufferLength=8;return!0}readBits(e){let t=this.buffer,a=this.bufferLength;if(32===e){if(0===a)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;t=t<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();const e=this.stream.getByte();this.buffer=e&(1<>a)>>>0}if(8===e&&0===a)return this.stream.getByte();for(;a>a}align(){this.buffer=0;this.bufferLength=0}readFlag(){return this.readBits(this.context.bitsPerFlag)}readCoordinate(){const e=this.context.bitsPerCoordinate,t=this.readBits(e),a=this.readBits(e),r=this.context.decode,n=e<32?1/((1<i?i:e;t=t>s?s:t;a=a{Object.defineProperty(t,"__esModule",{value:!0});t.getXfaFontDict=function getXfaFontDict(e){const t=function getXfaFontWidths(e){const t=getXfaFontName(e);if(!t)return null;const{baseWidths:a,baseMapping:r,factors:n}=t;let i;i=n?a.map(((e,t)=>e*n[t])):a;let s,o=-2;const c=[];for(const[e,t]of r.map(((e,t)=>[e,t])).sort((([e],[t])=>e-t)))if(-1!==e)if(e===o+1){s.push(i[t]);o+=1}else{o=e;s=[i[t]];c.push(e,s)}return c}(e),a=new n.Dict(null);a.set("BaseFont",n.Name.get(e));a.set("Type",n.Name.get("Font"));a.set("Subtype",n.Name.get("CIDFontType2"));a.set("Encoding",n.Name.get("Identity-H"));a.set("CIDToGIDMap",n.Name.get("Identity"));a.set("W",t);a.set("FirstChar",t[0]);a.set("LastChar",t.at(-2)+t.at(-1).length-1);const r=new n.Dict(null);a.set("FontDescriptor",r);const i=new n.Dict(null);i.set("Ordering","Identity");i.set("Registry","Adobe");i.set("Supplement",0);a.set("CIDSystemInfo",i);return a};t.getXfaFontName=getXfaFontName;var r=a(52),n=a(5),i=a(53),s=a(54),o=a(55),c=a(56),l=a(6),h=a(38);const u=(0,l.getLookupTableFactory)((function(e){e["MyriadPro-Regular"]=e["PdfJS-Fallback-Regular"]={name:"LiberationSans-Regular",factors:o.MyriadProRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:o.MyriadProRegularMetrics};e["MyriadPro-Bold"]=e["PdfJS-Fallback-Bold"]={name:"LiberationSans-Bold",factors:o.MyriadProBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:o.MyriadProBoldMetrics};e["MyriadPro-It"]=e["MyriadPro-Italic"]=e["PdfJS-Fallback-Italic"]={name:"LiberationSans-Italic",factors:o.MyriadProItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:o.MyriadProItalicMetrics};e["MyriadPro-BoldIt"]=e["MyriadPro-BoldItalic"]=e["PdfJS-Fallback-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:o.MyriadProBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:o.MyriadProBoldItalicMetrics};e.ArialMT=e.Arial=e["Arial-Regular"]={name:"LiberationSans-Regular",baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping};e["Arial-BoldMT"]=e["Arial-Bold"]={name:"LiberationSans-Bold",baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping};e["Arial-ItalicMT"]=e["Arial-Italic"]={name:"LiberationSans-Italic",baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping};e["Arial-BoldItalicMT"]=e["Arial-BoldItalic"]={name:"LiberationSans-BoldItalic",baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping};e["Calibri-Regular"]={name:"LiberationSans-Regular",factors:r.CalibriRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:r.CalibriRegularMetrics};e["Calibri-Bold"]={name:"LiberationSans-Bold",factors:r.CalibriBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:r.CalibriBoldMetrics};e["Calibri-Italic"]={name:"LiberationSans-Italic",factors:r.CalibriItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:r.CalibriItalicMetrics};e["Calibri-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:r.CalibriBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:r.CalibriBoldItalicMetrics};e["Segoeui-Regular"]={name:"LiberationSans-Regular",factors:c.SegoeuiRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:c.SegoeuiRegularMetrics};e["Segoeui-Bold"]={name:"LiberationSans-Bold",factors:c.SegoeuiBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:c.SegoeuiBoldMetrics};e["Segoeui-Italic"]={name:"LiberationSans-Italic",factors:c.SegoeuiItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:c.SegoeuiItalicMetrics};e["Segoeui-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:c.SegoeuiBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:c.SegoeuiBoldItalicMetrics};e["Helvetica-Regular"]=e.Helvetica={name:"LiberationSans-Regular",factors:i.HelveticaRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:i.HelveticaRegularMetrics};e["Helvetica-Bold"]={name:"LiberationSans-Bold",factors:i.HelveticaBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:i.HelveticaBoldMetrics};e["Helvetica-Italic"]={name:"LiberationSans-Italic",factors:i.HelveticaItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:i.HelveticaItalicMetrics};e["Helvetica-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:i.HelveticaBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:i.HelveticaBoldItalicMetrics}}));function getXfaFontName(e){const t=(0,h.normalizeFontName)(e);return u()[t]}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CalibriRegularMetrics=t.CalibriRegularFactors=t.CalibriItalicMetrics=t.CalibriItalicFactors=t.CalibriBoldMetrics=t.CalibriBoldItalicMetrics=t.CalibriBoldItalicFactors=t.CalibriBoldFactors=void 0;t.CalibriBoldFactors=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.54657,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.73293,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.9121,.86943,.79795,.88198,.77958,.70864,.81055,.90399,.88653,.96017,.82577,.77892,.78257,.97507,1.54657,.97507,.85284,.89552,.90176,.88762,.8785,.75241,.8785,.90518,.95015,.77618,.8785,.88401,.91916,.86304,.88401,.91488,.8785,.8801,.8785,.8785,.91343,.7173,1.04106,.8785,.85075,.95794,.82616,.85162,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.12401,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.73293,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.9121,.86943,.86943,.86943,.86943,.86943,.85284,.87508,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.88762,.88762,.88762,.88762,.88762,.88762,.8715,.75241,.90518,.90518,.90518,.90518,.88401,.88401,.88401,.88401,.8785,.8785,.8801,.8801,.8801,.8801,.8801,.90747,.89049,.8785,.8785,.8785,.8785,.85162,.8785,.85162,.83908,.88762,.83908,.88762,.83908,.88762,.73293,.75241,.73293,.75241,.73293,.75241,.73293,.75241,.87289,.83016,.88506,.93125,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.73133,.90518,.81921,.77618,.81921,.77618,.81921,.77618,1,1,.87356,.8785,.91075,.89608,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76229,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.79468,.91926,.88175,.70823,.94903,.9121,.8785,1,1,.9121,.8785,.87802,.88656,.8785,.86943,.8801,.86943,.8801,.86943,.8801,.87402,.89291,.77958,.91343,1,1,.77958,.91343,.70864,.7173,.70864,.7173,.70864,.7173,.70864,.7173,1,1,.81055,.75841,.81055,1.06452,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.90399,.8785,.96017,.95794,.77892,.85162,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.88762,.77539,.8715,.87508,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70674,.98387,.94721,1.33431,1.45894,.95161,1.06303,.83908,.80352,.57184,.6965,.56289,.82001,.56029,.81235,1.02988,.83908,.7762,.68156,.80367,.73133,.78257,.87356,.86943,.95958,.75727,.89019,1.04924,.9121,.7648,.86943,.87356,.79795,.78275,.81055,.77892,.9762,.82577,.99819,.84896,.95958,.77892,.96108,1.01407,.89049,1.02988,.94211,.96108,.8936,.84021,.87842,.96399,.79109,.89049,1.00813,1.02988,.86077,.87445,.92099,.84723,.86513,.8801,.75638,.85714,.78216,.79586,.87965,.94211,.97747,.78287,.97926,.84971,1.02988,.94211,.8801,.94211,.84971,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90264,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.90518,1,1,1,1,1,1,1,1,1,1,1,1,.90548,1,1,1,1,1,1,.96017,.95794,.96017,.95794,.96017,.95794,.77892,.85162,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.92794,.87012,.87012,.87012,.89552,.89552,1.42259,.71143,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.93835,.83406,.91133,.84107,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90527,1.81055,.90527,1.81055,1.31006,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriBoldMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriBoldItalicFactors=[1.3877,1,1,1,.97801,.92482,.89552,.91133,.81988,.97566,.98152,.93548,.93548,1.2798,.85284,.92794,1,.96134,1.56239,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.82845,.82845,.85284,.85284,.85284,.75859,.92138,.83908,.7762,.71805,.87289,.73133,.7514,.81921,.87356,.95958,.59526,.75727,.69225,1.04924,.90872,.85938,.79795,.87068,.77958,.69766,.81055,.90399,.88653,.96068,.82577,.77892,.78257,.97507,1.529,.97507,.85284,.89552,.90176,.94908,.86411,.74012,.86411,.88323,.95015,.86411,.86331,.88401,.91916,.86304,.88401,.9039,.86331,.86331,.86411,.86411,.90464,.70852,1.04106,.86331,.84372,.95794,.82616,.84548,.79492,.88331,1.69808,.88331,.85284,.97801,.89552,.91133,.89552,.91133,1.7801,.89552,1.24487,1.13254,1.19129,.96839,.85284,.68787,.70645,.85592,.90747,1.01466,1.0088,.90323,1,1.07463,1,.91056,.75806,1.19118,.96839,.78864,.82845,.84133,.75859,.83908,.83908,.83908,.83908,.83908,.83908,.77539,.71805,.73133,.73133,.73133,.73133,.95958,.95958,.95958,.95958,.88506,.90872,.85938,.85938,.85938,.85938,.85938,.85284,.87068,.90399,.90399,.90399,.90399,.77892,.79795,.90807,.94908,.94908,.94908,.94908,.94908,.94908,.85887,.74012,.88323,.88323,.88323,.88323,.88401,.88401,.88401,.88401,.8785,.86331,.86331,.86331,.86331,.86331,.86331,.90747,.89049,.86331,.86331,.86331,.86331,.84548,.86411,.84548,.83908,.94908,.83908,.94908,.83908,.94908,.71805,.74012,.71805,.74012,.71805,.74012,.71805,.74012,.87289,.79538,.88506,.92726,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.73133,.88323,.81921,.86411,.81921,.86411,.81921,.86411,1,1,.87356,.86331,.91075,.8777,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.95958,.88401,.76467,.90167,.59526,.91916,1,1,.86304,.69225,.88401,1,1,.70424,.77312,.91926,.88175,.70823,.94903,.90872,.86331,1,1,.90872,.86331,.86906,.88116,.86331,.85938,.86331,.85938,.86331,.85938,.86331,.87402,.86549,.77958,.90464,1,1,.77958,.90464,.69766,.70852,.69766,.70852,.69766,.70852,.69766,.70852,1,1,.81055,.75841,.81055,1.06452,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.90399,.86331,.96068,.95794,.77892,.84548,.77892,.78257,.79492,.78257,.79492,.78257,.79492,.9297,.56892,.83908,.94908,.77539,.85887,.87068,.89049,1,1,.81055,1.04106,1.20528,1.20528,1,1.15543,.70088,.98387,.94721,1.33431,1.45894,.95161,1.48387,.83908,.80352,.57118,.6965,.56347,.79179,.55853,.80346,1.02988,.83908,.7762,.67174,.86036,.73133,.78257,.87356,.86441,.95958,.75727,.89019,1.04924,.90872,.74889,.85938,.87891,.79795,.7957,.81055,.77892,.97447,.82577,.97466,.87179,.95958,.77892,.94252,.95612,.8753,1.02988,.92733,.94252,.87411,.84021,.8728,.95612,.74081,.8753,1.02189,1.02988,.84814,.87445,.91822,.84723,.85668,.86331,.81344,.87581,.76422,.82046,.96057,.92733,.99375,.78022,.95452,.86015,1.02988,.92733,.86331,.92733,.86015,.73133,1,1,1,1,1,1,1,1,1,1,1,1,.90631,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.88323,1,1,1,1,1,1,1,1,1,1,1,1,.85174,1,1,1,1,1,1,.96068,.95794,.96068,.95794,.96068,.95794,.77892,.84548,1,1,.89552,.90527,1,.90363,.92794,.92794,.92794,.89807,.87012,.87012,.87012,.89552,.89552,1.42259,.71094,1.06152,1,1,1.03372,1.03372,.97171,1.4956,2.2807,.92972,.83406,.91133,.83326,.91133,1,1,1,.72021,1,1.23108,.83489,.88525,.88525,.81499,.90616,1.81055,.90527,1.81055,1.3107,1.53711,.94434,1.08696,1,.95018,.77192,.85284,.90747,1.17534,.69825,.9716,1.37077,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.08004,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,.90727,.90727,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriBoldItalicMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriItalicFactors=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39543,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.72346,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89249,.84118,.77452,.85374,.75186,.67789,.79776,.88844,.85066,.94309,.77818,.7306,.76659,1.10369,1.38313,1.10369,1.06139,.89552,.8739,.9245,.9245,.83203,.9245,.85865,1.09842,.9245,.9245,1.03297,1.07692,.90918,1.03297,.94959,.9245,.92274,.9245,.9245,1.02933,.77832,1.20562,.9245,.8916,.98986,.86621,.89453,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.16359,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.72346,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89249,.84118,.84118,.84118,.84118,.84118,.85284,.84557,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.9245,.9245,.9245,.9245,.9245,.9245,.84843,.83203,.85865,.85865,.85865,.85865,.82601,.82601,.82601,.82601,.94469,.9245,.92274,.92274,.92274,.92274,.92274,.90747,.86651,.9245,.9245,.9245,.9245,.89453,.9245,.89453,.8675,.9245,.8675,.9245,.8675,.9245,.72346,.83203,.72346,.83203,.72346,.83203,.72346,.83203,.85193,.8875,.86477,.99034,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.73206,.85865,.81105,.9245,.81105,.9245,.81105,.9245,1,1,.86275,.9245,.90872,.93591,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77896,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.9375,.98156,.93407,.77261,1.11429,.89249,.9245,1,1,.89249,.9245,.92534,.86698,.9245,.84118,.92274,.84118,.92274,.84118,.92274,.8667,.86291,.75186,1.02933,1,1,.75186,1.02933,.67789,.77832,.67789,.77832,.67789,.77832,.67789,.77832,1,1,.79776,.97655,.79776,1.23023,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.88844,.9245,.94309,.98986,.7306,.89453,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.9245,.76318,.84843,.84557,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67009,.96334,.93695,1.35191,1.40909,.95161,1.48387,.8675,.90861,.6192,.7363,.64824,.82411,.56321,.85696,1.23516,.8675,.81552,.7286,.84134,.73206,.76659,.86275,.84369,.90685,.77892,.85871,1.02638,.89249,.75828,.84118,.85984,.77452,.76466,.79776,.7306,.90782,.77818,.903,.87291,.90685,.7306,.99058,1.03667,.94635,1.23516,.9849,.99058,.92393,.8916,.942,1.03667,.75026,.94635,1.0297,1.23516,.90918,.94048,.98217,.89746,.84153,.92274,.82507,.88832,.84438,.88178,1.03525,.9849,1.00225,.78086,.97248,.89404,1.23516,.9849,.92274,.9849,.89404,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.89693,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.85865,1,1,1,1,1,1,1,1,1,1,1,1,.90933,1,1,1,1,1,1,.94309,.98986,.94309,.98986,.94309,.98986,.7306,.89453,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.68994,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.97858,.82616,.91133,.83437,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90572,1.81055,.90749,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85284,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.CalibriItalicMetrics={lineHeight:1.2207,lineGap:.2207};t.CalibriRegularFactors=[1.3877,1,1,1,1.17223,1.1293,.89552,.91133,.80395,1.02269,1.15601,.91056,.91056,1.2798,.85284,.89807,1,.90861,1.39016,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.91133,.96309,.96309,.85284,.85284,.85284,.83319,.88071,.8675,.81552,.73834,.85193,.73206,.7522,.81105,.86275,.90685,.6377,.77892,.75593,1.02638,.89385,.85122,.77452,.86503,.75186,.68887,.79776,.88844,.85066,.94258,.77818,.7306,.76659,1.10369,1.39016,1.10369,1.06139,.89552,.8739,.86128,.94469,.8457,.94469,.89464,1.09842,.84636,.94469,1.03297,1.07692,.90918,1.03297,.95897,.94469,.9482,.94469,.94469,1.04692,.78223,1.20562,.94469,.90332,.98986,.86621,.90527,.79004,.94152,1.77256,.94152,.85284,.97801,.89552,.91133,.89552,.91133,1.91729,.89552,1.17889,1.13254,1.08707,.92098,.85284,.68787,.71353,.84737,.90747,1.0088,1.0044,.87683,1,1.09091,1,.92229,.739,1.15642,.92098,.76288,.80504,.80972,.75859,.8675,.8675,.8675,.8675,.8675,.8675,.76318,.73834,.73206,.73206,.73206,.73206,.90685,.90685,.90685,.90685,.86477,.89385,.85122,.85122,.85122,.85122,.85122,.85284,.85311,.88844,.88844,.88844,.88844,.7306,.77452,.86331,.86128,.86128,.86128,.86128,.86128,.86128,.8693,.8457,.89464,.89464,.89464,.89464,.82601,.82601,.82601,.82601,.94469,.94469,.9482,.9482,.9482,.9482,.9482,.90747,.86651,.94469,.94469,.94469,.94469,.90527,.94469,.90527,.8675,.86128,.8675,.86128,.8675,.86128,.73834,.8457,.73834,.8457,.73834,.8457,.73834,.8457,.85193,.92454,.86477,.9921,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.73206,.89464,.81105,.84636,.81105,.84636,.81105,.84636,1,1,.86275,.94469,.90872,.95786,.90685,.82601,.90685,.82601,.90685,.82601,.90685,1.03297,.90685,.82601,.77741,1.05611,.6377,1.07692,1,1,.90918,.75593,1.03297,1,1,.76032,.90452,.98156,1.11842,.77261,1.11429,.89385,.94469,1,1,.89385,.94469,.95877,.86901,.94469,.85122,.9482,.85122,.9482,.85122,.9482,.8667,.90016,.75186,1.04692,1,1,.75186,1.04692,.68887,.78223,.68887,.78223,.68887,.78223,.68887,.78223,1,1,.79776,.92188,.79776,1.23023,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.88844,.94469,.94258,.98986,.7306,.90527,.7306,.76659,.79004,.76659,.79004,.76659,.79004,1.09231,.54873,.8675,.86128,.76318,.8693,.85311,.86651,1,1,.79776,1.20562,1.18622,1.18622,1,1.1437,.67742,.96334,.93695,1.35191,1.40909,.95161,1.48387,.86686,.90861,.62267,.74359,.65649,.85498,.56963,.88254,1.23516,.8675,.81552,.75443,.84503,.73206,.76659,.86275,.85122,.90685,.77892,.85746,1.02638,.89385,.75657,.85122,.86275,.77452,.74171,.79776,.7306,.95165,.77818,.89772,.88831,.90685,.7306,.98142,1.02191,.96576,1.23516,.99018,.98142,.9236,.89258,.94035,1.02191,.78848,.96576,.9561,1.23516,.90918,.92578,.95424,.89746,.83969,.9482,.80113,.89442,.85208,.86155,.98022,.99018,1.00452,.81209,.99247,.89181,1.23516,.99018,.9482,.99018,.89181,.73206,1,1,1,1,1,1,1,1,1,1,1,1,.88844,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89464,1,1,1,1,1,1,1,1,1,1,1,1,.96766,1,1,1,1,1,1,.94258,.98986,.94258,.98986,.94258,.98986,.7306,.90527,1,1,.89552,.90527,1,.90186,1.12308,1.12308,1.12308,1.12308,1.2566,1.2566,1.2566,.89552,.89552,1.42259,.69043,1.03809,1,1,1.0176,1.0176,1.11523,1.4956,2.01462,.99331,.82616,.91133,.84286,.91133,1,1,1,.70508,1,1.23108,.79801,.84426,.84426,.774,.90527,1.81055,.90527,1.81055,1.28809,1.55469,.94434,1.07806,1,.97094,.7589,.85284,.90747,1.19658,.69825,.97622,1.33512,.90747,.90747,.85356,.90747,.90747,1.44947,.85284,.8941,.8941,.70572,.8,.70572,.70572,.70572,.70572,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.99862,.99862,1,1,1,1,1,1.0336,.91027,1,1,1,.99862,1,1,1,1,1,1,1,1,1,1,1,1,1.05859,1.05859,1,1,1,1.07185,.99413,.96334,1.08065,1,1,1,1,1,1,1,1,1,1,1];t.CalibriRegularMetrics={lineHeight:1.2207,lineGap:.2207}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.HelveticaRegularMetrics=t.HelveticaRegularFactors=t.HelveticaItalicMetrics=t.HelveticaItalicFactors=t.HelveticaBoldMetrics=t.HelveticaBoldItalicMetrics=t.HelveticaBoldItalicFactors=t.HelveticaBoldFactors=void 0;t.HelveticaBoldFactors=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.03374,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.00042,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.03828,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00034,.99977,1,.99997,1.00026,1.00078,1.00036,.99973,1.00013,1.0006,.99977,.99977,.99988,.85148,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,1.00069,1.00022,.99977,1.00001,.99984,1.00026,1.00001,1.00024,1.00001,.9999,1,1.0006,1.00001,1.00041,.99962,1.00026,1.0006,.99995,1.00041,.99942,.99973,.99927,1.00082,.99902,1.00026,1.00087,1.0006,1.00069,.99973,.99867,.99973,.9993,1.00026,1.00049,1.00056,1,.99988,.99935,.99995,.99954,1.00055,.99945,1.00032,1.0006,.99995,1.00026,.99995,1.00032,1.00001,1.00008,.99971,1.00019,.9994,1.00001,1.0006,1.00044,.99973,1.00023,1.00047,1,.99942,.99561,.99989,1.00035,.99977,1.00035,.99977,1.00019,.99944,1.00001,1.00021,.99926,1.00035,1.00035,.99942,1.00048,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.99989,1.00057,1.00001,.99936,1.00052,1.00012,.99996,1.00043,1,1.00035,.9994,.99976,1.00035,.99973,1.00052,1.00041,1.00119,1.00037,.99973,1.00002,.99986,1.00041,1.00041,.99902,.9996,1.00034,.99999,1.00026,.99999,1.00026,.99973,1.00052,.99973,1,.99973,1.00041,1.00075,.9994,1.0003,.99999,1,1.00041,.99955,1,.99915,.99973,.99973,1.00026,1.00119,.99955,.99973,1.0006,.99911,1.0006,1.00026,.99972,1.00026,.99902,1.00041,.99973,.99999,1,1,1.00038,1.0005,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,1.00047,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaBoldMetrics={lineHeight:1.2,lineGap:.2};t.HelveticaBoldItalicFactors=[.76116,1,1,1.0006,.99998,.99974,.99973,.99973,.99982,.99977,1.00087,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99998,1,1.00003,1.00003,1.00003,1.00026,.9999,.99977,.99977,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,.99973,.99977,1.00026,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,.99998,1.0006,.99998,1.00003,.99973,.99998,.99973,1.00026,.99973,1.00026,.99973,.99998,1.00026,1.00026,1.0006,1.0006,.99973,1.0006,.99982,1.00026,1.00026,1.00026,1.00026,.99959,.99973,.99998,1.00026,.99973,1.00022,.99973,.99973,1,.99959,1.00077,.99959,1.00003,.99998,.99973,.99973,.99973,.99973,1.00077,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.99973,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,.99977,.99977,.99977,.99977,.99977,.99977,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,.99973,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.00026,1.06409,1.00026,1.00026,1.00026,1.00026,1.00026,.99973,1.00026,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,1.0044,.99977,1.00026,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,.99977,1.00026,.99977,1.00026,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99971,.99973,.99973,1.0006,.99977,.99973,.99973,1.00026,1.0006,1.00026,1.0006,1.00026,1.01011,1.00026,.99999,1.00026,1.0006,.99977,1.00026,.99977,1.00026,.99977,1.00026,.9993,.9998,1.00026,1.00022,1.00026,1.00022,1.00026,1.00022,1.00026,1,1.00016,.99977,.99959,.99977,.99959,.99977,.99959,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00026,.99998,1.00026,.8121,1.00026,.99998,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,.99977,1.00026,1.00016,1.00022,1.00001,.99973,1.00001,1.00026,1,1.00026,1,1.00026,1,1.0006,.99973,.99977,.99973,1,.99982,1.00022,1.00026,1.00001,.99973,1.00026,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99977,1,1,1.00026,.99969,.99972,.99981,.9998,1.0006,.99977,.99977,1.00022,.91155,1.00001,1.00026,.99977,1.00022,1.0006,.99977,1.00001,.99999,.99977,.99966,1.00022,1.00032,1.00001,.99944,1.00026,1.00001,.99968,1.00001,1.00047,1,1.0006,1.00001,.99981,1.00101,1.00026,1.0006,.99948,.99981,1.00064,.99973,.99942,1.00101,1.00061,1.00026,1.00069,1.0006,1.00014,.99973,1.01322,.99973,1.00065,1.00026,1.00012,.99923,1,1.00064,1.00076,.99948,1.00055,1.00063,1.00007,.99943,1.0006,.99948,1.00026,.99948,.99943,1.00001,1.00001,1.00029,1.00038,1.00035,1.00001,1.0006,1.0006,.99973,.99978,1.00001,1.00057,.99989,.99967,.99964,.99967,.99977,.99999,.99977,1.00038,.99977,1.00001,.99973,1.00066,.99967,.99967,1.00041,.99998,.99999,.99977,1.00022,.99967,1.00001,.99977,1.00026,.99964,1.00031,1.00001,.99999,.99999,1,1.00023,1,1,.99999,1.00035,1.00001,.99999,.99973,.99977,.99999,1.00058,.99973,.99973,.99955,.9995,1.00026,1.00026,1.00032,.99989,1.00034,.99999,1.00026,1.00026,1.00026,.99973,.45998,.99973,1.00026,.99973,1.00001,.99999,.99982,.99994,.99996,1,1.00042,1.00044,1.00029,1.00023,.99973,.99973,1.00026,.99949,1.00002,.99973,1.0006,1.0006,1.0006,.99975,1.00026,1.00026,1.00032,.98685,.99973,1.00026,1,1,.99966,1.00044,1.00016,1.00022,1.00016,1.00022,1.00016,1.00022,1.00001,.99973,1,1,.99973,1,1,.99955,1.0006,1.0006,1.0006,1.0006,1,1,1,.99973,.99973,.99972,1,1,1.00106,.99999,.99998,.99998,.99999,.99998,1.66475,1,.99973,.99973,1,.99973,.99971,.99978,1,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00098,1,1,1,1.00049,1,1,.99972,1,1.20985,1.39713,1.00003,1.00031,1.00015,1,.99561,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.99972,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaBoldItalicMetrics={lineHeight:1.35,lineGap:.2};t.HelveticaItalicFactors=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.0288,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,.99946,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.06311,.99973,1.00024,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,1.00041,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.89547,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,1.00001,1,1.00054,.99977,1.00084,1.00007,.99973,1.00013,.99924,1.00001,1.00001,.99945,.91221,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00001,.99999,.99977,.99933,1.00022,1.00054,1.00001,1.00065,1.00026,1.00001,1.0001,1.00001,1.00052,1,1.0006,1.00001,.99945,.99897,.99968,.99924,1.00036,.99945,.99949,1,1.0006,.99897,.99918,.99968,.99911,.99924,1,.99962,1.01487,1,1.0005,.99973,1.00012,1.00043,1,.99995,.99994,1.00036,.99947,1.00019,1.00063,1.00025,.99924,1.00036,.99973,1.00036,1.00025,1.00001,1.00001,1.00027,1.0001,1.00068,1.00001,1.0006,1.0006,1,1.00008,.99957,.99972,.9994,.99954,.99975,1.00051,1.00001,1.00019,1.00001,1.0001,.99986,1.00001,1.00001,1.00038,.99954,.99954,.9994,1.00066,.99999,.99977,1.00022,1.00054,1.00001,.99977,1.00026,.99975,1.0001,1.00001,.99993,.9995,.99955,1.00016,.99978,.99974,1.00019,1.00022,.99955,1.00053,.99973,1.00089,1.00005,.99967,1.00048,.99973,1.00002,1.00034,.99973,.99973,.99964,1.00006,1.00066,.99947,.99973,.98894,.99973,1,.44898,1,.99946,1,1.00039,1.00082,.99991,.99991,.99985,1.00022,1.00023,1.00061,1.00006,.99966,.99973,.99973,.99973,1.00019,1.0008,1,.99924,.99924,.99924,.99983,1.00044,.99973,.99964,.98332,1,.99973,1,1,.99962,.99895,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,1.00423,.99925,.99999,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1.00049,1,1.00245,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,1.00003,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,.99998,.99998,.99998,.99998,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaItalicMetrics={lineHeight:1.35,lineGap:.2};t.HelveticaRegularFactors=[.76116,1,1,1.0006,1.0006,1.00006,.99973,.99973,.99982,1.00001,1.00043,.99998,.99998,.99959,1.00003,1.0006,.99998,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.0006,1,1.00003,1.00003,1.00003,.99973,.99987,1.00001,1.00001,.99977,.99977,1.00001,1.00026,1.00022,.99977,1.0006,1,1.00001,.99973,.99999,.99977,1.00022,1.00001,1.00022,.99977,1.00001,1.00026,.99977,1.00001,1.00016,1.00001,1.00001,1.00026,1.0006,1.0006,1.0006,.99949,.99973,.99998,.99973,.99973,1,.99973,.99973,1.0006,.99973,.99973,.99924,.99924,1,.99924,.99999,.99973,.99973,.99973,.99973,.99998,1,1.0006,.99973,1,.99977,1,1,1,1.00005,1.0009,1.00005,1.00003,.99998,.99973,.99973,.99973,.99973,1.0009,.99973,.99998,1.00025,.99968,.99973,1.00003,1.00025,.60299,1.00024,1.06409,1,1,.99998,1,.9998,1.0006,.99998,1,.99936,.99973,1.00002,1.00002,1.00002,1.00026,1.00001,1.00001,1.00001,1.00001,1.00001,1.00001,1,.99977,1.00001,1.00001,1.00001,1.00001,1.0006,1.0006,1.0006,1.0006,.99977,.99977,1.00022,1.00022,1.00022,1.00022,1.00022,1.00003,1.00022,.99977,.99977,.99977,.99977,1.00001,1.00001,1.00026,.99973,.99973,.99973,.99973,.99973,.99973,.99982,1,.99973,.99973,.99973,.99973,1.0006,1.0006,1.0006,1.0006,.99973,.99973,.99973,.99973,.99973,.99973,.99973,1.06409,1.00026,.99973,.99973,.99973,.99973,1,.99973,1,1.00001,.99973,1.00001,.99973,1.00001,.99973,.99977,1,.99977,1,.99977,1,.99977,1,.99977,1.04596,.99977,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00001,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,.99977,.99973,.99977,.99973,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,1.0006,.99924,1.0006,1.0006,1.00019,1.00034,1,.99924,1.00001,1,1,.99973,.99924,.99973,.99924,.99973,1.02572,.99973,1.00005,.99973,.99924,.99977,.99973,.99977,.99973,.99977,.99973,.99999,.9998,.99973,1.00022,.99973,1.00022,.99973,1.00022,.99973,1,1.00016,.99977,.99998,.99977,.99998,.99977,.99998,1.00001,1,1.00001,1,1.00001,1,1.00001,1,1.00026,1.0006,1.00026,.84533,1.00026,1.0006,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,.99977,.99973,1.00016,.99977,1.00001,1,1.00001,1.00026,1,1.00026,1,1.00026,1,.99924,.99973,1.00001,.99973,1,.99982,1.00022,1.00026,1.00001,1,1.00026,1.0006,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99998,.99928,1,.99977,1.00013,1.00055,.99947,.99945,.99941,.99924,1.00001,1.00001,1.0004,.91621,1.00001,1.00026,.99977,1.00022,1.0006,1.00001,1.00005,.99999,.99977,1.00015,1.00022,.99977,1.00001,.99973,1.00026,1.00001,1.00019,1.00001,.99946,1,1.0006,1.00001,.99978,1.00045,.99973,.99924,1.00023,.99978,.99966,1,1.00065,1.00045,1.00019,.99973,.99973,.99924,1,1,.96499,1,1.00055,.99973,1.00008,1.00027,1,.9997,.99995,1.00023,.99933,1.00019,1.00015,1.00031,.99924,1.00023,.99973,1.00023,1.00031,1.00001,.99928,1.00029,1.00092,1.00035,1.00001,1.0006,1.0006,1,.99988,.99975,1,1.00082,.99561,.9996,1.00035,1.00001,.99962,1.00001,1.00092,.99964,1.00001,.99963,.99999,1.00035,1.00035,1.00082,.99962,.99999,.99977,1.00022,1.00035,1.00001,.99977,1.00026,.9996,.99967,1.00001,1.00034,1.00074,1.00054,1.00053,1.00063,.99971,.99962,1.00035,.99975,.99977,.99973,1.00043,.99953,1.0007,.99915,.99973,1.00008,.99892,1.00073,1.00073,1.00114,.99915,1.00073,.99955,.99973,1.00092,.99973,1,.99998,1,1.0003,1,1.00043,1.00001,.99969,1.0003,1,1.00035,1.00001,.9995,1,1.00092,.99973,.99973,.99973,1.0007,.9995,1,.99924,1.0006,.99924,.99972,1.00062,.99973,1.00114,1.00073,1,.99955,1,1,1.00047,.99968,1.00016,.99977,1.00016,.99977,1.00016,.99977,1.00001,1,1,1,.99973,1,1,.99955,.99924,.99924,.99924,.99924,.99998,.99998,.99998,.99973,.99973,.99972,1,1,1.00267,.99999,.99998,.99998,1,.99998,1.66475,1,.99973,.99973,1.00023,.99973,.99971,.99925,1.00023,1,.99991,.99984,1.00002,1.00002,1.00002,1.00002,1,1,1,1,1,1,1,.96329,1,1.20985,1.39713,1.00003,.8254,1.00015,1,1.00035,1.00027,1.00031,1.00031,.99915,1.00031,1.00031,.99999,1.00003,.99999,.99999,1.41144,1.6,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.41144,1.40579,1.40579,1.36625,.99999,1,.99861,.99861,1,1.00026,1.00026,1.00026,1.00026,.95317,.99999,.99999,.99999,.99999,1.40483,1,.99977,1.00054,1,1,.99953,.99962,1.00042,.9995,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.HelveticaRegularMetrics={lineHeight:1.2,lineGap:.2}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LiberationSansRegularWidths=t.LiberationSansRegularMapping=t.LiberationSansItalicWidths=t.LiberationSansItalicMapping=t.LiberationSansBoldWidths=t.LiberationSansBoldMapping=t.LiberationSansBoldItalicWidths=t.LiberationSansBoldItalicMapping=void 0;t.LiberationSansBoldWidths=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,719,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,785,556,556,278,722,556,556,611,278,611,278,611,385,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,465,722,333,853,906,474,825,927,838,278,722,722,601,719,667,611,722,778,278,722,667,833,722,644,778,722,667,600,611,667,821,667,809,802,278,667,615,451,611,278,582,615,610,556,606,475,460,611,541,278,558,556,612,556,445,611,766,619,520,684,446,582,715,576,753,845,278,582,611,582,845,667,669,885,567,711,667,278,276,556,1094,1062,875,610,722,622,719,722,719,722,567,712,667,904,626,719,719,610,702,833,722,778,719,667,722,611,622,854,667,730,703,1005,1019,870,979,719,711,1031,719,556,618,615,417,635,556,709,497,615,615,500,635,740,604,611,604,611,556,490,556,875,556,615,581,833,844,729,854,615,552,854,583,556,556,611,417,552,556,278,281,278,969,906,611,500,615,556,604,778,611,487,447,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1094,556,885,489,1115,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333];t.LiberationSansBoldMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansBoldItalicWidths=[365,0,333,278,333,474,556,556,889,722,238,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,333,333,584,584,584,611,975,722,722,722,722,667,611,778,722,278,556,722,611,833,722,778,667,778,722,667,611,722,667,944,667,667,611,333,278,333,584,556,333,556,611,556,611,556,333,611,611,278,278,556,278,889,611,611,611,611,389,556,333,611,556,778,556,556,500,389,280,389,584,333,556,556,556,556,280,556,333,737,370,556,584,737,552,400,549,333,333,333,576,556,278,333,333,365,556,834,834,834,611,722,722,722,722,722,722,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,556,556,556,556,556,278,278,278,278,611,611,611,611,611,611,611,549,611,611,611,611,611,556,611,556,722,556,722,556,722,556,722,556,722,556,722,556,722,556,722,740,722,611,667,556,667,556,667,556,667,556,667,556,778,611,778,611,778,611,778,611,722,611,722,611,278,278,278,278,278,278,278,278,278,278,782,556,556,278,722,556,556,611,278,611,278,611,396,611,479,611,278,722,611,722,611,722,611,708,723,611,778,611,778,611,778,611,1e3,944,722,389,722,389,722,389,667,556,667,556,667,556,667,556,611,333,611,479,611,333,722,611,722,611,722,611,722,611,722,611,722,611,944,778,667,556,667,611,500,611,500,611,500,278,556,722,556,1e3,889,778,611,667,556,611,333,333,333,333,333,333,333,333,333,333,333,333,722,333,854,906,473,844,930,847,278,722,722,610,671,667,611,722,778,278,722,667,833,722,657,778,718,667,590,611,667,822,667,829,781,278,667,620,479,611,278,591,620,621,556,610,479,492,611,558,278,566,556,603,556,450,611,712,605,532,664,409,591,704,578,773,834,278,591,611,591,834,667,667,886,614,719,667,278,278,556,1094,1042,854,622,719,677,719,722,708,722,614,722,667,927,643,719,719,615,687,833,722,778,719,667,722,611,677,781,667,729,708,979,989,854,1e3,708,719,1042,729,556,619,604,534,618,556,736,510,611,611,507,622,740,604,611,611,611,556,889,556,885,556,646,583,889,935,707,854,594,552,865,589,556,556,611,469,563,556,278,278,278,969,906,611,507,619,556,611,778,611,575,467,944,778,944,778,944,778,667,556,333,333,556,1e3,1e3,552,278,278,278,278,500,500,500,556,556,350,1e3,1e3,240,479,333,333,604,333,167,396,556,556,1104,556,885,516,1146,1e3,768,600,834,834,834,834,999,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,722,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,611,611,333,333,333,333,333,333,333,333,222,222,333,333,333,333,333,333,333,333];t.LiberationSansBoldItalicMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansItalicWidths=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,625,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,733,444,500,222,667,500,500,556,222,556,222,556,281,556,400,556,222,722,556,722,556,722,556,615,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,354,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,789,846,389,794,865,775,222,667,667,570,671,667,611,722,778,278,667,667,833,722,648,778,725,667,600,611,667,837,667,831,761,278,667,570,439,555,222,550,570,571,500,556,439,463,555,542,222,500,492,548,500,447,556,670,573,486,603,374,550,652,546,728,779,222,550,556,550,779,667,667,843,544,708,667,278,278,500,1066,982,844,589,715,639,724,667,651,667,544,704,667,917,614,715,715,589,686,833,722,778,725,667,722,611,639,795,667,727,673,920,923,805,886,651,694,1022,682,556,562,522,493,553,556,688,465,556,556,472,564,686,550,556,556,556,500,833,500,835,500,572,518,830,851,621,736,526,492,752,534,556,556,556,378,496,500,222,222,222,910,828,556,472,565,500,556,778,556,492,339,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1083,1e3,768,600,834,834,834,834,1e3,500,998,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,584,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285];t.LiberationSansItalicMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1];t.LiberationSansRegularWidths=[365,0,333,278,278,355,556,556,889,667,191,333,333,389,584,278,333,278,278,556,556,556,556,556,556,556,556,556,556,278,278,584,584,584,556,1015,667,667,722,722,667,611,778,722,278,500,667,556,833,722,778,667,778,722,667,611,722,667,944,667,667,611,278,278,278,469,556,333,556,556,500,556,556,278,556,556,222,222,500,222,833,556,556,556,556,333,500,278,556,500,722,500,500,500,334,260,334,584,333,556,556,556,556,260,556,333,737,370,556,584,737,552,400,549,333,333,333,576,537,278,333,333,365,556,834,834,834,611,667,667,667,667,667,667,1e3,722,667,667,667,667,278,278,278,278,722,722,778,778,778,778,778,584,778,722,722,722,722,667,667,611,556,556,556,556,556,556,889,500,556,556,556,556,278,278,278,278,556,556,556,556,556,556,556,549,611,556,556,556,556,500,556,500,667,556,667,556,667,556,722,500,722,500,722,500,722,500,722,615,722,556,667,556,667,556,667,556,667,556,667,556,778,556,778,556,778,556,778,556,722,556,722,556,278,278,278,278,278,278,278,222,278,278,735,444,500,222,667,500,500,556,222,556,222,556,292,556,334,556,222,722,556,722,556,722,556,604,723,556,778,556,778,556,778,556,1e3,944,722,333,722,333,722,333,667,500,667,500,667,500,667,500,611,278,611,375,611,278,722,556,722,556,722,556,722,556,722,556,722,556,944,722,667,500,667,611,500,611,500,611,500,222,556,667,556,1e3,889,778,611,667,500,611,278,333,333,333,333,333,333,333,333,333,333,333,667,278,784,838,384,774,855,752,222,667,667,551,668,667,611,722,778,278,667,668,833,722,650,778,722,667,618,611,667,798,667,835,748,278,667,578,446,556,222,547,578,575,500,557,446,441,556,556,222,500,500,576,500,448,556,690,569,482,617,395,547,648,525,713,781,222,547,556,547,781,667,667,865,542,719,667,278,278,500,1057,1010,854,583,722,635,719,667,656,667,542,677,667,923,604,719,719,583,656,833,722,778,719,667,722,611,635,760,667,740,667,917,938,792,885,656,719,1010,722,556,573,531,365,583,556,669,458,559,559,438,583,688,552,556,542,556,500,458,500,823,500,573,521,802,823,625,719,521,510,750,542,556,556,556,365,510,500,222,278,222,906,812,556,438,559,500,552,778,556,489,411,944,722,944,722,944,722,667,500,333,333,556,1e3,1e3,552,222,222,222,222,333,333,333,556,556,350,1e3,1e3,188,354,333,333,500,333,167,365,556,556,1094,556,885,323,1073,1e3,768,600,834,834,834,834,1e3,500,1e3,500,1e3,500,500,494,612,823,713,584,549,713,979,719,274,549,549,583,549,549,604,584,604,604,708,625,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,729,604,604,354,354,1e3,990,990,990,990,494,604,604,604,604,354,1021,1052,917,750,750,531,656,594,510,500,750,750,500,500,333,333,333,333,333,333,333,333,222,222,294,294,324,324,316,328,398,285];t.LiberationSansRegularMapping=[-1,-1,-1,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,161,162,163,164,165,166,167,168,169,170,171,172,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,402,506,507,508,509,510,511,536,537,538,539,710,711,713,728,729,730,731,732,733,900,901,902,903,904,905,906,908,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1138,1139,1168,1169,7808,7809,7810,7811,7812,7813,7922,7923,8208,8209,8211,8212,8213,8215,8216,8217,8218,8219,8220,8221,8222,8224,8225,8226,8230,8240,8242,8243,8249,8250,8252,8254,8260,8319,8355,8356,8359,8364,8453,8467,8470,8482,8486,8494,8539,8540,8541,8542,8592,8593,8594,8595,8596,8597,8616,8706,8710,8719,8721,8722,8730,8734,8735,8745,8747,8776,8800,8801,8804,8805,8962,8976,8992,8993,9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9600,9604,9608,9612,9616,9617,9618,9619,9632,9633,9642,9643,9644,9650,9658,9660,9668,9674,9675,9679,9688,9689,9702,9786,9787,9788,9792,9794,9824,9827,9829,9830,9834,9835,9836,61441,61442,61445,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.MyriadProRegularMetrics=t.MyriadProRegularFactors=t.MyriadProItalicMetrics=t.MyriadProItalicFactors=t.MyriadProBoldMetrics=t.MyriadProBoldItalicMetrics=t.MyriadProBoldItalicFactors=t.MyriadProBoldFactors=void 0;t.MyriadProBoldFactors=[1.36898,1,1,.72706,.80479,.83734,.98894,.99793,.9897,.93884,.86209,.94292,.94292,1.16661,1.02058,.93582,.96694,.93582,1.19137,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.99793,.78076,.78076,1.02058,1.02058,1.02058,.72851,.78966,.90838,.83637,.82391,.96376,.80061,.86275,.8768,.95407,1.0258,.73901,.85022,.83655,1.0156,.95546,.92179,.87107,.92179,.82114,.8096,.89713,.94438,.95353,.94083,.91905,.90406,.9446,.94292,1.18777,.94292,1.02058,.89903,.90088,.94938,.97898,.81093,.97571,.94938,1.024,.9577,.95933,.98621,1.0474,.97455,.98981,.9672,.95933,.9446,.97898,.97407,.97646,.78036,1.10208,.95442,.95298,.97579,.9332,.94039,.938,.80687,1.01149,.80687,1.02058,.80479,.99793,.99793,.99793,.99793,1.01149,1.00872,.90088,.91882,1.0213,.8361,1.02058,.62295,.54324,.89022,1.08595,1,1,.90088,1,.97455,.93582,.90088,1,1.05686,.8361,.99642,.99642,.99642,.72851,.90838,.90838,.90838,.90838,.90838,.90838,.868,.82391,.80061,.80061,.80061,.80061,1.0258,1.0258,1.0258,1.0258,.97484,.95546,.92179,.92179,.92179,.92179,.92179,1.02058,.92179,.94438,.94438,.94438,.94438,.90406,.86958,.98225,.94938,.94938,.94938,.94938,.94938,.94938,.9031,.81093,.94938,.94938,.94938,.94938,.98621,.98621,.98621,.98621,.93969,.95933,.9446,.9446,.9446,.9446,.9446,1.08595,.9446,.95442,.95442,.95442,.95442,.94039,.97898,.94039,.90838,.94938,.90838,.94938,.90838,.94938,.82391,.81093,.82391,.81093,.82391,.81093,.82391,.81093,.96376,.84313,.97484,.97571,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.80061,.94938,.8768,.9577,.8768,.9577,.8768,.9577,1,1,.95407,.95933,.97069,.95933,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,1.0258,.98621,.887,1.01591,.73901,1.0474,1,1,.97455,.83655,.98981,1,1,.83655,.73977,.83655,.73903,.84638,1.033,.95546,.95933,1,1,.95546,.95933,.8271,.95417,.95933,.92179,.9446,.92179,.9446,.92179,.9446,.936,.91964,.82114,.97646,1,1,.82114,.97646,.8096,.78036,.8096,.78036,1,1,.8096,.78036,1,1,.89713,.77452,.89713,1.10208,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94438,.95442,.94083,.97579,.90406,.94039,.90406,.9446,.938,.9446,.938,.9446,.938,1,.99793,.90838,.94938,.868,.9031,.92179,.9446,1,1,.89713,1.10208,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90989,.9358,.91945,.83181,.75261,.87992,.82976,.96034,.83689,.97268,1.0078,.90838,.83637,.8019,.90157,.80061,.9446,.95407,.92436,1.0258,.85022,.97153,1.0156,.95546,.89192,.92179,.92361,.87107,.96318,.89713,.93704,.95638,.91905,.91709,.92796,1.0258,.93704,.94836,1.0373,.95933,1.0078,.95871,.94836,.96174,.92601,.9498,.98607,.95776,.95933,1.05453,1.0078,.98275,.9314,.95617,.91701,1.05993,.9446,.78367,.9553,1,.86832,1.0128,.95871,.99394,.87548,.96361,.86774,1.0078,.95871,.9446,.95871,.86774,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.94083,.97579,.94083,.97579,.94083,.97579,.90406,.94039,.96694,1,.89903,1,1,1,.93582,.93582,.93582,1,.908,.908,.918,.94219,.94219,.96544,1,1.285,1,1,.81079,.81079,1,1,.74854,1,1,1,1,.99793,1,1,1,.65,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.17173,1,.80535,.76169,1.02058,1.0732,1.05486,1,1,1.30692,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.16161,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProBoldMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProBoldItalicFactors=[1.36898,1,1,.66227,.80779,.81625,.97276,.97276,.97733,.92222,.83266,.94292,.94292,1.16148,1.02058,.93582,.96694,.93582,1.17337,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.97276,.78076,.78076,1.02058,1.02058,1.02058,.71541,.76813,.85576,.80591,.80729,.94299,.77512,.83655,.86523,.92222,.98621,.71743,.81698,.79726,.98558,.92222,.90637,.83809,.90637,.80729,.76463,.86275,.90699,.91605,.9154,.85308,.85458,.90531,.94292,1.21296,.94292,1.02058,.89903,1.18616,.99613,.91677,.78216,.91677,.90083,.98796,.9135,.92168,.95381,.98981,.95298,.95381,.93459,.92168,.91513,.92004,.91677,.95077,.748,1.04502,.91677,.92061,.94236,.89544,.89364,.9,.80687,.8578,.80687,1.02058,.80779,.97276,.97276,.97276,.97276,.8578,.99973,1.18616,.91339,1.08074,.82891,1.02058,.55509,.71526,.89022,1.08595,1,1,1.18616,1,.96736,.93582,1.18616,1,1.04864,.82711,.99043,.99043,.99043,.71541,.85576,.85576,.85576,.85576,.85576,.85576,.845,.80729,.77512,.77512,.77512,.77512,.98621,.98621,.98621,.98621,.95961,.92222,.90637,.90637,.90637,.90637,.90637,1.02058,.90251,.90699,.90699,.90699,.90699,.85458,.83659,.94951,.99613,.99613,.99613,.99613,.99613,.99613,.85811,.78216,.90083,.90083,.90083,.90083,.95381,.95381,.95381,.95381,.9135,.92168,.91513,.91513,.91513,.91513,.91513,1.08595,.91677,.91677,.91677,.91677,.91677,.89364,.92332,.89364,.85576,.99613,.85576,.99613,.85576,.99613,.80729,.78216,.80729,.78216,.80729,.78216,.80729,.78216,.94299,.76783,.95961,.91677,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.77512,.90083,.86523,.9135,.86523,.9135,.86523,.9135,1,1,.92222,.92168,.92222,.92168,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.98621,.95381,.86036,.97096,.71743,.98981,1,1,.95298,.79726,.95381,1,1,.79726,.6894,.79726,.74321,.81691,1.0006,.92222,.92168,1,1,.92222,.92168,.79464,.92098,.92168,.90637,.91513,.90637,.91513,.90637,.91513,.909,.87514,.80729,.95077,1,1,.80729,.95077,.76463,.748,.76463,.748,1,1,.76463,.748,1,1,.86275,.72651,.86275,1.04502,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.90699,.91677,.9154,.94236,.85458,.89364,.85458,.90531,.9,.90531,.9,.90531,.9,1,.97276,.85576,.99613,.845,.85811,.90251,.91677,1,1,.86275,1.04502,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.18616,1.00899,1.30628,.85576,.80178,.66862,.7927,.69323,.88127,.72459,.89711,.95381,.85576,.80591,.7805,.94729,.77512,.90531,.92222,.90637,.98621,.81698,.92655,.98558,.92222,.85359,.90637,.90976,.83809,.94523,.86275,.83509,.93157,.85308,.83392,.92346,.98621,.83509,.92886,.91324,.92168,.95381,.90646,.92886,.90557,.86847,.90276,.91324,.86842,.92168,.99531,.95381,.9224,.85408,.92699,.86847,1.0051,.91513,.80487,.93481,1,.88159,1.05214,.90646,.97355,.81539,.89398,.85923,.95381,.90646,.91513,.90646,.85923,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9154,.94236,.9154,.94236,.9154,.94236,.85458,.89364,.96694,1,.89903,1,1,1,.91782,.91782,.91782,1,.896,.896,.896,.9332,.9332,.95973,1,1.26,1,1,.80479,.80178,1,1,.85633,1,1,1,1,.97276,1,1,1,.698,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.14542,1,.79199,.78694,1.02058,1.03493,1.05486,1,1,1.23026,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.20006,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProBoldItalicMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProItalicFactors=[1.36898,1,1,.65507,.84943,.85639,.88465,.88465,.86936,.88307,.86948,.85283,.85283,1.06383,1.02058,.75945,.9219,.75945,1.17337,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.88465,.75945,.75945,1.02058,1.02058,1.02058,.69046,.70926,.85158,.77812,.76852,.89591,.70466,.76125,.80094,.86822,.83864,.728,.77212,.79475,.93637,.87514,.8588,.76013,.8588,.72421,.69866,.77598,.85991,.80811,.87832,.78112,.77512,.8562,1.0222,1.18417,1.0222,1.27014,.89903,1.15012,.93859,.94399,.846,.94399,.81453,1.0186,.94219,.96017,1.03075,1.02175,.912,1.03075,.96998,.96017,.93859,.94399,.94399,.95493,.746,1.12658,.94578,.91,.979,.882,.882,.83,.85034,.83537,.85034,1.02058,.70869,.88465,.88465,.88465,.88465,.83537,.90083,1.15012,.9161,.94565,.73541,1.02058,.53609,.69353,.79519,1.08595,1,1,1.15012,1,.91974,.75945,1.15012,1,.9446,.73361,.9005,.9005,.9005,.62864,.85158,.85158,.85158,.85158,.85158,.85158,.773,.76852,.70466,.70466,.70466,.70466,.83864,.83864,.83864,.83864,.90561,.87514,.8588,.8588,.8588,.8588,.8588,1.02058,.85751,.85991,.85991,.85991,.85991,.77512,.76013,.88075,.93859,.93859,.93859,.93859,.93859,.93859,.8075,.846,.81453,.81453,.81453,.81453,.82424,.82424,.82424,.82424,.9278,.96017,.93859,.93859,.93859,.93859,.93859,1.08595,.8562,.94578,.94578,.94578,.94578,.882,.94578,.882,.85158,.93859,.85158,.93859,.85158,.93859,.76852,.846,.76852,.846,.76852,.846,.76852,.846,.89591,.8544,.90561,.94399,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.70466,.81453,.80094,.94219,.80094,.94219,.80094,.94219,1,1,.86822,.96017,.86822,.96017,.83864,.82424,.83864,.82424,.83864,.82424,.83864,1.03075,.83864,.82424,.81402,1.02738,.728,1.02175,1,1,.912,.79475,1.03075,1,1,.79475,.83911,.79475,.66266,.80553,1.06676,.87514,.96017,1,1,.87514,.96017,.86865,.87396,.96017,.8588,.93859,.8588,.93859,.8588,.93859,.867,.84759,.72421,.95493,1,1,.72421,.95493,.69866,.746,.69866,.746,1,1,.69866,.746,1,1,.77598,.88417,.77598,1.12658,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.85991,.94578,.87832,.979,.77512,.882,.77512,.8562,.83,.8562,.83,.8562,.83,1,.88465,.85158,.93859,.773,.8075,.85751,.8562,1,1,.77598,1.12658,1.15012,1.15012,1.15012,1.15012,1.15012,1.15313,1.15012,1.15012,1.15012,1.08106,1.03901,.85158,.77025,.62264,.7646,.65351,.86026,.69461,.89947,1.03075,.85158,.77812,.76449,.88836,.70466,.8562,.86822,.8588,.83864,.77212,.85308,.93637,.87514,.82352,.8588,.85701,.76013,.89058,.77598,.8156,.82565,.78112,.77899,.89386,.83864,.8156,.9486,.92388,.96186,1.03075,.91123,.9486,.93298,.878,.93942,.92388,.84596,.96186,.95119,1.03075,.922,.88787,.95829,.88,.93559,.93859,.78815,.93758,1,.89217,1.03737,.91123,.93969,.77487,.85769,.86799,1.03075,.91123,.93859,.91123,.86799,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87832,.979,.87832,.979,.87832,.979,.77512,.882,.9219,1,.89903,1,1,1,.87321,.87321,.87321,1,1.027,1.027,1.027,.86847,.86847,.79121,1,1.124,1,1,.73572,.73572,1,1,.85034,1,1,1,1,.88465,1,1,1,.669,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.04828,1,.74948,.75187,1.02058,.98391,1.02119,1,1,1.06233,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05233,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProItalicMetrics={lineHeight:1.2,lineGap:.2};t.MyriadProRegularFactors=[1.36898,1,1,.76305,.82784,.94935,.89364,.92241,.89073,.90706,.98472,.85283,.85283,1.0664,1.02058,.74505,.9219,.74505,1.23456,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.92241,.74505,.74505,1.02058,1.02058,1.02058,.73002,.72601,.91755,.8126,.80314,.92222,.73764,.79726,.83051,.90284,.86023,.74,.8126,.84869,.96518,.91115,.8858,.79761,.8858,.74498,.73914,.81363,.89591,.83659,.89633,.85608,.8111,.90531,1.0222,1.22736,1.0222,1.27014,.89903,.90088,.86667,1.0231,.896,1.01411,.90083,1.05099,1.00512,.99793,1.05326,1.09377,.938,1.06226,1.00119,.99793,.98714,1.0231,1.01231,.98196,.792,1.19137,.99074,.962,1.01915,.926,.942,.856,.85034,.92006,.85034,1.02058,.69067,.92241,.92241,.92241,.92241,.92006,.9332,.90088,.91882,.93484,.75339,1.02058,.56866,.54324,.79519,1.08595,1,1,.90088,1,.95325,.74505,.90088,1,.97198,.75339,.91009,.91009,.91009,.66466,.91755,.91755,.91755,.91755,.91755,.91755,.788,.80314,.73764,.73764,.73764,.73764,.86023,.86023,.86023,.86023,.92915,.91115,.8858,.8858,.8858,.8858,.8858,1.02058,.8858,.89591,.89591,.89591,.89591,.8111,.79611,.89713,.86667,.86667,.86667,.86667,.86667,.86667,.86936,.896,.90083,.90083,.90083,.90083,.84224,.84224,.84224,.84224,.97276,.99793,.98714,.98714,.98714,.98714,.98714,1.08595,.89876,.99074,.99074,.99074,.99074,.942,1.0231,.942,.91755,.86667,.91755,.86667,.91755,.86667,.80314,.896,.80314,.896,.80314,.896,.80314,.896,.92222,.93372,.92915,1.01411,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.73764,.90083,.83051,1.00512,.83051,1.00512,.83051,1.00512,1,1,.90284,.99793,.90976,.99793,.86023,.84224,.86023,.84224,.86023,.84224,.86023,1.05326,.86023,.84224,.82873,1.07469,.74,1.09377,1,1,.938,.84869,1.06226,1,1,.84869,.83704,.84869,.81441,.85588,1.08927,.91115,.99793,1,1,.91115,.99793,.91887,.90991,.99793,.8858,.98714,.8858,.98714,.8858,.98714,.894,.91434,.74498,.98196,1,1,.74498,.98196,.73914,.792,.73914,.792,1,1,.73914,.792,1,1,.81363,.904,.81363,1.19137,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89591,.99074,.89633,1.01915,.8111,.942,.8111,.90531,.856,.90531,.856,.90531,.856,1,.92241,.91755,.86667,.788,.86936,.8858,.89876,1,1,.81363,1.19137,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90088,.90388,1.03901,.92138,.78105,.7154,.86169,.80513,.94007,.82528,.98612,1.06226,.91755,.8126,.81884,.92819,.73764,.90531,.90284,.8858,.86023,.8126,.91172,.96518,.91115,.83089,.8858,.87791,.79761,.89297,.81363,.88157,.89992,.85608,.81992,.94307,.86023,.88157,.95308,.98699,.99793,1.06226,.95817,.95308,.97358,.928,.98088,.98699,.92761,.99793,.96017,1.06226,.986,.944,.95978,.938,.96705,.98714,.80442,.98972,1,.89762,1.04552,.95817,.99007,.87064,.91879,.88888,1.06226,.95817,.98714,.95817,.88888,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.89633,1.01915,.89633,1.01915,.89633,1.01915,.8111,.942,.9219,1,.89903,1,1,1,.93173,.93173,.93173,1,1.06304,1.06304,1.06904,.89903,.89903,.80549,1,1.156,1,1,.76575,.76575,1,1,.72458,1,1,1,1,.92241,1,1,1,.619,1,1.36145,1,1,1,1,1,1,1,1,1,1,1,1.07257,1,.74705,.71119,1.02058,1.024,1.02119,1,1,1.1536,1.08595,1.08595,1,1.08595,1.08595,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.05638,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.MyriadProRegularMetrics={lineHeight:1.2,lineGap:.2}},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SegoeuiRegularMetrics=t.SegoeuiRegularFactors=t.SegoeuiItalicMetrics=t.SegoeuiItalicFactors=t.SegoeuiBoldMetrics=t.SegoeuiBoldItalicMetrics=t.SegoeuiBoldItalicFactors=t.SegoeuiBoldFactors=void 0;t.SegoeuiBoldFactors=[1.76738,1,1,.99297,.9824,1.04016,1.06497,1.03424,.97529,1.17647,1.23203,1.1085,1.1085,1.16939,1.2107,.9754,1.21408,.9754,1.59578,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,1.03424,.81378,.81378,1.2107,1.2107,1.2107,.71703,.97847,.97363,.88776,.8641,1.02096,.79795,.85132,.914,1.06085,1.1406,.8007,.89858,.83693,1.14889,1.09398,.97489,.92094,.97489,.90399,.84041,.95923,1.00135,1,1.06467,.98243,.90996,.99361,1.1085,1.56942,1.1085,1.2107,.74627,.94282,.96752,1.01519,.86304,1.01359,.97278,1.15103,1.01359,.98561,1.02285,1.02285,1.00527,1.02285,1.0302,.99041,1.0008,1.01519,1.01359,1.02258,.79104,1.16862,.99041,.97454,1.02511,.99298,.96752,.95801,.94856,1.16579,.94856,1.2107,.9824,1.03424,1.03424,1,1.03424,1.16579,.8727,1.3871,1.18622,1.10818,1.04478,1.2107,1.18622,.75155,.94994,1.28826,1.21408,1.21408,.91056,1,.91572,.9754,.64663,1.18328,1.24866,1.04478,1.14169,1.15749,1.17389,.71703,.97363,.97363,.97363,.97363,.97363,.97363,.93506,.8641,.79795,.79795,.79795,.79795,1.1406,1.1406,1.1406,1.1406,1.02096,1.09398,.97426,.97426,.97426,.97426,.97426,1.2107,.97489,1.00135,1.00135,1.00135,1.00135,.90996,.92094,1.02798,.96752,.96752,.96752,.96752,.96752,.96752,.93136,.86304,.97278,.97278,.97278,.97278,1.02285,1.02285,1.02285,1.02285,.97122,.99041,1,1,1,1,1,1.28826,1.0008,.99041,.99041,.99041,.99041,.96752,1.01519,.96752,.97363,.96752,.97363,.96752,.97363,.96752,.8641,.86304,.8641,.86304,.8641,.86304,.8641,.86304,1.02096,1.03057,1.02096,1.03517,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.79795,.97278,.914,1.01359,.914,1.01359,.914,1.01359,1,1,1.06085,.98561,1.06085,1.00879,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,1.1406,1.02285,.97138,1.08692,.8007,1.02285,1,1,1.00527,.83693,1.02285,1,1,.83693,.9455,.83693,.90418,.83693,1.13005,1.09398,.99041,1,1,1.09398,.99041,.96692,1.09251,.99041,.97489,1.0008,.97489,1.0008,.97489,1.0008,.93994,.97931,.90399,1.02258,1,1,.90399,1.02258,.84041,.79104,.84041,.79104,.84041,.79104,.84041,.79104,1,1,.95923,1.07034,.95923,1.16862,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.00135,.99041,1.06467,1.02511,.90996,.96752,.90996,.99361,.95801,.99361,.95801,.99361,.95801,1.07733,1.03424,.97363,.96752,.93506,.93136,.97489,1.0008,1,1,.95923,1.16862,1.15103,1.15103,1.01173,1.03959,.75953,.81378,.79912,1.15103,1.21994,.95161,.87815,1.01149,.81525,.7676,.98167,1.01134,1.02546,.84097,1.03089,1.18102,.97363,.88776,.85134,.97826,.79795,.99361,1.06085,.97489,1.1406,.89858,1.0388,1.14889,1.09398,.86039,.97489,1.0595,.92094,.94793,.95923,.90996,.99346,.98243,1.02112,.95493,1.1406,.90996,1.03574,1.02597,1.0008,1.18102,1.06628,1.03574,1.0192,1.01932,1.00886,.97531,1.0106,1.0008,1.13189,1.18102,1.02277,.98683,1.0016,.99561,1.07237,1.0008,.90434,.99921,.93803,.8965,1.23085,1.06628,1.04983,.96268,1.0499,.98439,1.18102,1.06628,1.0008,1.06628,.98439,.79795,1,1,1,1,1,1,1,1,1,1,1,1,1.09466,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.97278,1,1,1,1,1,1,1,1,1,1,1,1,1.02065,1,1,1,1,1,1,1.06467,1.02511,1.06467,1.02511,1.06467,1.02511,.90996,.96752,1,1.21408,.89903,1,1,.75155,1.04394,1.04394,1.04394,1.04394,.98633,.98633,.98633,.73047,.73047,1.20642,.91211,1.25635,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.12454,.93503,1.03424,1.19687,1.03424,1,1,1,.771,1,1,1.15749,1.15749,1.15749,1.10948,.86279,.94434,.86279,.94434,.86182,1,1,1.16897,1,.96085,.90137,1.2107,1.18416,1.13973,.69825,.9716,2.10339,1.29004,1.29004,1.21172,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18874,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.09193,1.09193,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiBoldMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiBoldItalicFactors=[1.76738,1,1,.98946,1.03959,1.04016,1.02809,1.036,.97639,1.10953,1.23203,1.11144,1.11144,1.16939,1.21237,.9754,1.21261,.9754,1.59754,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,1.036,.81378,.81378,1.21237,1.21237,1.21237,.73541,.97847,.97363,.89723,.87897,1.0426,.79429,.85292,.91149,1.05815,1.1406,.79631,.90128,.83853,1.04396,1.10615,.97552,.94436,.97552,.88641,.80527,.96083,1.00135,1,1.06777,.9817,.91142,.99361,1.11144,1.57293,1.11144,1.21237,.74627,1.31818,1.06585,.97042,.83055,.97042,.93503,1.1261,.97042,.97922,1.14236,.94552,1.01054,1.14236,1.02471,.97922,.94165,.97042,.97042,1.0276,.78929,1.1261,.97922,.95874,1.02197,.98507,.96752,.97168,.95107,1.16579,.95107,1.21237,1.03959,1.036,1.036,1,1.036,1.16579,.87357,1.31818,1.18754,1.26781,1.05356,1.21237,1.18622,.79487,.94994,1.29004,1.24047,1.24047,1.31818,1,.91484,.9754,1.31818,1.1349,1.24866,1.05356,1.13934,1.15574,1.17389,.73541,.97363,.97363,.97363,.97363,.97363,.97363,.94385,.87897,.79429,.79429,.79429,.79429,1.1406,1.1406,1.1406,1.1406,1.0426,1.10615,.97552,.97552,.97552,.97552,.97552,1.21237,.97552,1.00135,1.00135,1.00135,1.00135,.91142,.94436,.98721,1.06585,1.06585,1.06585,1.06585,1.06585,1.06585,.96705,.83055,.93503,.93503,.93503,.93503,1.14236,1.14236,1.14236,1.14236,.93125,.97922,.94165,.94165,.94165,.94165,.94165,1.29004,.94165,.97922,.97922,.97922,.97922,.96752,.97042,.96752,.97363,1.06585,.97363,1.06585,.97363,1.06585,.87897,.83055,.87897,.83055,.87897,.83055,.87897,.83055,1.0426,1.0033,1.0426,.97042,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.79429,.93503,.91149,.97042,.91149,.97042,.91149,.97042,1,1,1.05815,.97922,1.05815,.97922,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,1.1406,1.14236,.97441,1.04302,.79631,1.01582,1,1,1.01054,.83853,1.14236,1,1,.83853,1.09125,.83853,.90418,.83853,1.19508,1.10615,.97922,1,1,1.10615,.97922,1.01034,1.10466,.97922,.97552,.94165,.97552,.94165,.97552,.94165,.91602,.91981,.88641,1.0276,1,1,.88641,1.0276,.80527,.78929,.80527,.78929,.80527,.78929,.80527,.78929,1,1,.96083,1.05403,.95923,1.16862,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.00135,.97922,1.06777,1.02197,.91142,.96752,.91142,.99361,.97168,.99361,.97168,.99361,.97168,1.23199,1.036,.97363,1.06585,.94385,.96705,.97552,.94165,1,1,.96083,1.1261,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,1.31818,.95161,1.27126,1.00811,.83284,.77702,.99137,.95253,1.0347,.86142,1.07205,1.14236,.97363,.89723,.86869,1.09818,.79429,.99361,1.05815,.97552,1.1406,.90128,1.06662,1.04396,1.10615,.84918,.97552,1.04694,.94436,.98015,.96083,.91142,1.00356,.9817,1.01945,.98999,1.1406,.91142,1.04961,.9898,1.00639,1.14236,1.07514,1.04961,.99607,1.02897,1.008,.9898,.95134,1.00639,1.11121,1.14236,1.00518,.97981,1.02186,1,1.08578,.94165,.99314,.98387,.93028,.93377,1.35125,1.07514,1.10687,.93491,1.04232,1.00351,1.14236,1.07514,.94165,1.07514,1.00351,.79429,1,1,1,1,1,1,1,1,1,1,1,1,1.09097,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.93503,1,1,1,1,1,1,1,1,1,1,1,1,.96609,1,1,1,1,1,1,1.06777,1.02197,1.06777,1.02197,1.06777,1.02197,.91142,.96752,1,1.21261,.89903,1,1,.75155,1.04745,1.04745,1.04745,1.04394,.98633,.98633,.98633,.72959,.72959,1.20502,.91406,1.26514,1.222,1.02956,1.03372,1.03372,.96039,1.24633,1,1.09125,.93327,1.03336,1.16541,1.036,1,1,1,.771,1,1,1.15574,1.15574,1.15574,1.15574,.86364,.94434,.86279,.94434,.86224,1,1,1.16798,1,.96085,.90068,1.21237,1.18416,1.13904,.69825,.9716,2.10339,1.29004,1.29004,1.21339,1.29004,1.29004,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18775,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.13269,1.13269,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiBoldItalicMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiItalicFactors=[1.76738,1,1,.98946,1.14763,1.05365,1.06234,.96927,.92586,1.15373,1.18414,.91349,.91349,1.07403,1.17308,.78383,1.20088,.78383,1.42531,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78383,.78383,1.17308,1.17308,1.17308,.77349,.94565,.94729,.85944,.88506,.9858,.74817,.80016,.88449,.98039,.95782,.69238,.89898,.83231,.98183,1.03989,.96924,.86237,.96924,.80595,.74524,.86091,.95402,.94143,.98448,.8858,.83089,.93285,1.0949,1.39016,1.0949,1.45994,.74627,1.04839,.97454,.97454,.87207,.97454,.87533,1.06151,.97454,1.00176,1.16484,1.08132,.98047,1.16484,1.02989,1.01054,.96225,.97454,.97454,1.06598,.79004,1.16344,1.00351,.94629,.9973,.91016,.96777,.9043,.91082,.92481,.91082,1.17308,.95748,.96927,.96927,1,.96927,.92481,.80597,1.04839,1.23393,1.1781,.9245,1.17308,1.20808,.63218,.94261,1.24822,1.09971,1.09971,1.04839,1,.85273,.78032,1.04839,1.09971,1.22326,.9245,1.09836,1.13525,1.15222,.70424,.94729,.94729,.94729,.94729,.94729,.94729,.85498,.88506,.74817,.74817,.74817,.74817,.95782,.95782,.95782,.95782,.9858,1.03989,.96924,.96924,.96924,.96924,.96924,1.17308,.96924,.95402,.95402,.95402,.95402,.83089,.86237,.88409,.97454,.97454,.97454,.97454,.97454,.97454,.92916,.87207,.87533,.87533,.87533,.87533,.93146,.93146,.93146,.93146,.93854,1.01054,.96225,.96225,.96225,.96225,.96225,1.24822,.8761,1.00351,1.00351,1.00351,1.00351,.96777,.97454,.96777,.94729,.97454,.94729,.97454,.94729,.97454,.88506,.87207,.88506,.87207,.88506,.87207,.88506,.87207,.9858,.95391,.9858,.97454,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.74817,.87533,.88449,.97454,.88449,.97454,.88449,.97454,1,1,.98039,1.00176,.98039,1.00176,.95782,.93146,.95782,.93146,.95782,.93146,.95782,1.16484,.95782,.93146,.84421,1.12761,.69238,1.08132,1,1,.98047,.83231,1.16484,1,1,.84723,1.04861,.84723,.78755,.83231,1.23736,1.03989,1.01054,1,1,1.03989,1.01054,.9857,1.03849,1.01054,.96924,.96225,.96924,.96225,.96924,.96225,.92383,.90171,.80595,1.06598,1,1,.80595,1.06598,.74524,.79004,.74524,.79004,.74524,.79004,.74524,.79004,1,1,.86091,1.02759,.85771,1.16344,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.95402,1.00351,.98448,.9973,.83089,.96777,.83089,.93285,.9043,.93285,.9043,.93285,.9043,1.31868,.96927,.94729,.97454,.85498,.92916,.96924,.8761,1,1,.86091,1.16344,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,1.04839,.81965,.81965,.94729,.78032,.71022,.90883,.84171,.99877,.77596,1.05734,1.2,.94729,.85944,.82791,.9607,.74817,.93285,.98039,.96924,.95782,.89898,.98316,.98183,1.03989,.78614,.96924,.97642,.86237,.86075,.86091,.83089,.90082,.8858,.97296,1.01284,.95782,.83089,1.0976,1.04,1.03342,1.2,1.0675,1.0976,.98205,1.03809,1.05097,1.04,.95364,1.03342,1.05401,1.2,1.02148,1.0119,1.04724,1.0127,1.02732,.96225,.8965,.97783,.93574,.94818,1.30679,1.0675,1.11826,.99821,1.0557,1.0326,1.2,1.0675,.96225,1.0675,1.0326,.74817,1,1,1,1,1,1,1,1,1,1,1,1,1.03754,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.87533,1,1,1,1,1,1,1,1,1,1,1,1,.98705,1,1,1,1,1,1,.98448,.9973,.98448,.9973,.98448,.9973,.83089,.96777,1,1.20088,.89903,1,1,.75155,.94945,.94945,.94945,.94945,1.12317,1.12317,1.12317,.67603,.67603,1.15621,.73584,1.21191,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87709,.96927,1.01473,.96927,1,1,1,.77295,1,1,1.09836,1.09836,1.09836,1.01522,.86321,.94434,.8649,.94434,.86182,1,1,1.083,1,.91578,.86438,1.17308,1.18416,1.14589,.69825,.97622,1.96791,1.24822,1.24822,1.17308,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.17984,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10742,1.10742,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiItalicMetrics={lineHeight:1.33008,lineGap:0};t.SegoeuiRegularFactors=[1.76738,1,1,.98594,1.02285,1.10454,1.06234,.96927,.92037,1.19985,1.2046,.90616,.90616,1.07152,1.1714,.78032,1.20088,.78032,1.40246,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.96927,.78032,.78032,1.1714,1.1714,1.1714,.80597,.94084,.96706,.85944,.85734,.97093,.75842,.79936,.88198,.9831,.95782,.71387,.86969,.84636,1.07796,1.03584,.96924,.83968,.96924,.82826,.79649,.85771,.95132,.93119,.98965,.88433,.8287,.93365,1.08612,1.3638,1.08612,1.45786,.74627,.80499,.91484,1.05707,.92383,1.05882,.9403,1.12654,1.05882,1.01756,1.09011,1.09011,.99414,1.09011,1.034,1.01756,1.05356,1.05707,1.05882,1.04399,.84863,1.21968,1.01756,.95801,1.00068,.91797,.96777,.9043,.90351,.92105,.90351,1.1714,.85337,.96927,.96927,.99912,.96927,.92105,.80597,1.2434,1.20808,1.05937,.90957,1.1714,1.20808,.75155,.94261,1.24644,1.09971,1.09971,.84751,1,.85273,.78032,.61584,1.05425,1.17914,.90957,1.08665,1.11593,1.14169,.73381,.96706,.96706,.96706,.96706,.96706,.96706,.86035,.85734,.75842,.75842,.75842,.75842,.95782,.95782,.95782,.95782,.97093,1.03584,.96924,.96924,.96924,.96924,.96924,1.1714,.96924,.95132,.95132,.95132,.95132,.8287,.83968,.89049,.91484,.91484,.91484,.91484,.91484,.91484,.93575,.92383,.9403,.9403,.9403,.9403,.8717,.8717,.8717,.8717,1.00527,1.01756,1.05356,1.05356,1.05356,1.05356,1.05356,1.24644,.95923,1.01756,1.01756,1.01756,1.01756,.96777,1.05707,.96777,.96706,.91484,.96706,.91484,.96706,.91484,.85734,.92383,.85734,.92383,.85734,.92383,.85734,.92383,.97093,1.0969,.97093,1.05882,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.75842,.9403,.88198,1.05882,.88198,1.05882,.88198,1.05882,1,1,.9831,1.01756,.9831,1.01756,.95782,.8717,.95782,.8717,.95782,.8717,.95782,1.09011,.95782,.8717,.84784,1.11551,.71387,1.09011,1,1,.99414,.84636,1.09011,1,1,.84636,1.0536,.84636,.94298,.84636,1.23297,1.03584,1.01756,1,1,1.03584,1.01756,1.00323,1.03444,1.01756,.96924,1.05356,.96924,1.05356,.96924,1.05356,.93066,.98293,.82826,1.04399,1,1,.82826,1.04399,.79649,.84863,.79649,.84863,.79649,.84863,.79649,.84863,1,1,.85771,1.17318,.85771,1.21968,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.95132,1.01756,.98965,1.00068,.8287,.96777,.8287,.93365,.9043,.93365,.9043,.93365,.9043,1.08571,.96927,.96706,.91484,.86035,.93575,.96924,.95923,1,1,.85771,1.21968,1.11437,1.11437,.93109,.91202,.60411,.84164,.55572,1.01173,.97361,.81818,.81818,.96635,.78032,.72727,.92366,.98601,1.03405,.77968,1.09799,1.2,.96706,.85944,.85638,.96491,.75842,.93365,.9831,.96924,.95782,.86969,.94152,1.07796,1.03584,.78437,.96924,.98715,.83968,.83491,.85771,.8287,.94492,.88433,.9287,1.0098,.95782,.8287,1.0625,.98248,1.03424,1.2,1.01071,1.0625,.95246,1.03809,1.04912,.98248,1.00221,1.03424,1.05443,1.2,1.04785,.99609,1.00169,1.05176,.99346,1.05356,.9087,1.03004,.95542,.93117,1.23362,1.01071,1.07831,1.02512,1.05205,1.03502,1.2,1.01071,1.05356,1.01071,1.03502,.75842,1,1,1,1,1,1,1,1,1,1,1,1,1.03719,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,.9403,1,1,1,1,1,1,1,1,1,1,1,1,1.04021,1,1,1,1,1,1,.98965,1.00068,.98965,1.00068,.98965,1.00068,.8287,.96777,1,1.20088,.89903,1,1,.75155,1.03077,1.03077,1.03077,1.03077,1.13196,1.13196,1.13196,.67428,.67428,1.16039,.73291,1.20996,1.22135,1.06483,.94868,.94868,.95996,1.24633,1,1.07497,.87796,.96927,1.01518,.96927,1,1,1,.77295,1,1,1.10539,1.10539,1.11358,1.06967,.86279,.94434,.86279,.94434,.86182,1,1,1.083,1,.91578,.86507,1.1714,1.18416,1.14589,.69825,.97622,1.9697,1.24822,1.24822,1.17238,1.24822,1.24822,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1.42603,1,.99862,.99862,1,.87025,.87025,.87025,.87025,1.18083,1.42603,1,1.42603,1.42603,.99862,1,1,1,1,1,1.2886,1.04315,1.15296,1.34163,1,1,1,1.10938,1.10938,1,1,1,1.05425,1.09971,1.09971,1.09971,1,1,1,1,1,1,1,1,1,1,1];t.SegoeuiRegularMetrics={lineHeight:1.33008,lineGap:0}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptEvaluator=t.PostScriptCompiler=t.PDFFunctionFactory=void 0;t.isPDFFunction=function isPDFFunction(e){let t;if("object"!=typeof e)return!1;if(e instanceof r.Dict)t=e;else{if(!(e instanceof s.BaseStream))return!1;t=e.dict}return t.has("FunctionType")};var r=a(5),n=a(2),i=a(58),s=a(7),o=a(59);t.PDFFunctionFactory=class PDFFunctionFactory{constructor({xref:e,isEvalSupported:t=!0}){this.xref=e;this.isEvalSupported=!1!==t}create(e){const t=this.getCached(e);if(t)return t;const a=PDFFunction.parse({xref:this.xref,isEvalSupported:this.isEvalSupported,fn:e instanceof r.Ref?this.xref.fetch(e):e});this._cache(e,a);return a}createFromArray(e){const t=this.getCached(e);if(t)return t;const a=PDFFunction.parseArray({xref:this.xref,isEvalSupported:this.isEvalSupported,fnObj:e instanceof r.Ref?this.xref.fetch(e):e});this._cache(e,a);return a}getCached(e){let t;e instanceof r.Ref?t=e:e instanceof r.Dict?t=e.objId:e instanceof s.BaseStream&&(t=e.dict&&e.dict.objId);if(t){const e=this._localFunctionCache.getByRef(t);if(e)return e}return null}_cache(e,t){if(!t)throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.');let a;e instanceof r.Ref?a=e:e instanceof r.Dict?a=e.objId:e instanceof s.BaseStream&&(a=e.dict&&e.dict.objId);a&&this._localFunctionCache.set(null,a,t)}get _localFunctionCache(){return(0,n.shadow)(this,"_localFunctionCache",new o.LocalFunctionCache)}};function toNumberArray(e){if(!Array.isArray(e))return null;const t=e.length;for(let a=0;a>c)*h;l&=(1<a?e=a:e0&&(d=o[u-1]);let f=r[1];u>1,u=s.length>>1,d=new PostScriptEvaluator(l),f=Object.create(null);let g=8192;const p=new Float32Array(u);return function constructPostScriptFn(e,t,a,r){let n,i,s="";const c=p;for(n=0;ne&&(i=e)}m[n]=i}if(g>0){g--;f[s]=m}a.set(m,r)}}}class PostScriptStack{static get MAX_STACK_SIZE(){return(0,n.shadow)(this,"MAX_STACK_SIZE",100)}constructor(e){this.stack=e?Array.prototype.slice.call(e,0):[]}push(e){if(this.stack.length>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");this.stack.push(e)}pop(){if(this.stack.length<=0)throw new Error("PostScript function stack underflow.");return this.stack.pop()}copy(e){if(this.stack.length+e>=PostScriptStack.MAX_STACK_SIZE)throw new Error("PostScript function stack overflow.");const t=this.stack;for(let a=t.length-e,r=e-1;r>=0;r--,a++)t.push(t[a])}index(e){this.push(this.stack[this.stack.length-e-1])}roll(e,t){const a=this.stack,r=a.length-e,n=a.length-1,i=r+(t-Math.floor(t/e)*e);for(let e=r,t=n;e0?t.push(o<>c);break;case"ceiling":o=t.pop();t.push(Math.ceil(o));break;case"copy":o=t.pop();t.copy(o);break;case"cos":o=t.pop();t.push(Math.cos(o));break;case"cvi":o=0|t.pop();t.push(o);break;case"cvr":break;case"div":c=t.pop();o=t.pop();t.push(o/c);break;case"dup":t.copy(1);break;case"eq":c=t.pop();o=t.pop();t.push(o===c);break;case"exch":t.roll(2,1);break;case"exp":c=t.pop();o=t.pop();t.push(o**c);break;case"false":t.push(!1);break;case"floor":o=t.pop();t.push(Math.floor(o));break;case"ge":c=t.pop();o=t.pop();t.push(o>=c);break;case"gt":c=t.pop();o=t.pop();t.push(o>c);break;case"idiv":c=t.pop();o=t.pop();t.push(o/c|0);break;case"index":o=t.pop();t.index(o);break;case"le":c=t.pop();o=t.pop();t.push(o<=c);break;case"ln":o=t.pop();t.push(Math.log(o));break;case"log":o=t.pop();t.push(Math.log(o)/Math.LN10);break;case"lt":c=t.pop();o=t.pop();t.push(o=t?new AstLiteral(t):e.max<=t?e:new AstMin(e,t)}class PostScriptCompiler{compile(e,t,a){const r=[],n=[],i=t.length>>1,s=a.length>>1;let o,c,l,h,u,d,f,g,p=0;for(let e=0;et.min){o.unshift("Math.max(",i,", ");o.push(")")}if(s{Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptParser=t.PostScriptLexer=void 0;var r=a(2),n=a(5),i=a(6);t.PostScriptParser=class PostScriptParser{constructor(e){this.lexer=e;this.operators=[];this.token=null;this.prev=null}nextToken(){this.prev=this.token;this.token=this.lexer.getToken()}accept(e){if(this.token.type===e){this.nextToken();return!0}return!1}expect(e){if(this.accept(e))return!0;throw new r.FormatError(`Unexpected symbol: found ${this.token.type} expected ${e}.`)}parse(){this.nextToken();this.expect(s.LBRACE);this.parseBlock();this.expect(s.RBRACE);return this.operators}parseBlock(){for(;;)if(this.accept(s.NUMBER))this.operators.push(this.prev.value);else if(this.accept(s.OPERATOR))this.operators.push(this.prev.value);else{if(!this.accept(s.LBRACE))return;this.parseCondition()}}parseCondition(){const e=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(s.RBRACE);if(this.accept(s.IF)){this.operators[e]=this.operators.length;this.operators[e+1]="jz"}else{if(!this.accept(s.LBRACE))throw new r.FormatError("PS Function: error parsing conditional.");{const t=this.operators.length;this.operators.push(null,null);const a=this.operators.length;this.parseBlock();this.expect(s.RBRACE);this.expect(s.IFELSE);this.operators[t]=this.operators.length;this.operators[t+1]="j";this.operators[e]=a;this.operators[e+1]="jz"}}}};const s={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5};class PostScriptToken{static get opCache(){return(0,r.shadow)(this,"opCache",Object.create(null))}constructor(e,t){this.type=e;this.value=t}static getOperator(e){const t=PostScriptToken.opCache[e];return t||(PostScriptToken.opCache[e]=new PostScriptToken(s.OPERATOR,e))}static get LBRACE(){return(0,r.shadow)(this,"LBRACE",new PostScriptToken(s.LBRACE,"{"))}static get RBRACE(){return(0,r.shadow)(this,"RBRACE",new PostScriptToken(s.RBRACE,"}"))}static get IF(){return(0,r.shadow)(this,"IF",new PostScriptToken(s.IF,"IF"))}static get IFELSE(){return(0,r.shadow)(this,"IFELSE",new PostScriptToken(s.IFELSE,"IFELSE"))}}t.PostScriptLexer=class PostScriptLexer{constructor(e){this.stream=e;this.nextChar();this.strBuf=[]}nextChar(){return this.currentChar=this.stream.getByte()}getToken(){let e=!1,t=this.currentChar;for(;;){if(t<0)return n.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,i.isWhiteSpace)(t))break;t=this.nextChar()}switch(0|t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new PostScriptToken(s.NUMBER,this.getNumber());case 123:this.nextChar();return PostScriptToken.LBRACE;case 125:this.nextChar();return PostScriptToken.RBRACE}const a=this.strBuf;a.length=0;a[0]=String.fromCharCode(t);for(;(t=this.nextChar())>=0&&(t>=65&&t<=90||t>=97&&t<=122);)a.push(String.fromCharCode(t));const r=a.join("");switch(r.toLowerCase()){case"if":return PostScriptToken.IF;case"ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(r)}}getNumber(){let e=this.currentChar;const t=this.strBuf;t.length=0;t[0]=String.fromCharCode(e);for(;(e=this.nextChar())>=0&&(e>=48&&e<=57||45===e||46===e);)t.push(String.fromCharCode(e));const a=parseFloat(t.join(""));if(isNaN(a))throw new r.FormatError(`Invalid floating point number: ${a}`);return a}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LocalTilingPatternCache=t.LocalImageCache=t.LocalGStateCache=t.LocalFunctionCache=t.LocalColorSpaceCache=t.GlobalImageCache=void 0;var r=a(2),n=a(5);class BaseLocalCache{constructor(e){this.constructor===BaseLocalCache&&(0,r.unreachable)("Cannot initialize BaseLocalCache.");this._onlyRefs=!0===(e&&e.onlyRefs);if(!this._onlyRefs){this._nameRefMap=new Map;this._imageMap=new Map}this._imageCache=new n.RefSetCache}getByName(e){this._onlyRefs&&(0,r.unreachable)("Should not call `getByName` method.");const t=this._nameRefMap.get(e);return t?this.getByRef(t):this._imageMap.get(e)||null}getByRef(e){return this._imageCache.get(e)||null}set(e,t,a){(0,r.unreachable)("Abstract method `set` called.")}}t.LocalImageCache=class LocalImageCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalImageCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalColorSpaceCache=class LocalColorSpaceCache extends BaseLocalCache{set(e=null,t=null,a){if("string"!=typeof e&&!t)throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.');if(t){if(this._imageCache.has(t))return;null!==e&&this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalFunctionCache=class LocalFunctionCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalFunctionCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}};t.LocalGStateCache=class LocalGStateCache extends BaseLocalCache{set(e,t=null,a){if("string"!=typeof e)throw new Error('LocalGStateCache.set - expected "name" argument.');if(t){if(this._imageCache.has(t))return;this._nameRefMap.set(e,t);this._imageCache.put(t,a)}else this._imageMap.has(e)||this._imageMap.set(e,a)}};t.LocalTilingPatternCache=class LocalTilingPatternCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}};class GlobalImageCache{static get NUM_PAGES_THRESHOLD(){return(0,r.shadow)(this,"NUM_PAGES_THRESHOLD",2)}static get MIN_IMAGES_TO_CACHE(){return(0,r.shadow)(this,"MIN_IMAGES_TO_CACHE",10)}static get MAX_BYTE_SIZE(){return(0,r.shadow)(this,"MAX_BYTE_SIZE",4e7)}constructor(){this._refCache=new n.RefSetCache;this._imageCache=new n.RefSetCache}get _byteSize(){let e=0;for(const t of this._imageCache)e+=t.byteSize;return e}get _cacheLimitReached(){return!(this._imageCache.size{Object.defineProperty(t,"__esModule",{value:!0});t.bidi=function bidi(e,t=-1,a=!1){let c=!0;const l=e.length;if(0===l||a)return createBidiText(e,c,a);s.length=l;o.length=l;let h,u,d=0;for(h=0;h4){c=!0;t=0}else{c=!1;t=1}const f=[];for(h=0;h=0&&"ET"===o[e];--e)o[e]="EN";for(let e=h+1;e0&&(t=o[h-1]);let a=m;e+1w&&isOdd(w)&&(x=w)}for(w=S;w>=x;--w){let e=-1;for(h=0,u=f.length;h=0){reverseValues(s,e,h);e=-1}}else e<0&&(e=h);e>=0&&reverseValues(s,e,f.length)}for(h=0,u=s.length;h"!==e||(s[h]="")}return createBidiText(s.join(""),c)};var r=a(2);const n=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","BN","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"],i=["AN","AN","AN","AN","AN","AN","ON","ON","AL","ET","ET","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","AL","AL","AL","AL","AL","AL"];function isOdd(e){return 0!=(1&e)}function isEven(e){return 0==(1&e)}function findUnequal(e,t,a){let r,n;for(r=t,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.MurmurHash3_64=void 0;var r=a(2);const n=3285377520,i=4294901760,s=65535;t.MurmurHash3_64=class MurmurHash3_64{constructor(e){this.h1=e?4294967295&e:n;this.h2=e?4294967295&e:n}update(e){let t,a;if("string"==typeof e){t=new Uint8Array(2*e.length);a=0;for(let r=0,n=e.length;r>>8;t[a++]=255&n}}}else{if(!(0,r.isArrayBuffer)(e))throw new Error("Wrong data format in MurmurHash3_64_update. Input must be a string or array.");t=e.slice();a=t.byteLength}const n=a>>2,o=a-4*n,c=new Uint32Array(t.buffer,0,n);let l=0,h=0,u=this.h1,d=this.h2;const f=3432918353,g=461845907,p=11601,m=13715;for(let e=0;e>>17;l=l*g&i|l*m&s;u^=l;u=u<<13|u>>>19;u=5*u+3864292196}else{h=c[e];h=h*f&i|h*p&s;h=h<<15|h>>>17;h=h*g&i|h*m&s;d^=h;d=d<<13|d>>>19;d=5*d+3864292196}l=0;switch(o){case 3:l^=t[4*n+2]<<16;case 2:l^=t[4*n+1]<<8;case 1:l^=t[4*n];l=l*f&i|l*p&s;l=l<<15|l>>>17;l=l*g&i|l*m&s;1&n?u^=l:d^=l}this.h1=u;this.h2=d}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&i|36045*e&s;t=4283543511*t&i|(2950163797*(t<<16|e>>>16)&i)>>>16;e^=t>>>1;e=444984403*e&i|60499*e&s;t=3301882366*t&i|(3120437893*(t<<16|e>>>16)&i)>>>16;e^=t>>>1;const a=(e>>>0).toString(16),r=(t>>>0).toString(16);return a.padStart(8,"0")+r.padStart(8,"0")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.OperatorList=void 0;var r=a(2);function addState(e,t,a,r,n){let i=e;for(let e=0,a=t.length-1;e1e3){h=Math.max(h,f);g+=d+2;f=0;d=0}u.push({transform:t,x:f,y:g,w:a.width,h:a.height});f+=a.width+2;d=Math.max(d,a.height)}const p=Math.max(h,f)+1,m=g+d+1,b=new Uint8Array(p*m*4),y=p<<2;for(let e=0;e=0;){t[i-4]=t[i];t[i-3]=t[i+1];t[i-2]=t[i+2];t[i-1]=t[i+3];t[i+a]=t[i+a-4];t[i+a+1]=t[i+a-3];t[i+a+2]=t[i+a-2];t[i+a+3]=t[i+a-1];i-=y}}a.splice(s,4*l,r.OPS.paintInlineImageXObjectGroup);n.splice(s,4*l,[{width:p,height:m,kind:r.ImageKind.RGBA_32BPP,data:b},u]);return s+1}));addState(n,[r.OPS.save,r.OPS.transform,r.OPS.paintImageMaskXObject,r.OPS.restore],null,(function iterateImageMaskGroup(e,t){const a=e.fnArray,n=(t-(e.iCurr-3))%4;switch(n){case 0:return a[t]===r.OPS.save;case 1:return a[t]===r.OPS.transform;case 2:return a[t]===r.OPS.paintImageMaskXObject;case 3:return a[t]===r.OPS.restore}throw new Error(`iterateImageMaskGroup - invalid pos: ${n}`)}),(function foundImageMaskGroup(e,t){const a=e.fnArray,n=e.argsArray,i=e.iCurr,s=i-3,o=i-2,c=i-1;let l=Math.floor((t-s)/4);if(l<10)return t-(t-s)%4;let h,u,d=!1;const f=n[c][0],g=n[o][0],p=n[o][1],m=n[o][2],b=n[o][3];if(p===m){d=!0;h=o+4;let e=c+4;for(let t=1;t=4&&a[i-4]===a[s]&&a[i-3]===a[o]&&a[i-2]===a[c]&&a[i-1]===a[l]&&r[i-4][0]===h&&r[i-4][1]===u){d++;f-=5}let g=f+4;for(let e=1;e=a)break}r=(r||n)[e[t]];if(r&&!Array.isArray(r)){s.iCurr=t;t++;if(!r.checkFn||(0,r.checkFn)(s)){i=r;r=null}else r=null}else t++}this.state=r;this.match=i;this.lastProcessed=t}flush(){for(;this.match;){const e=this.queue.fnArray.length;this.lastProcessed=(0,this.match.processFn)(this.context,e);this.match=null;this.state=null;this._optimize()}}reset(){this.state=null;this.match=null;this.lastProcessed=0}}class OperatorList{static get CHUNK_SIZE(){return(0,r.shadow)(this,"CHUNK_SIZE",1e3)}static get CHUNK_SIZE_ABOUT(){return(0,r.shadow)(this,"CHUNK_SIZE_ABOUT",this.CHUNK_SIZE-5)}constructor(e=0,t){this._streamSink=t;this.fnArray=[];this.argsArray=[];!t||e&r.RenderingIntentFlag.OPLIST?this.optimizer=new NullOptimizer(this):this.optimizer=new QueueOptimizer(this);this.dependencies=new Set;this._totalLength=0;this.weight=0;this._resolved=t?null:Promise.resolve()}get length(){return this.argsArray.length}get ready(){return this._resolved||this._streamSink.ready}get totalLength(){return this._totalLength+this.length}addOp(e,t){this.optimizer.push(e,t);this.weight++;this._streamSink&&(this.weight>=OperatorList.CHUNK_SIZE||this.weight>=OperatorList.CHUNK_SIZE_ABOUT&&(e===r.OPS.restore||e===r.OPS.endText))&&this.flush()}addImageOps(e,t,a){void 0!==a&&this.addOp(r.OPS.beginMarkedContentProps,["OC",a]);this.addOp(e,t);void 0!==a&&this.addOp(r.OPS.endMarkedContent,[])}addDependency(e){if(!this.dependencies.has(e)){this.dependencies.add(e);this.addOp(r.OPS.dependency,[e])}}addDependencies(e){for(const t of e)this.addDependency(t)}addOpList(e){if(e instanceof OperatorList){for(const t of e.dependencies)this.dependencies.add(t);for(let t=0,a=e.length;t{Object.defineProperty(t,"__esModule",{value:!0});t.PDFImage=void 0;var r=a(2),n=a(64),i=a(7),s=a(14),o=a(19),c=a(27),l=a(30),h=a(5);function decodeAndClamp(e,t,a,r){(e=t+e*a)<0?e=0:e>r&&(e=r);return e}function resizeImageMask(e,t,a,r,n,i){const s=n*i;let o;o=t<=8?new Uint8Array(s):t<=16?new Uint16Array(s):new Uint32Array(s);const c=a/n,l=r/i;let h,u,d,f,g=0;const p=new Uint16Array(n),m=a;for(h=0;h0&&Number.isInteger(a.height)&&a.height>0&&(a.width!==b||a.height!==y)){(0,r.warn)("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");b=a.width;y=a.height}if(b<1||y<1)throw new r.FormatError(`Invalid image width: ${b} or height: ${y}`);this.width=b;this.height=y;this.interpolate=g.get("I","Interpolate");this.imageMask=g.get("IM","ImageMask")||!1;this.matte=g.get("Matte")||!1;let w=a.bitsPerComponent;if(!w){w=g.get("BPC","BitsPerComponent");if(!w){if(!this.imageMask)throw new r.FormatError(`Bits per component missing in image: ${this.imageMask}`);w=1}}this.bpc=w;if(!this.imageMask){let i=g.getRaw("CS")||g.getRaw("ColorSpace");if(!i){(0,r.info)("JPX images (which do not require color spaces)");switch(a.numComps){case 1:i=h.Name.get("DeviceGray");break;case 3:i=h.Name.get("DeviceRGB");break;case 4:i=h.Name.get("DeviceCMYK");break;default:throw new Error(`JPX images with ${a.numComps} color components not supported.`)}}this.colorSpace=s.ColorSpace.parse({cs:i,xref:e,resources:n?t:null,pdfFunctionFactory:d,localColorSpaceCache:f});this.numComps=this.colorSpace.numComps}this.decode=g.getArray("D","Decode");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode,w)||u&&!s.ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<>3)*a,o=e.byteLength;let c,l;if(!r||n&&!(s===o))if(n){c=new Uint8Array(s);c.set(e);c.fill(255,o)}else c=new Uint8Array(e);else c=e;if(n)for(l=0;l>7&1;s[d+1]=u>>6&1;s[d+2]=u>>5&1;s[d+3]=u>>4&1;s[d+4]=u>>3&1;s[d+5]=u>>2&1;s[d+6]=u>>1&1;s[d+7]=1&u;d+=8}if(d>=1}}}}else{let a=0;u=0;for(d=0,h=i;d>r;n<0?n=0:n>l&&(n=l);s[d]=n;u&=(1<o[r+1]){t=255;break}}c[u]=t}}}if(c)for(u=0,f=3,d=t*n;u>3;if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===l?e=r.ImageKind.GRAYSCALE_1BPP:"DeviceRGB"!==this.colorSpace.name||8!==l||this.needsDecode||(e=r.ImageKind.RGB_24BPP);if(e&&!this.smask&&!this.mask&&t===s&&a===o){n.kind=e;n.data=this.getImageBytes(o*h,{});if(this.needsDecode){(0,r.assert)(e===r.ImageKind.GRAYSCALE_1BPP,"PDFImage.createImageData: The image must be grayscale.");const t=n.data;for(let e=0,a=t.length;e>3,o=this.getImageBytes(n*s,{internal:!0}),c=this.getComponents(o);let l,h;if(1===i){h=a*n;if(this.needsDecode)for(l=0;l{Object.defineProperty(t,"__esModule",{value:!0});t.applyMaskImageData=function applyMaskImageData({src:e,srcPos:t=0,dest:a,destPos:n=0,width:i,height:s,inverseDecode:o=!1}){const c=r.FeatureTest.isLittleEndian?4278190080:255,[l,h]=o?[0,c]:[c,0],u=i>>3,d=7&i,f=e.length;a=new Uint32Array(a.buffer);for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});t.incrementalUpdate=function incrementalUpdate({originalData:e,xrefInfo:t,newRefs:a,xref:o=null,hasXfa:l=!1,xfaDatasetsRef:h=null,hasXfaDatasetsEntry:u=!1,acroFormRef:d=null,acroForm:f=null,xfaData:g=null}){l&&function updateXFA({xfaData:e,xfaDatasetsRef:t,hasXfaDatasetsEntry:a,acroFormRef:n,acroForm:o,newRefs:c,xref:l,xrefInfo:h}){if(null===l)return;if(!a){if(!n){(0,r.warn)("XFA - Cannot save it");return}const e=o.get("XFA"),a=e.slice();a.splice(2,0,"datasets");a.splice(3,0,t);o.set("XFA",a);const i=l.encrypt;let s=null;i&&(s=i.createCipherTransform(n.num,n.gen));const h=[`${n.num} ${n.gen} obj\n`];writeDict(o,h,s);h.push("\n");o.set("XFA",e);c.push({ref:n,data:h.join("")})}if(null===e){e=function writeXFADataForAcroform(e,t){const a=new s.SimpleXMLParser({hasAttributes:!0}).parseFromString(e);for(const{xfa:e}of t){if(!e)continue;const{path:t,value:n}=e;if(!t)continue;const o=a.documentElement.searchNode((0,i.parseXFAPath)(t),0);o?Array.isArray(n)?o.childNodes=n.map((e=>new s.SimpleDOMNode("value",e))):o.childNodes=[new s.SimpleDOMNode("#text",n)]:(0,r.warn)(`Node not found for path: ${t}`)}const n=[];a.documentElement.dump(n);return n.join("")}(l.fetchIfRef(t).getString(),c)}const u=l.encrypt;if(u){e=u.createCipherTransform(t.num,t.gen).encryptString(e)}const d=`${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n`+e+"\nendstream\nendobj\n";c.push({ref:t,data:d})}({xfaData:g,xfaDatasetsRef:h,hasXfaDatasetsEntry:u,acroFormRef:d,acroForm:f,newRefs:a,xref:o,xrefInfo:t});const p=new n.Dict(null),m=t.newRef;let b,y;const w=e.at(-1);if(10===w||13===w){b=[];y=e.length}else{b=["\n"];y=e.length+1}p.set("Size",m.num+1);p.set("Prev",t.startXRef);p.set("Type",n.Name.get("XRef"));null!==t.rootRef&&p.set("Root",t.rootRef);null!==t.infoRef&&p.set("Info",t.infoRef);null!==t.encryptRef&&p.set("Encrypt",t.encryptRef);a.push({ref:m,data:""});a=a.sort(((e,t)=>e.ref.num-t.ref.num));const S=[[0,1,65535]],x=[0,1];let k=0;for(const{ref:e,data:t}of a){k=Math.max(k,y);S.push([1,y,Math.min(e.gen,65535)]);y+=t.length;x.push(e.num,1);b.push(t)}p.set("Index",x);if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const e=function computeMD5(e,t){const a=Math.floor(Date.now()/1e3),n=t.filename||"",i=[a.toString(),n,e.toString()];let s=i.reduce(((e,t)=>e+t.length),0);for(const e of Object.values(t.info)){i.push(e);s+=e.length}const o=new Uint8Array(s);let l=0;for(const e of i){writeString(e,l,o);l+=e.length}return(0,r.bytesToString)((0,c.calculateMD5)(o))}(y,t);p.set("ID",[t.fileIds[0],e])}const C=[1,Math.ceil(Math.log2(k)/8),2],v=(C[0]+C[1]+C[2])*S.length;p.set("W",C);p.set("Length",v);b.push(`${m.num} ${m.gen} obj\n`);writeDict(p,b,null);b.push(" stream\n");const F=b.reduce(((e,t)=>e+t.length),0),O=`\nendstream\nendobj\nstartxref\n${y}\n%%EOF\n`,T=new Uint8Array(e.length+F+v+O.length);T.set(e);let M=e.length;for(const e of b){writeString(e,M,T);M+=e.length}for(const[e,t,a]of S){M=writeInt(e,C[0],M,T);M=writeInt(t,C[1],M,T);M=writeInt(a,C[2],M,T)}writeString(O,M,T);return T};t.writeDict=writeDict;t.writeObject=function writeObject(e,t,a,r){a.push(`${e.num} ${e.gen} obj\n`);t instanceof n.Dict?writeDict(t,a,r):t instanceof o.BaseStream&&writeStream(t,a,r);a.push("\nendobj\n")};var r=a(2),n=a(5),i=a(6),s=a(66),o=a(7),c=a(67);function writeDict(e,t,a){t.push("<<");for(const r of e.getKeys()){t.push(` /${(0,i.escapePDFName)(r)} `);writeValue(e.getRaw(r),t,a)}t.push(">>")}function writeStream(e,t,a){writeDict(e.dict,t,a);t.push(" stream\n");let r=e.getString();null!==a&&(r=a.encryptString(r));t.push(r,"\nendstream\n")}function writeValue(e,t,a){if(e instanceof n.Name)t.push(`/${(0,i.escapePDFName)(e.name)}`);else if(e instanceof n.Ref)t.push(`${e.num} ${e.gen} R`);else if(Array.isArray(e))!function writeArray(e,t,a){t.push("[");let r=!0;for(const n of e){r?r=!1:t.push(" ");writeValue(n,t,a)}t.push("]")}(e,t,a);else if("string"==typeof e){null!==a&&(e=a.encryptString(e));t.push(`(${(0,r.escapeString)(e)})`)}else"number"==typeof e?t.push((0,i.numberToString)(e)):"boolean"==typeof e?t.push(e.toString()):e instanceof n.Dict?writeDict(e,t,a):e instanceof o.BaseStream?writeStream(e,t,a):null===e?t.push("null"):(0,r.warn)(`Unhandled value in writer: ${typeof e}, please file a bug.`)}function writeInt(e,t,a,r){for(let n=t+a-1;n>a-1;n--){r[n]=255&e;e>>=8}return a+t}function writeString(e,t,a){for(let r=0,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.XMLParserErrorCode=t.XMLParserBase=t.SimpleXMLParser=t.SimpleDOMNode=void 0;var r=a(6);const n={NoError:0,EndOfDocument:-1,UnterminatedCdat:-2,UnterminatedXmlDeclaration:-3,UnterminatedDoctypeDeclaration:-4,UnterminatedComment:-5,MalformedElement:-6,OutOfMemory:-7,UnterminatedAttributeValue:-8,UnterminatedElement:-9,ElementNeverBegun:-10};t.XMLParserErrorCode=n;function isWhitespace(e,t){const a=e[t];return" "===a||"\n"===a||"\r"===a||"\t"===a}class XMLParserBase{_resolveEntities(e){return e.replace(/&([^;]+);/g,((e,t)=>{if("#x"===t.substring(0,2))return String.fromCodePoint(parseInt(t.substring(2),16));if("#"===t.substring(0,1))return String.fromCodePoint(parseInt(t.substring(1),10));switch(t){case"lt":return"<";case"gt":return">";case"amp":return"&";case"quot":return'"';case"apos":return"'"}return this.onResolveEntity(t)}))}_parseContent(e,t){const a=[];let r=t;function skipWs(){for(;r"!==e[r]&&"/"!==e[r];)++r;const n=e.substring(t,r);skipWs();for(;r"!==e[r]&&"/"!==e[r]&&"?"!==e[r];){skipWs();let t="",n="";for(;r"!==e[a]&&"?"!==e[a]&&"/"!==e[a];)++a;const r=e.substring(t,a);!function skipWs(){for(;a"!==e[a+1]);)++a;return{name:r,value:e.substring(n,a),parsed:a-t}}parseXml(e){let t=0;for(;t",a);if(t<0){this.onError(n.UnterminatedElement);return}this.onEndElement(e.substring(a,t));a=t+1;break;case"?":++a;const r=this._parseProcessingInstruction(e,a);if("?>"!==e.substring(a+r.parsed,a+r.parsed+2)){this.onError(n.UnterminatedXmlDeclaration);return}this.onPi(r.name,r.value);a+=r.parsed+2;break;case"!":if("--"===e.substring(a+1,a+3)){t=e.indexOf("--\x3e",a+3);if(t<0){this.onError(n.UnterminatedComment);return}this.onComment(e.substring(a+3,t));a=t+3}else if("[CDATA["===e.substring(a+1,a+8)){t=e.indexOf("]]>",a+8);if(t<0){this.onError(n.UnterminatedCdat);return}this.onCdata(e.substring(a+8,t));a=t+3}else{if("DOCTYPE"!==e.substring(a+1,a+8)){this.onError(n.MalformedElement);return}{const r=e.indexOf("[",a+8);let i=!1;t=e.indexOf(">",a+8);if(t<0){this.onError(n.UnterminatedDoctypeDeclaration);return}if(r>0&&t>r){t=e.indexOf("]>",a+8);if(t<0){this.onError(n.UnterminatedDoctypeDeclaration);return}i=!0}const s=e.substring(a+8,t+(i?1:0));this.onDoctype(s);a=t+(i?2:1)}}break;default:const i=this._parseContent(e,a);if(null===i){this.onError(n.MalformedElement);return}let s=!1;if("/>"===e.substring(a+i.parsed,a+i.parsed+2))s=!0;else if(">"!==e.substring(a+i.parsed,a+i.parsed+1)){this.onError(n.UnterminatedElement);return}this.onBeginElement(i.name,i.attributes,s);a+=i.parsed+(s?2:1)}}else{for(;a0}searchNode(e,t){if(t>=e.length)return this;const a=e[t],r=[];let n=this;for(;;){if(a.name===n.nodeName){if(0!==a.pos){if(0===r.length)return null;{const[i]=r.pop();let s=0;for(const r of i.childNodes)if(a.name===r.nodeName){if(s===a.pos)return r.searchNode(e,t+1);s++}return n.searchNode(e,t+1)}}{const a=n.searchNode(e,t+1);if(null!==a)return a}}if(n.childNodes&&0!==n.childNodes.length){r.push([n,0]);n=n.childNodes[0]}else{if(0===r.length)return null;for(;0!==r.length;){const[e,t]=r.pop(),a=t+1;if(a");for(const t of this.childNodes)t.dump(e);e.push(``)}else this.nodeValue?e.push(`>${(0,r.encodeToXmlString)(this.nodeValue)}`):e.push("/>")}else e.push((0,r.encodeToXmlString)(this.nodeValue))}}t.SimpleDOMNode=SimpleDOMNode;t.SimpleXMLParser=class SimpleXMLParser extends XMLParserBase{constructor({hasAttributes:e=!1,lowerCaseName:t=!1}){super();this._currentFragment=null;this._stack=null;this._errorCode=n.NoError;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=n.NoError;this.parseXml(e);if(this._errorCode!==n.NoError)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onText(e){if(function isWhitespaceString(e){for(let t=0,a=e.length;t{Object.defineProperty(t,"__esModule",{value:!0});t.calculateSHA256=t.calculateMD5=t.PDF20=t.PDF17=t.CipherTransformFactory=t.ARCFourCipher=t.AES256Cipher=t.AES128Cipher=void 0;t.calculateSHA384=calculateSHA384;t.calculateSHA512=void 0;var r=a(2),n=a(5),i=a(68);class ARCFourCipher{constructor(e){this.a=0;this.b=0;const t=new Uint8Array(256),a=e.length;for(let e=0;e<256;++e)t[e]=e;for(let r=0,n=0;r<256;++r){const i=t[r];n=n+i+e[r%a]&255;t[r]=t[n];t[n]=i}this.s=t}encryptBlock(e){let t=this.a,a=this.b;const r=this.s,n=e.length,i=new Uint8Array(n);for(let s=0;s>5&255;h[u++]=n>>13&255;h[u++]=n>>21&255;h[u++]=n>>>29&255;h[u++]=0;h[u++]=0;h[u++]=0;const g=new Int32Array(16);for(u=0;u>>32-o)|0;n=i}i=i+n|0;s=s+l|0;o=o+f|0;c=c+p|0}return new Uint8Array([255&i,i>>8&255,i>>16&255,i>>>24&255,255&s,s>>8&255,s>>16&255,s>>>24&255,255&o,o>>8&255,o>>16&255,o>>>24&255,255&c,c>>8&255,c>>16&255,c>>>24&255])}}();t.calculateMD5=s;class Word64{constructor(e,t){this.high=0|e;this.low=0|t}and(e){this.high&=e.high;this.low&=e.low}xor(e){this.high^=e.high;this.low^=e.low}or(e){this.high|=e.high;this.low|=e.low}shiftRight(e){if(e>=32){this.low=this.high>>>e-32|0;this.high=0}else{this.low=this.low>>>e|this.high<<32-e;this.high=this.high>>>e|0}}shiftLeft(e){if(e>=32){this.high=this.low<>>32-e;this.low<<=e}}rotateRight(e){let t,a;if(32&e){a=this.low;t=this.high}else{t=this.low;a=this.high}e&=31;this.low=t>>>e|a<<32-e;this.high=a>>>e|t<<32-e}not(){this.high=~this.high;this.low=~this.low}add(e){const t=(this.low>>>0)+(e.low>>>0);let a=(this.high>>>0)+(e.high>>>0);t>4294967295&&(a+=1);this.low=0|t;this.high=0|a}copyTo(e,t){e[t]=this.high>>>24&255;e[t+1]=this.high>>16&255;e[t+2]=this.high>>8&255;e[t+3]=255&this.high;e[t+4]=this.low>>>24&255;e[t+5]=this.low>>16&255;e[t+6]=this.low>>8&255;e[t+7]=255&this.low}assign(e){this.high=e.high;this.low=e.low}}const o=function calculateSHA256Closure(){function rotr(e,t){return e>>>t|e<<32-t}function ch(e,t,a){return e&t^~e&a}function maj(e,t,a){return e&t^e&a^t&a}function sigma(e){return rotr(e,2)^rotr(e,13)^rotr(e,22)}function sigmaPrime(e){return rotr(e,6)^rotr(e,11)^rotr(e,25)}function littleSigma(e){return rotr(e,7)^rotr(e,18)^e>>>3}const e=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];return function hash(t,a,r){let n=1779033703,i=3144134277,s=1013904242,o=2773480762,c=1359893119,l=2600822924,h=528734635,u=1541459225;const d=64*Math.ceil((r+9)/64),f=new Uint8Array(d);let g,p;for(g=0;g>>29&255;f[g++]=r>>21&255;f[g++]=r>>13&255;f[g++]=r>>5&255;f[g++]=r<<3&255;const b=new Uint32Array(64);for(g=0;g>>10)+b[p-7]+littleSigma(b[p-15])+b[p-16]|0;let t,a,r=n,d=i,m=s,w=o,S=c,x=l,k=h,C=u;for(p=0;p<64;++p){t=C+sigmaPrime(S)+ch(S,x,k)+e[p]+b[p];a=sigma(r)+maj(r,d,m);C=k;k=x;x=S;S=w+t|0;w=m;m=d;d=r;r=t+a|0}n=n+r|0;i=i+d|0;s=s+m|0;o=o+w|0;c=c+S|0;l=l+x|0;h=h+k|0;u=u+C|0}var y;return new Uint8Array([n>>24&255,n>>16&255,n>>8&255,255&n,i>>24&255,i>>16&255,i>>8&255,255&i,s>>24&255,s>>16&255,s>>8&255,255&s,o>>24&255,o>>16&255,o>>8&255,255&o,c>>24&255,c>>16&255,c>>8&255,255&c,l>>24&255,l>>16&255,l>>8&255,255&l,h>>24&255,h>>16&255,h>>8&255,255&h,u>>24&255,u>>16&255,u>>8&255,255&u])}}();t.calculateSHA256=o;const c=function calculateSHA512Closure(){function ch(e,t,a,r,n){e.assign(t);e.and(a);n.assign(t);n.not();n.and(r);e.xor(n)}function maj(e,t,a,r,n){e.assign(t);e.and(a);n.assign(t);n.and(r);e.xor(n);n.assign(a);n.and(r);e.xor(n)}function sigma(e,t,a){e.assign(t);e.rotateRight(28);a.assign(t);a.rotateRight(34);e.xor(a);a.assign(t);a.rotateRight(39);e.xor(a)}function sigmaPrime(e,t,a){e.assign(t);e.rotateRight(14);a.assign(t);a.rotateRight(18);e.xor(a);a.assign(t);a.rotateRight(41);e.xor(a)}function littleSigma(e,t,a){e.assign(t);e.rotateRight(1);a.assign(t);a.rotateRight(8);e.xor(a);a.assign(t);a.shiftRight(7);e.xor(a)}function littleSigmaPrime(e,t,a){e.assign(t);e.rotateRight(19);a.assign(t);a.rotateRight(61);e.xor(a);a.assign(t);a.shiftRight(6);e.xor(a)}const e=[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)];return function hash(t,a,r,n=!1){let i,s,o,c,l,h,u,d;if(n){i=new Word64(3418070365,3238371032);s=new Word64(1654270250,914150663);o=new Word64(2438529370,812702999);c=new Word64(355462360,4144912697);l=new Word64(1731405415,4290775857);h=new Word64(2394180231,1750603025);u=new Word64(3675008525,1694076839);d=new Word64(1203062813,3204075428)}else{i=new Word64(1779033703,4089235720);s=new Word64(3144134277,2227873595);o=new Word64(1013904242,4271175723);c=new Word64(2773480762,1595750129);l=new Word64(1359893119,2917565137);h=new Word64(2600822924,725511199);u=new Word64(528734635,4215389547);d=new Word64(1541459225,327033209)}const f=128*Math.ceil((r+17)/128),g=new Uint8Array(f);let p,m;for(p=0;p>>29&255;g[p++]=r>>21&255;g[p++]=r>>13&255;g[p++]=r>>5&255;g[p++]=r<<3&255;const y=new Array(80);for(p=0;p<80;p++)y[p]=new Word64(0,0);let w=new Word64(0,0),S=new Word64(0,0),x=new Word64(0,0),k=new Word64(0,0),C=new Word64(0,0),v=new Word64(0,0),F=new Word64(0,0),O=new Word64(0,0);const T=new Word64(0,0),M=new Word64(0,0),E=new Word64(0,0),D=new Word64(0,0);let N,R;for(p=0;p=1;--e){a=i[13];i[13]=i[9];i[9]=i[5];i[5]=i[1];i[1]=a;a=i[14];r=i[10];i[14]=i[6];i[10]=i[2];i[6]=a;i[2]=r;a=i[15];r=i[11];n=i[7];i[15]=i[3];i[11]=a;i[7]=r;i[3]=n;for(let e=0;e<16;++e)i[e]=this._inv_s[i[e]];for(let a=0,r=16*e;a<16;++a,++r)i[a]^=t[r];for(let e=0;e<16;e+=4){const t=this._mix[i[e]],r=this._mix[i[e+1]],n=this._mix[i[e+2]],s=this._mix[i[e+3]];a=t^r>>>8^r<<24^n>>>16^n<<16^s>>>24^s<<8;i[e]=a>>>24&255;i[e+1]=a>>16&255;i[e+2]=a>>8&255;i[e+3]=255&a}}a=i[13];i[13]=i[9];i[9]=i[5];i[5]=i[1];i[1]=a;a=i[14];r=i[10];i[14]=i[6];i[10]=i[2];i[6]=a;i[2]=r;a=i[15];r=i[11];n=i[7];i[15]=i[3];i[11]=a;i[7]=r;i[3]=n;for(let e=0;e<16;++e){i[e]=this._inv_s[i[e]];i[e]^=t[e]}return i}_encrypt(e,t){const a=this._s;let r,n,i;const s=new Uint8Array(16);s.set(e);for(let e=0;e<16;++e)s[e]^=t[e];for(let e=1;e=r;--a)if(e[a]!==t){t=0;break}o-=t;i[i.length-1]=e.subarray(0,16-t)}}const c=new Uint8Array(o);for(let e=0,t=0,a=i.length;e=256&&(o=255&(27^o))}for(let t=0;t<4;++t){a[e]=r^=a[e-32];e++;a[e]=n^=a[e-32];e++;a[e]=i^=a[e-32];e++;a[e]=s^=a[e-32];e++}}return a}}t.AES256Cipher=AES256Cipher;class PDF17{checkOwnerPassword(e,t,a,n){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const s=o(i,0,i.length);return(0,r.isArrayEqual)(s,n)}checkUserPassword(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);const i=o(n,0,n.length);return(0,r.isArrayEqual)(i,a)}getOwnerKey(e,t,a,r){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const i=o(n,0,n.length);return new AES256Cipher(i).decryptBlock(r,!1,new Uint8Array(16))}getUserKey(e,t,a){const r=new Uint8Array(e.length+8);r.set(e,0);r.set(t,e.length);const n=o(r,0,r.length);return new AES256Cipher(n).decryptBlock(a,!1,new Uint8Array(16))}}t.PDF17=PDF17;const l=function PDF20Closure(){function calculatePDF20Hash(e,t,a){let r=o(t,0,t.length).subarray(0,32),n=[0],i=0;for(;i<64||n.at(-1)>i-32;){const t=e.length+r.length+a.length,s=new Uint8Array(t);let l=0;s.set(e,l);l+=e.length;s.set(r,l);l+=r.length;s.set(a,l);const h=new Uint8Array(64*t);for(let e=0,a=0;e<64;e++,a+=t)h.set(s,a);n=new AES128Cipher(r.subarray(0,16)).encrypt(h,r.subarray(16,32));let u=0;for(let e=0;e<16;e++){u*=1;u%=3;u+=(n[e]>>>0)%3;u%=3}0===u?r=o(n,0,n.length):1===u?r=calculateSHA384(n,0,n.length):2===u&&(r=c(n,0,n.length));i++}return r.subarray(0,32)}return class PDF20{hash(e,t,a){return calculatePDF20Hash(e,t,a)}checkOwnerPassword(e,t,a,n){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const s=calculatePDF20Hash(e,i,a);return(0,r.isArrayEqual)(s,n)}checkUserPassword(e,t,a){const n=new Uint8Array(e.length+8);n.set(e,0);n.set(t,e.length);const i=calculatePDF20Hash(e,n,[]);return(0,r.isArrayEqual)(i,a)}getOwnerKey(e,t,a,r){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const i=calculatePDF20Hash(e,n,a);return new AES256Cipher(i).decryptBlock(r,!1,new Uint8Array(16))}getUserKey(e,t,a){const r=new Uint8Array(e.length+8);r.set(e,0);r.set(t,e.length);const n=calculatePDF20Hash(e,r,[]);return new AES256Cipher(n).decryptBlock(a,!1,new Uint8Array(16))}}}();t.PDF20=l;class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const a=new this.StreamCipherConstructor;return new i.DecryptStream(e,t,(function cipherTransformDecryptStream(e,t){return a.decryptBlock(e,t)}))}decryptString(e){const t=new this.StringCipherConstructor;let a=(0,r.stringToBytes)(e);a=t.decryptBlock(a,!0);return(0,r.bytesToString)(a)}encryptString(e){const t=new this.StringCipherConstructor;if(t instanceof AESBaseCipher){const a=16-e.length%16;e+=String.fromCharCode(a).repeat(a);const n=new Uint8Array(16);if("undefined"!=typeof crypto)crypto.getRandomValues(n);else for(let e=0;e<16;e++)n[e]=Math.floor(256*Math.random());let i=(0,r.stringToBytes)(e);i=t.encrypt(i,n);const s=new Uint8Array(16+i.length);s.set(n);s.set(i,16);return(0,r.bytesToString)(s)}let a=(0,r.stringToBytes)(e);a=t.encrypt(a);return(0,r.bytesToString)(a)}}const h=function CipherTransformFactoryClosure(){const e=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]);function prepareKeyData(t,a,r,n,i,o,c,l){const h=40+r.length+t.length,u=new Uint8Array(h);let d,f,g=0;if(a){f=Math.min(32,a.length);for(;g>8&255;u[g++]=i>>16&255;u[g++]=i>>>24&255;for(d=0,f=t.length;d=4&&!l){u[g++]=255;u[g++]=255;u[g++]=255;u[g++]=255}let p=s(u,0,g);const m=c>>3;if(o>=3)for(d=0;d<50;++d)p=s(p,0,m);const b=p.subarray(0,m);let y,w;if(o>=3){for(g=0;g<32;++g)u[g]=e[g];for(d=0,f=t.length;d>8&255;n[o++]=e>>16&255;n[o++]=255&t;n[o++]=t>>8&255;if(r){n[o++]=115;n[o++]=65;n[o++]=108;n[o++]=84}return s(n,0,o).subarray(0,Math.min(a.length+5,16))}function buildCipherConstructor(e,t,a,i,s){if(!(t instanceof n.Name))throw new r.FormatError("Invalid crypt filter name.");const o=e.get(t.name);let c;null!=o&&(c=o.get("CFM"));if(!c||"None"===c.name)return function cipherTransformFactoryBuildCipherConstructorNone(){return new NullCipher};if("V2"===c.name)return function cipherTransformFactoryBuildCipherConstructorV2(){return new ARCFourCipher(buildObjectKey(a,i,s,!1))};if("AESV2"===c.name)return function cipherTransformFactoryBuildCipherConstructorAESV2(){return new AES128Cipher(buildObjectKey(a,i,s,!0))};if("AESV3"===c.name)return function cipherTransformFactoryBuildCipherConstructorAESV3(){return new AES256Cipher(s)};throw new r.FormatError("Unknown crypto method")}return class CipherTransformFactory{constructor(a,i,o){const c=a.get("Filter");if(!(0,n.isName)(c,"Standard"))throw new r.FormatError("unknown encryption method");this.filterName=c.name;this.dict=a;const h=a.get("V");if(!Number.isInteger(h)||1!==h&&2!==h&&4!==h&&5!==h)throw new r.FormatError("unsupported encryption algorithm");this.algorithm=h;let u=a.get("Length");if(!u)if(h<=3)u=40;else{const e=a.get("CF"),t=a.get("StmF");if(e instanceof n.Dict&&t instanceof n.Name){e.suppressEncryption=!0;const a=e.get(t.name);u=a&&a.get("Length")||128;u<40&&(u<<=3)}}if(!Number.isInteger(u)||u<40||u%8!=0)throw new r.FormatError("invalid key length");const d=(0,r.stringToBytes)(a.get("O")).subarray(0,32),f=(0,r.stringToBytes)(a.get("U")).subarray(0,32),g=a.get("P"),p=a.get("R"),m=(4===h||5===h)&&!1!==a.get("EncryptMetadata");this.encryptMetadata=m;const b=(0,r.stringToBytes)(i);let y,w;if(o){if(6===p)try{o=(0,r.utf8StringToString)(o)}catch(e){(0,r.warn)("CipherTransformFactory: Unable to convert UTF8 encoded password.")}y=(0,r.stringToBytes)(o)}if(5!==h)w=prepareKeyData(b,y,d,f,g,p,u,m);else{const e=(0,r.stringToBytes)(a.get("O")).subarray(32,40),t=(0,r.stringToBytes)(a.get("O")).subarray(40,48),n=(0,r.stringToBytes)(a.get("U")).subarray(0,48),i=(0,r.stringToBytes)(a.get("U")).subarray(32,40),s=(0,r.stringToBytes)(a.get("U")).subarray(40,48),o=(0,r.stringToBytes)(a.get("OE")),c=(0,r.stringToBytes)(a.get("UE"));(0,r.stringToBytes)(a.get("Perms"));w=function createEncryptionKey20(e,t,a,r,n,i,s,o,c,h,u,d){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];let f;f=6===e?new l:new PDF17;return f.checkUserPassword(t,o,s)?f.getUserKey(t,c,u):t.length&&f.checkOwnerPassword(t,r,i,a)?f.getOwnerKey(t,n,i,h):null}(p,y,d,e,t,n,f,i,s,o,c)}if(!w&&!o)throw new r.PasswordException("No password given",r.PasswordResponses.NEED_PASSWORD);if(!w&&o){const t=function decodeUserPassword(t,a,r,n){const i=new Uint8Array(32);let o=0;const c=Math.min(32,t.length);for(;o>3;if(r>=3)for(l=0;l<50;++l)h=s(h,0,h.length);let d,f;if(r>=3){f=a;const e=new Uint8Array(u);for(l=19;l>=0;l--){for(let t=0;t=4){const e=a.get("CF");e instanceof n.Dict&&(e.suppressEncryption=!0);this.cf=e;this.stmf=a.get("StmF")||t;this.strf=a.get("StrF")||t;this.eff=a.get("EFF")||this.stmf}}createCipherTransform(e,t){if(4===this.algorithm||5===this.algorithm)return new CipherTransform(buildCipherConstructor(this.cf,this.strf,e,t,this.encryptionKey),buildCipherConstructor(this.cf,this.stmf,e,t,this.encryptionKey));const a=buildObjectKey(e,t,this.encryptionKey,!1),r=function buildCipherCipherConstructor(){return new ARCFourCipher(a)};return new CipherTransform(r,r)}}}();t.CipherTransformFactory=h},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DecryptStream=void 0;var r=a(19);class DecryptStream extends r.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;this.decrypt=a;this.nextChunk=null;this.initialized=!1}readBlock(){let e;if(this.initialized)e=this.nextChunk;else{e=this.str.getBytes(512);this.initialized=!0}if(!e||0===e.length){this.eof=!0;return}this.nextChunk=this.str.getBytes(512);const t=this.nextChunk&&this.nextChunk.length>0;e=(0,this.decrypt)(e,!t);let a=this.bufferLength;const r=e.length,n=this.ensureBuffer(a+r);for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0});t.Catalog=void 0;var r=a(6),n=a(2),i=a(5),s=a(70),o=a(7),c=a(71),l=a(14),h=a(72),u=a(59),d=a(73),f=a(74);function fetchDestination(e){e instanceof i.Dict&&(e=e.get("D"));return Array.isArray(e)?e:null}class Catalog{constructor(e,t){this.pdfManager=e;this.xref=t;this._catDict=t.getCatalogObj();if(!(this._catDict instanceof i.Dict))throw new n.FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict;this._actualNumPages=null;this.fontCache=new i.RefSetCache;this.builtInCMapCache=new Map;this.standardFontDataCache=new Map;this.globalImageCache=new u.GlobalImageCache;this.pageKidsCountCache=new i.RefSetCache;this.pageIndexCache=new i.RefSetCache;this.nonBlendModesSet=new i.RefSet}get version(){const e=this._catDict.get("Version");return(0,n.shadow)(this,"version",e instanceof i.Name?e.name:null)}get lang(){const e=this._catDict.get("Lang");return(0,n.shadow)(this,"lang","string"==typeof e?(0,n.stringToPDFString)(e):null)}get needsRendering(){const e=this._catDict.get("NeedsRendering");return(0,n.shadow)(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this._catDict.get("Collection");t instanceof i.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)("Cannot fetch Collection entry; assuming no collection is present.")}return(0,n.shadow)(this,"collection",e)}get acroForm(){let e=null;try{const t=this._catDict.get("AcroForm");t instanceof i.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)("Cannot fetch AcroForm entry; assuming no forms are present.")}return(0,n.shadow)(this,"acroForm",e)}get acroFormRef(){const e=this._catDict.getRaw("AcroForm");return(0,n.shadow)(this,"acroFormRef",e instanceof i.Ref?e:null)}get metadata(){const e=this._catDict.getRaw("Metadata");if(!(e instanceof i.Ref))return(0,n.shadow)(this,"metadata",null);let t=null;try{const a=!(this.xref.encrypt&&this.xref.encrypt.encryptMetadata),r=this.xref.fetch(e,a);if(r instanceof o.BaseStream&&r.dict instanceof i.Dict){const e=r.dict.get("Type"),a=r.dict.get("Subtype");if((0,i.isName)(e,"Metadata")&&(0,i.isName)(a,"XML")){const e=(0,n.stringToUTF8String)(r.getString());e&&(t=new d.MetadataParser(e).serializable)}}}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.info)(`Skipping invalid Metadata: "${e}".`)}return(0,n.shadow)(this,"metadata",t)}get markInfo(){let e=null;try{e=this._readMarkInfo()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read mark info.")}return(0,n.shadow)(this,"markInfo",e)}_readMarkInfo(){const e=this._catDict.get("MarkInfo");if(!(e instanceof i.Dict))return null;const t={Marked:!1,UserProperties:!1,Suspects:!1};for(const a in t){const r=e.get(a);"boolean"==typeof r&&(t[a]=r)}return t}get structTreeRoot(){let e=null;try{e=this._readStructTreeRoot()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable read to structTreeRoot info.")}return(0,n.shadow)(this,"structTreeRoot",e)}_readStructTreeRoot(){const e=this._catDict.get("StructTreeRoot");if(!(e instanceof i.Dict))return null;const t=new f.StructTreeRoot(e);t.init();return t}get toplevelPagesDict(){const e=this._catDict.get("Pages");if(!(e instanceof i.Dict))throw new n.FormatError("Invalid top-level pages dictionary.");return(0,n.shadow)(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read document outline.")}return(0,n.shadow)(this,"documentOutline",e)}_readDocumentOutline(){let e=this._catDict.get("Outlines");if(!(e instanceof i.Dict))return null;e=e.getRaw("First");if(!(e instanceof i.Ref))return null;const t={items:[]},a=[{obj:e,parent:t}],r=new i.RefSet;r.put(e);const s=this.xref,o=new Uint8ClampedArray(3);for(;a.length>0;){const t=a.shift(),c=s.fetchIfRef(t.obj);if(null===c)continue;if(!c.has("Title"))throw new n.FormatError("Invalid outline item encountered.");const h={url:null,dest:null};Catalog.parseDestDictionary({destDict:c,resultObj:h,docBaseUrl:this.pdfManager.docBaseUrl});const u=c.get("Title"),d=c.get("F")||0,f=c.getArray("C"),g=c.get("Count");let p=o;!Array.isArray(f)||3!==f.length||0===f[0]&&0===f[1]&&0===f[2]||(p=l.ColorSpace.singletons.rgb.getRgb(f,0));const m={dest:h.dest,url:h.url,unsafeUrl:h.unsafeUrl,newWindow:h.newWindow,title:(0,n.stringToPDFString)(u),color:p,count:Number.isInteger(g)?g:void 0,bold:!!(2&d),italic:!!(1&d),items:[]};t.parent.items.push(m);e=c.getRaw("First");if(e instanceof i.Ref&&!r.has(e)){a.push({obj:e,parent:m});r.put(e)}e=c.getRaw("Next");if(e instanceof i.Ref&&!r.has(e)){a.push({obj:e,parent:t.parent});r.put(e)}}return t.items.length>0?t.items:null}get permissions(){let e=null;try{e=this._readPermissions()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read permissions.")}return(0,n.shadow)(this,"permissions",e)}_readPermissions(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof i.Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const a=[];for(const e in n.PermissionFlag){const r=n.PermissionFlag[e];t&r&&a.push(r)}return a}get optionalContentConfig(){let e=null;try{const t=this._catDict.get("OCProperties");if(!t)return(0,n.shadow)(this,"optionalContentConfig",null);const a=t.get("D");if(!a)return(0,n.shadow)(this,"optionalContentConfig",null);const r=t.get("OCGs");if(!Array.isArray(r))return(0,n.shadow)(this,"optionalContentConfig",null);const s=[],o=[];for(const e of r){if(!(e instanceof i.Ref))continue;o.push(e);const t=this.xref.fetchIfRef(e);s.push({id:e.toString(),name:"string"==typeof t.get("Name")?(0,n.stringToPDFString)(t.get("Name")):null,intent:"string"==typeof t.get("Intent")?(0,n.stringToPDFString)(t.get("Intent")):null})}e=this._readOptionalContentConfig(a,o);e.groups=s}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)(`Unable to read optional content config: ${e}`)}return(0,n.shadow)(this,"optionalContentConfig",e)}_readOptionalContentConfig(e,t){function parseOnOff(e){const a=[];if(Array.isArray(e))for(const r of e)r instanceof i.Ref&&t.includes(r)&&a.push(r.toString());return a}function parseOrder(e,a=0){if(!Array.isArray(e))return null;const n=[];for(const s of e){if(s instanceof i.Ref&&t.includes(s)){r.put(s);n.push(s.toString());continue}const e=parseNestedOrder(s,a);e&&n.push(e)}if(a>0)return n;const s=[];for(const e of t)r.has(e)||s.push(e.toString());s.length&&n.push({name:null,order:s});return n}function parseNestedOrder(e,t){if(++t>s){(0,n.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const r=a.fetchIfRef(e);if(!Array.isArray(r))return null;const i=a.fetchIfRef(r[0]);if("string"!=typeof i)return null;const o=parseOrder(r.slice(1),t);return o&&o.length?{name:(0,n.stringToPDFString)(i),order:o}:null}const a=this.xref,r=new i.RefSet,s=10;return{name:"string"==typeof e.get("Name")?(0,n.stringToPDFString)(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?(0,n.stringToPDFString)(e.get("Creator")):null,baseState:e.get("BaseState")instanceof i.Name?e.get("BaseState").name:null,on:parseOnOff(e.get("ON")),off:parseOnOff(e.get("OFF")),order:parseOrder(e.get("Order")),groups:null}}setActualNumPages(e=null){this._actualNumPages=e}get hasActualNumPages(){return null!==this._actualNumPages}get _pagesCount(){const e=this.toplevelPagesDict.get("Count");if(!Number.isInteger(e))throw new n.FormatError("Page count in top-level pages dictionary is not an integer.");return(0,n.shadow)(this,"_pagesCount",e)}get numPages(){return this.hasActualNumPages?this._actualNumPages:this._pagesCount}get destinations(){const e=this._readDests(),t=Object.create(null);if(e instanceof s.NameTree)for(const[a,r]of e.getAll()){const e=fetchDestination(r);e&&(t[(0,n.stringToPDFString)(a)]=e)}else e instanceof i.Dict&&e.forEach((function(e,a){const r=fetchDestination(a);r&&(t[e]=r)}));return(0,n.shadow)(this,"destinations",t)}getDestination(e){const t=this._readDests();if(t instanceof s.NameTree){const a=fetchDestination(t.get(e));if(a)return a;const r=this.destinations[e];if(r){(0,n.warn)(`Found "${e}" at an incorrect position in the NameTree.`);return r}}else if(t instanceof i.Dict){const a=fetchDestination(t.get(e));if(a)return a}return null}_readDests(){const e=this._catDict.get("Names");return e&&e.has("Dests")?new s.NameTree(e.getRaw("Dests"),this.xref):this._catDict.has("Dests")?this._catDict.get("Dests"):void 0}get pageLabels(){let e=null;try{e=this._readPageLabels()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,n.warn)("Unable to read page labels.")}return(0,n.shadow)(this,"pageLabels",e)}_readPageLabels(){const e=this._catDict.getRaw("PageLabels");if(!e)return null;const t=new Array(this.numPages);let a=null,o="";const c=new s.NumberTree(e,this.xref).getAll();let l="",h=1;for(let e=0,s=this.numPages;e=1))throw new n.FormatError("Invalid start in PageLabel dictionary.");h=e}else h=1}switch(a){case"D":l=h;break;case"R":case"r":l=(0,r.toRomanNumerals)(h,"r"===a);break;case"A":case"a":const e=26,t=65,i=97,s="a"===a?i:t,o=h-1;l=String.fromCharCode(s+o%e).repeat(Math.floor(o/e)+1);break;default:if(a)throw new n.FormatError(`Invalid style "${a}" in PageLabel dictionary.`);l=""}t[e]=o+l;h++}return t}get pageLayout(){const e=this._catDict.get("PageLayout");let t="";if(e instanceof i.Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return(0,n.shadow)(this,"pageLayout",t)}get pageMode(){const e=this._catDict.get("PageMode");let t="UseNone";if(e instanceof i.Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return(0,n.shadow)(this,"pageMode",t)}get viewerPreferences(){const e=this._catDict.get("ViewerPreferences");if(!(e instanceof i.Dict))return(0,n.shadow)(this,"viewerPreferences",null);let t=null;for(const a of e.getKeys()){const r=e.get(a);let s;switch(a){case"HideToolbar":case"HideMenubar":case"HideWindowUI":case"FitWindow":case"CenterWindow":case"DisplayDocTitle":case"PickTrayByPDFSize":"boolean"==typeof r&&(s=r);break;case"NonFullScreenPageMode":if(r instanceof i.Name)switch(r.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"UseOC":s=r.name;break;default:s="UseNone"}break;case"Direction":if(r instanceof i.Name)switch(r.name){case"L2R":case"R2L":s=r.name;break;default:s="L2R"}break;case"ViewArea":case"ViewClip":case"PrintArea":case"PrintClip":if(r instanceof i.Name)switch(r.name){case"MediaBox":case"CropBox":case"BleedBox":case"TrimBox":case"ArtBox":s=r.name;break;default:s="CropBox"}break;case"PrintScaling":if(r instanceof i.Name)switch(r.name){case"None":case"AppDefault":s=r.name;break;default:s="AppDefault"}break;case"Duplex":if(r instanceof i.Name)switch(r.name){case"Simplex":case"DuplexFlipShortEdge":case"DuplexFlipLongEdge":s=r.name;break;default:s="None"}break;case"PrintPageRange":if(Array.isArray(r)&&r.length%2==0){r.every(((e,t,a)=>Number.isInteger(e)&&e>0&&(0===t||e>=a[t-1])&&e<=this.numPages))&&(s=r)}break;case"NumCopies":Number.isInteger(r)&&r>0&&(s=r);break;default:(0,n.warn)(`Ignoring non-standard key in ViewerPreferences: ${a}.`);continue}if(void 0!==s){t||(t=Object.create(null));t[a]=s}else(0,n.warn)(`Bad value, for key "${a}", in ViewerPreferences: ${r}.`)}return(0,n.shadow)(this,"viewerPreferences",t)}get openAction(){const e=this._catDict.get("OpenAction"),t=Object.create(null);if(e instanceof i.Dict){const a=new i.Dict(this.xref);a.set("A",e);const r={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:a,resultObj:r});Array.isArray(r.dest)?t.dest=r.dest:r.action&&(t.action=r.action)}else Array.isArray(e)&&(t.dest=e);return(0,n.shadow)(this,"openAction",(0,n.objectSize)(t)>0?t:null)}get attachments(){const e=this._catDict.get("Names");let t=null;if(e instanceof i.Dict&&e.has("EmbeddedFiles")){const a=new s.NameTree(e.getRaw("EmbeddedFiles"),this.xref);for(const[e,r]of a.getAll()){const a=new h.FileSpec(r,this.xref);t||(t=Object.create(null));t[(0,n.stringToPDFString)(e)]=a.serializable}}return(0,n.shadow)(this,"attachments",t)}get xfaImages(){const e=this._catDict.get("Names");let t=null;if(e instanceof i.Dict&&e.has("XFAImages")){const a=new s.NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,r]of a.getAll()){t||(t=new i.Dict(this.xref));t.set((0,n.stringToPDFString)(e),r)}}return(0,n.shadow)(this,"xfaImages",t)}_collectJavaScript(){const e=this._catDict.get("Names");let t=null;function appendIfJavaScriptDict(e,a){if(!(a instanceof i.Dict))return;if(!(0,i.isName)(a.get("S"),"JavaScript"))return;let r=a.get("JS");if(r instanceof o.BaseStream)r=r.getString();else if("string"!=typeof r)return;null===t&&(t=new Map);r=(0,n.stringToPDFString)(r).replace(/\u0000/g,"");t.set(e,r)}if(e instanceof i.Dict&&e.has("JavaScript")){const t=new s.NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,a]of t.getAll())appendIfJavaScriptDict((0,n.stringToPDFString)(e),a)}const a=this._catDict.get("OpenAction");a&&appendIfJavaScriptDict("OpenAction",a);return t}get javaScript(){const e=this._collectJavaScript();return(0,n.shadow)(this,"javaScript",e?[...e.values()]:null)}get jsActions(){const e=this._collectJavaScript();let t=(0,r.collectActions)(this.xref,this._catDict,n.DocumentActionEventType);if(e){t||(t=Object.create(null));for(const[a,r]of e)a in t?t[a].push(r):t[a]=[r]}return(0,n.shadow)(this,"jsActions",t)}async fontFallback(e,t){const a=await Promise.all(this.fontCache);for(const r of a)if(r.loadedName===e){r.fallback(t);return}}async cleanup(e=!1){(0,c.clearGlobalCaches)();this.globalImageCache.clear(e);this.pageKidsCountCache.clear();this.pageIndexCache.clear();this.nonBlendModesSet.clear();const t=await Promise.all(this.fontCache);for(const{dict:e}of t)delete e.cacheKey;this.fontCache.clear();this.builtInCMapCache.clear();this.standardFontDataCache.clear()}async getPageDict(e){const t=[this.toplevelPagesDict],a=new i.RefSet,r=this._catDict.getRaw("Pages");r instanceof i.Ref&&a.put(r);const s=this.xref,o=this.pageKidsCountCache,c=this.pageIndexCache;let l=0;for(;t.length;){const r=t.pop();if(r instanceof i.Ref){const h=o.get(r);if(h>=0&&l+h<=e){l+=h;continue}if(a.has(r))throw new n.FormatError("Pages tree contains circular reference.");a.put(r);const u=await s.fetchAsync(r);if(u instanceof i.Dict){let t=u.getRaw("Type");t instanceof i.Ref&&(t=await s.fetchAsync(t));if((0,i.isName)(t,"Page")||!u.has("Kids")){o.has(r)||o.put(r,1);c.has(r)||c.put(r,l);if(l===e)return[u,r];l++;continue}}t.push(u);continue}if(!(r instanceof i.Dict))throw new n.FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:h}=r;let u=r.getRaw("Count");u instanceof i.Ref&&(u=await s.fetchAsync(u));if(Number.isInteger(u)&&u>=0){h&&!o.has(h)&&o.put(h,u);if(l+u<=e){l+=u;continue}}let d=r.getRaw("Kids");d instanceof i.Ref&&(d=await s.fetchAsync(d));if(!Array.isArray(d)){let t=r.getRaw("Type");t instanceof i.Ref&&(t=await s.fetchAsync(t));if((0,i.isName)(t,"Page")||!r.has("Kids")){if(l===e)return[r,null];l++;continue}throw new n.FormatError("Page dictionary kids object is not an array.")}for(let e=d.length-1;e>=0;e--)t.push(d[e])}throw new Error(`Page index ${e} not found.`)}async getAllPageDicts(e=!1){const t=[{currentNode:this.toplevelPagesDict,posInKids:0}],a=new i.RefSet,s=this._catDict.getRaw("Pages");s instanceof i.Ref&&a.put(s);const o=new Map,c=this.xref,l=this.pageIndexCache;let h=0;function addPageDict(e,t){t&&!l.has(t)&&l.put(t,h);o.set(h++,[e,t])}function addPageError(t){if(t instanceof r.XRefEntryException&&!e)throw t;o.set(h++,[t,null])}for(;t.length>0;){const e=t.at(-1),{currentNode:r,posInKids:s}=e;let o=r.getRaw("Kids");if(o instanceof i.Ref)try{o=await c.fetchAsync(o)}catch(e){addPageError(e);break}if(!Array.isArray(o)){addPageError(new n.FormatError("Page dictionary kids object is not an array."));break}if(s>=o.length){t.pop();continue}const l=o[s];let h;if(l instanceof i.Ref){if(a.has(l)){addPageError(new n.FormatError("Pages tree contains circular reference."));break}a.put(l);try{h=await c.fetchAsync(l)}catch(e){addPageError(e);break}}else h=l;if(!(h instanceof i.Dict)){addPageError(new n.FormatError("Page dictionary kid reference points to wrong type of object."));break}let u=h.getRaw("Type");if(u instanceof i.Ref)try{u=await c.fetchAsync(u)}catch(e){addPageError(e);break}(0,i.isName)(u,"Page")||!h.has("Kids")?addPageDict(h,l instanceof i.Ref?l:null):t.push({currentNode:h,posInKids:0});e.posInKids++}return o}getPageIndex(e){const t=this.pageIndexCache.get(e);if(void 0!==t)return Promise.resolve(t);const a=this.xref;let r=0;const next=t=>function pagesBeforeRef(t){let r,s=0;return a.fetchAsync(t).then((function(a){if((0,i.isRefsEqual)(t,e)&&!(0,i.isDict)(a,"Page")&&!(a instanceof i.Dict&&!a.has("Type")&&a.has("Contents")))throw new n.FormatError("The reference does not point to a /Page dictionary.");if(!a)return null;if(!(a instanceof i.Dict))throw new n.FormatError("Node must be a dictionary.");r=a.getRaw("Parent");return a.getAsync("Parent")})).then((function(e){if(!e)return null;if(!(e instanceof i.Dict))throw new n.FormatError("Parent must be a dictionary.");return e.getAsync("Kids")})).then((function(e){if(!e)return null;const o=[];let c=!1;for(let r=0,l=e.length;r{if(!t){this.pageIndexCache.put(e,r);return r}const[a,n]=t;r+=a;return next(n)}));return next(e)}get baseUrl(){const e=this._catDict.get("URI");if(e instanceof i.Dict){const t=e.get("Base");if("string"==typeof t){const e=(0,n.createValidAbsoluteUrl)(t,null,{tryConvertEncoding:!0});if(e)return(0,n.shadow)(this,"baseUrl",e.href)}}return(0,n.shadow)(this,"baseUrl",null)}static parseDestDictionary(e){const t=e.destDict;if(!(t instanceof i.Dict)){(0,n.warn)("parseDestDictionary: `destDict` must be a dictionary.");return}const a=e.resultObj;if("object"!=typeof a){(0,n.warn)("parseDestDictionary: `resultObj` must be an object.");return}const s=e.docBaseUrl||null;let c,l,h=t.get("A");if(!(h instanceof i.Dict))if(t.has("Dest"))h=t.get("Dest");else{h=t.get("AA");h instanceof i.Dict&&(h.has("D")?h=h.get("D"):h.has("U")&&(h=h.get("U")))}if(h instanceof i.Dict){const e=h.get("S");if(!(e instanceof i.Name)){(0,n.warn)("parseDestDictionary: Invalid type in Action dictionary.");return}const t=e.name;switch(t){case"ResetForm":const e=h.get("Flags"),s=0==(1&("number"==typeof e?e:0)),u=[],d=[];for(const e of h.get("Fields")||[])e instanceof i.Ref?d.push(e.toString()):"string"==typeof e&&u.push((0,n.stringToPDFString)(e));a.resetForm={fields:u,refs:d,include:s};break;case"URI":c=h.get("URI");c instanceof i.Name&&(c="/"+c.name);break;case"GoTo":l=h.get("D");break;case"Launch":case"GoToR":const f=h.get("F");f instanceof i.Dict?c=f.get("F")||null:"string"==typeof f&&(c=f);let g=h.get("D");if(g){g instanceof i.Name&&(g=g.name);if("string"==typeof c){const e=c.split("#")[0];"string"==typeof g?c=e+"#"+g:Array.isArray(g)&&(c=e+"#"+JSON.stringify(g))}}const p=h.get("NewWindow");"boolean"==typeof p&&(a.newWindow=p);break;case"Named":const m=h.get("N");m instanceof i.Name&&(a.action=m.name);break;case"JavaScript":const b=h.get("JS");let y;b instanceof o.BaseStream?y=b.getString():"string"==typeof b&&(y=b);const w=y&&(0,r.recoverJsURL)((0,n.stringToPDFString)(y));if(w){c=w.url;a.newWindow=w.newWindow;break}default:if("JavaScript"===t||"SubmitForm"===t)break;(0,n.warn)(`parseDestDictionary - unsupported action: "${t}".`)}}else t.has("Dest")&&(l=t.get("Dest"));if("string"==typeof c){const e=(0,n.createValidAbsoluteUrl)(c,s,{addDefaultProtocol:!0,tryConvertEncoding:!0});e&&(a.url=e.href);a.unsafeUrl=c}if(l){l instanceof i.Name&&(l=l.name);"string"==typeof l?a.dest=(0,n.stringToPDFString)(l):Array.isArray(l)&&(a.dest=l)}}}t.Catalog=Catalog},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NumberTree=t.NameTree=void 0;var r=a(5),n=a(2);class NameOrNumberTree{constructor(e,t,a){this.constructor===NameOrNumberTree&&(0,n.unreachable)("Cannot initialize NameOrNumberTree.");this.root=e;this.xref=t;this._type=a}getAll(){const e=new Map;if(!this.root)return e;const t=this.xref,a=new r.RefSet;a.put(this.root);const i=[this.root];for(;i.length>0;){const s=t.fetchIfRef(i.shift());if(!(s instanceof r.Dict))continue;if(s.has("Kids")){const e=s.get("Kids");if(!Array.isArray(e))continue;for(const t of e){if(a.has(t))throw new n.FormatError(`Duplicate entry in "${this._type}" tree.`);i.push(t);a.put(t)}continue}const o=s.get(this._type);if(Array.isArray(o))for(let a=0,r=o.length;a10){(0,n.warn)(`Search depth limit reached for "${this._type}" tree.`);return null}const i=a.get("Kids");if(!Array.isArray(i))return null;let s=0,o=i.length-1;for(;s<=o;){const r=s+o>>1,n=t.fetchIfRef(i[r]),c=n.get("Limits");if(et.fetchIfRef(c[1]))){a=n;break}s=r+1}}if(s>o)return null}const i=a.get(this._type);if(Array.isArray(i)){let a=0,r=i.length-2;for(;a<=r;){const n=a+r>>1,s=n+(1&n),o=t.fetchIfRef(i[s]);if(eo))return t.fetchIfRef(i[s+1]);a=s+2}}}return null}}t.NameTree=class NameTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Names")}};t.NumberTree=class NumberTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Nums")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.clearGlobalCaches=function clearGlobalCaches(){(0,r.clearPrimitiveCaches)();(0,n.clearUnicodeCaches)()};var r=a(5),n=a(40)},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FileSpec=void 0;var r=a(2),n=a(7),i=a(5);function pickPlatformItem(e){return e.has("UF")?e.get("UF"):e.has("F")?e.get("F"):e.has("Unix")?e.get("Unix"):e.has("Mac")?e.get("Mac"):e.has("DOS")?e.get("DOS"):null}t.FileSpec=class FileSpec{constructor(e,t){if(e instanceof i.Dict){this.xref=t;this.root=e;e.has("FS")&&(this.fs=e.get("FS"));this.description=e.has("Desc")?(0,r.stringToPDFString)(e.get("Desc")):"";e.has("RF")&&(0,r.warn)("Related file specifications are not supported");this.contentAvailable=!0;if(!e.has("EF")){this.contentAvailable=!1;(0,r.warn)("Non-embedded file specifications are not supported")}}}get filename(){if(!this._filename&&this.root){const e=pickPlatformItem(this.root)||"unnamed";this._filename=(0,r.stringToPDFString)(e).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename}get content(){if(!this.contentAvailable)return null;!this.contentRef&&this.root&&(this.contentRef=pickPlatformItem(this.root.get("EF")));let e=null;if(this.contentRef){const t=this.xref.fetchIfRef(this.contentRef);t instanceof n.BaseStream?e=t.getBytes():(0,r.warn)("Embedded file specification points to non-existing/invalid content")}else(0,r.warn)("Embedded file specification does not have a content");return e}get serializable(){return{filename:this.filename,content:this.content}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.MetadataParser=void 0;var r=a(66);t.MetadataParser=class MetadataParser{constructor(e){e=this._repair(e);const t=new r.SimpleXMLParser({lowerCaseName:!0}).parseFromString(e);this._metadataMap=new Map;this._data=e;t&&this._parse(t)}_repair(e){return e.replace(/^[^<]+/,"").replace(/>\\376\\377([^<]+)/g,(function(e,t){const a=t.replace(/\\([0-3])([0-7])([0-7])/g,(function(e,t,a,r){return String.fromCharCode(64*t+8*a+1*r)})).replace(/&(amp|apos|gt|lt|quot);/g,(function(e,t){switch(t){case"amp":return"&";case"apos":return"'";case"gt":return">";case"lt":return"<";case"quot":return'"'}throw new Error(`_repair: ${t} isn't defined.`)})),r=[];for(let e=0,t=a.length;e=32&&t<127&&60!==t&&62!==t&&38!==t?r.push(String.fromCharCode(t)):r.push("&#x"+(65536+t).toString(16).substring(1)+";")}return">"+r.join("")}))}_getSequence(e){const t=e.nodeName;return"rdf:bag"!==t&&"rdf:seq"!==t&&"rdf:alt"!==t?null:e.childNodes.filter((e=>"rdf:li"===e.nodeName))}_parseArray(e){if(!e.hasChildNodes())return;const[t]=e.childNodes,a=this._getSequence(t)||[];this._metadataMap.set(e.nodeName,a.map((e=>e.textContent.trim())))}_parse(e){let t=e.documentElement;if("rdf:rdf"!==t.nodeName){t=t.firstChild;for(;t&&"rdf:rdf"!==t.nodeName;)t=t.nextSibling}if(t&&"rdf:rdf"===t.nodeName&&t.hasChildNodes())for(const e of t.childNodes)if("rdf:description"===e.nodeName)for(const t of e.childNodes){const e=t.nodeName;switch(e){case"#text":continue;case"dc:creator":case"dc:subject":this._parseArray(t);continue}this._metadataMap.set(e,t.textContent.trim())}}get serializable(){return{parsedData:this._metadataMap,rawData:this._data}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StructTreeRoot=t.StructTreePage=void 0;var r=a(5),n=a(2),i=a(70);const s="PAGE_CONTENT",o="STREAM_CONTENT",c="OBJECT",l="ELEMENT";t.StructTreeRoot=class StructTreeRoot{constructor(e){this.dict=e;this.roleMap=new Map}init(){this.readRoleMap()}readRoleMap(){const e=this.dict.get("RoleMap");e instanceof r.Dict&&e.forEach(((e,t)=>{t instanceof r.Name&&this.roleMap.set(e,t.name)}))}};class StructElementNode{constructor(e,t){this.tree=e;this.dict=t;this.kids=[];this.parseKids()}get role(){const e=this.dict.get("S"),t=e instanceof r.Name?e.name:"",{root:a}=this.tree;return a.roleMap.has(t)?a.roleMap.get(t):t}parseKids(){let e=null;const t=this.dict.getRaw("Pg");t instanceof r.Ref&&(e=t.toString());const a=this.dict.get("K");if(Array.isArray(a))for(const t of a){const a=this.parseKid(e,t);a&&this.kids.push(a)}else{const t=this.parseKid(e,a);t&&this.kids.push(t)}}parseKid(e,t){if(Number.isInteger(t))return this.tree.pageDict.objId!==e?null:new StructElement({type:s,mcid:t,pageObjId:e});let a=null;t instanceof r.Ref?a=this.dict.xref.fetch(t):t instanceof r.Dict&&(a=t);if(!a)return null;const n=a.getRaw("Pg");n instanceof r.Ref&&(e=n.toString());const i=a.get("Type")instanceof r.Name?a.get("Type").name:null;return"MCR"===i?this.tree.pageDict.objId!==e?null:new StructElement({type:o,refObjId:a.getRaw("Stm")instanceof r.Ref?a.getRaw("Stm").toString():null,pageObjId:e,mcid:a.get("MCID")}):"OBJR"===i?this.tree.pageDict.objId!==e?null:new StructElement({type:c,refObjId:a.getRaw("Obj")instanceof r.Ref?a.getRaw("Obj").toString():null,pageObjId:e}):new StructElement({type:l,dict:a})}}class StructElement{constructor({type:e,dict:t=null,mcid:a=null,pageObjId:r=null,refObjId:n=null}){this.type=e;this.dict=t;this.mcid=a;this.pageObjId=r;this.refObjId=n;this.parentNode=null}}t.StructTreePage=class StructTreePage{constructor(e,t){this.root=e;this.rootDict=e?e.dict:null;this.pageDict=t;this.nodes=[]}parse(){if(!this.root||!this.rootDict)return;const e=this.rootDict.get("ParentTree");if(!e)return;const t=this.pageDict.get("StructParents");if(!Number.isInteger(t))return;const a=new i.NumberTree(e,this.rootDict.xref).get(t);if(!Array.isArray(a))return;const n=new Map;for(const e of a)e instanceof r.Ref&&this.addNode(this.rootDict.xref.fetch(e),n)}addNode(e,t,a=0){if(a>40){(0,n.warn)("StructTree MAX_DEPTH reached.");return null}if(t.has(e))return t.get(e);const i=new StructElementNode(this,e);t.set(e,i);const s=e.get("P");if(!s||(0,r.isName)(s.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,i)||t.delete(e);return i}const o=this.addNode(s,t,a+1);if(!o)return i;let c=!1;for(const t of o.kids)if(t.type===l&&t.dict===e){t.parentNode=i;c=!0}c||t.delete(e);return i}addTopLevelNode(e,t){const a=this.rootDict.get("K");if(!a)return!1;if(a instanceof r.Dict){if(a.objId!==e.objId)return!1;this.nodes[0]=t;return!0}if(!Array.isArray(a))return!0;let n=!1;for(let r=0;r40){(0,n.warn)("StructTree too deep to be fully serialized.");return}const r=Object.create(null);r.role=e.role;r.children=[];t.children.push(r);const i=e.dict.get("Alt");"string"==typeof i&&(r.alt=(0,n.stringToPDFString)(i));const h=e.dict.get("Lang");"string"==typeof h&&(r.lang=(0,n.stringToPDFString)(h));for(const t of e.kids){const e=t.type===l?t.parentNode:null;e?nodeToSerializable(e,r,a+1):t.type===s||t.type===o?r.children.push({type:"content",id:`page${t.pageObjId}_mcid${t.mcid}`}):t.type===c&&r.children.push({type:"object",id:t.refObjId})}}const e=Object.create(null);e.children=[];e.role="Root";for(const t of this.nodes)t&&nodeToSerializable(t,e);return e}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ObjectLoader=void 0;var r=a(5),n=a(7),i=a(6),s=a(2);function addChildren(e,t){if(e instanceof r.Dict)e=e.getRawValues();else if(e instanceof n.BaseStream)e=e.dict.getRawValues();else if(!Array.isArray(e))return;for(const i of e)((a=i)instanceof r.Ref||a instanceof r.Dict||a instanceof n.BaseStream||Array.isArray(a))&&t.push(i);var a}t.ObjectLoader=class ObjectLoader{constructor(e,t,a){this.dict=e;this.keys=t;this.xref=a;this.refSet=null}async load(){if(this.xref.stream.isDataLoaded)return;const{keys:e,dict:t}=this;this.refSet=new r.RefSet;const a=[];for(let r=0,n=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.XFAFactory=void 0;var r=a(77),n=a(81),i=a(87),s=a(85),o=a(78),c=a(2),l=a(88),h=a(98);class XFAFactory{constructor(e){try{this.root=(new l.XFAParser).parse(XFAFactory._createDocument(e));const t=new n.Binder(this.root);this.form=t.bind();this.dataHandler=new i.DataHandler(this.root,t.getData());this.form[r.$globalData].template=this.form}catch(e){(0,c.warn)(`XFA - an error occurred during parsing and binding: ${e}`)}}isValid(){return this.root&&this.form}_createPagesHelper(){const e=this.form[r.$toPages]();return new Promise(((t,a)=>{const nextIteration=()=>{try{const a=e.next();a.done?t(a.value):setTimeout(nextIteration,0)}catch(e){a(e)}};setTimeout(nextIteration,0)}))}async _createPages(){try{this.pages=await this._createPagesHelper();this.dims=this.pages.children.map((e=>{const{width:t,height:a}=e.attributes.style;return[0,0,parseInt(t),parseInt(a)]}))}catch(e){(0,c.warn)(`XFA - an error occurred during layout: ${e}`)}}getBoundingBox(e){return this.dims[e]}async getNumPages(){this.pages||await this._createPages();return this.dims.length}setImages(e){this.form[r.$globalData].images=e}setFonts(e){this.form[r.$globalData].fontFinder=new s.FontFinder(e);const t=[];for(let e of this.form[r.$globalData].usedTypefaces){e=(0,o.stripQuotes)(e);this.form[r.$globalData].fontFinder.find(e)||t.push(e)}return t.length>0?t:null}appendFonts(e,t){this.form[r.$globalData].fontFinder.add(e,t)}async getPages(){this.pages||await this._createPages();const e=this.pages;this.pages=null;return e}serializeData(e){return this.dataHandler.serialize(e)}static _createDocument(e){return e["/xdp:xdp"]?Object.values(e).join(""):e["xdp:xdp"]}static getRichTextAsHtml(e){if(!e||"string"!=typeof e)return null;try{let t=new l.XFAParser(h.XhtmlNamespace,!0).parse(e);if(!["body","xhtml"].includes(t[r.$nodeName])){const e=h.XhtmlNamespace.body({});e[r.$appendChild](t);t=e}const a=t[r.$toHTML]();if(!a.success)return null;const{html:n}=a,{attributes:i}=n;if(i){i.class&&(i.class=i.class.filter((e=>!e.startsWith("xfa"))));i.dir="auto"}return{html:n,str:t[r.$text]()}}catch(e){(0,c.warn)(`XFA - an error occurred during parsing of rich text: ${e}`)}return null}}t.XFAFactory=XFAFactory},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XmlObject=t.XFAObjectArray=t.XFAObject=t.XFAAttribute=t.StringObject=t.OptionObject=t.Option10=t.Option01=t.IntegerObject=t.ContentObject=t.$uid=t.$toStyle=t.$toString=t.$toPages=t.$toHTML=t.$text=t.$tabIndex=t.$setValue=t.$setSetAttributes=t.$setId=t.$searchNode=t.$root=t.$resolvePrototypes=t.$removeChild=t.$pushPara=t.$pushGlyphs=t.$popPara=t.$onText=t.$onChildCheck=t.$onChild=t.$nsAttributes=t.$nodeName=t.$namespaceId=t.$isUsable=t.$isTransparent=t.$isThereMoreWidth=t.$isSplittable=t.$isNsAgnostic=t.$isDescendent=t.$isDataValue=t.$isCDATAXml=t.$isBindable=t.$insertAt=t.$indexOf=t.$ids=t.$hasSettableValue=t.$globalData=t.$getTemplateRoot=t.$getSubformParent=t.$getRealChildrenByNameIt=t.$getParent=t.$getNextPage=t.$getExtra=t.$getDataValue=t.$getContainedChildren=t.$getChildrenByNameIt=t.$getChildrenByName=t.$getChildrenByClass=t.$getChildren=t.$getAvailableSpace=t.$getAttributes=t.$getAttributeIt=t.$flushHTML=t.$finalize=t.$extra=t.$dump=t.$data=t.$content=t.$consumed=t.$clone=t.$cleanup=t.$cleanPage=t.$clean=t.$childrenToHTML=t.$appendChild=t.$addHTML=t.$acceptWhitespace=void 0;var r=a(78),n=a(2),i=a(6),s=a(79),o=a(80);const c=Symbol();t.$acceptWhitespace=c;const l=Symbol();t.$addHTML=l;const h=Symbol();t.$appendChild=h;const u=Symbol();t.$childrenToHTML=u;const d=Symbol();t.$clean=d;const f=Symbol();t.$cleanPage=f;const g=Symbol();t.$cleanup=g;const p=Symbol();t.$clone=p;const m=Symbol();t.$consumed=m;const b=Symbol("content");t.$content=b;const y=Symbol("data");t.$data=y;const w=Symbol();t.$dump=w;const S=Symbol("extra");t.$extra=S;const x=Symbol();t.$finalize=x;const k=Symbol();t.$flushHTML=k;const C=Symbol();t.$getAttributeIt=C;const v=Symbol();t.$getAttributes=v;const F=Symbol();t.$getAvailableSpace=F;const O=Symbol();t.$getChildrenByClass=O;const T=Symbol();t.$getChildrenByName=T;const M=Symbol();t.$getChildrenByNameIt=M;const E=Symbol();t.$getDataValue=E;const D=Symbol();t.$getExtra=D;const N=Symbol();t.$getRealChildrenByNameIt=N;const R=Symbol();t.$getChildren=R;const L=Symbol();t.$getContainedChildren=L;const j=Symbol();t.$getNextPage=j;const $=Symbol();t.$getSubformParent=$;const _=Symbol();t.$getParent=_;const U=Symbol();t.$getTemplateRoot=U;const X=Symbol();t.$globalData=X;const H=Symbol();t.$hasSettableValue=H;const q=Symbol();t.$ids=q;const z=Symbol();t.$indexOf=z;const W=Symbol();t.$insertAt=W;const G=Symbol();t.$isCDATAXml=G;const V=Symbol();t.$isBindable=V;const K=Symbol();t.$isDataValue=K;const Y=Symbol();t.$isDescendent=Y;const J=Symbol();t.$isNsAgnostic=J;const Z=Symbol();t.$isSplittable=Z;const Q=Symbol();t.$isThereMoreWidth=Q;const ee=Symbol();t.$isTransparent=ee;const te=Symbol();t.$isUsable=te;const ae=Symbol(),re=Symbol("namespaceId");t.$namespaceId=re;const ne=Symbol("nodeName");t.$nodeName=ne;const ie=Symbol();t.$nsAttributes=ie;const se=Symbol();t.$onChild=se;const oe=Symbol();t.$onChildCheck=oe;const ce=Symbol();t.$onText=ce;const le=Symbol();t.$pushGlyphs=le;const he=Symbol();t.$popPara=he;const ue=Symbol();t.$pushPara=ue;const de=Symbol();t.$removeChild=de;const fe=Symbol("root");t.$root=fe;const ge=Symbol();t.$resolvePrototypes=ge;const pe=Symbol();t.$searchNode=pe;const me=Symbol();t.$setId=me;const be=Symbol();t.$setSetAttributes=be;const ye=Symbol();t.$setValue=ye;const we=Symbol();t.$tabIndex=we;const Se=Symbol();t.$text=Se;const xe=Symbol();t.$toPages=xe;const Ae=Symbol();t.$toHTML=Ae;const ke=Symbol();t.$toString=ke;const Ce=Symbol();t.$toStyle=Ce;const ve=Symbol("uid");t.$uid=ve;const Fe=Symbol(),Oe=Symbol(),Te=Symbol(),Ie=Symbol("_children"),Me=Symbol(),Pe=Symbol(),Ee=Symbol(),De=Symbol(),Ne=Symbol(),Be=Symbol(),Re=Symbol(),Le=Symbol(),je=Symbol(),$e=Symbol("parent"),_e=Symbol(),Ue=Symbol(),Xe=Symbol();let He=0;const qe=s.NamespaceIds.datasets.id;class XFAObject{constructor(e,t,a=!1){this[re]=e;this[ne]=t;this[Re]=a;this[$e]=null;this[Ie]=[];this[ve]=`${t}${He++}`;this[X]=null}[se](e){if(!this[Re]||!this[oe](e))return!1;const t=e[ne],a=this[t];if(!(a instanceof XFAObjectArray)){null!==a&&this[de](a);this[t]=e;this[h](e);return!0}if(a.push(e)){this[h](e);return!0}let r="";this.id?r=` (id: ${this.id})`:this.name&&(r=` (name: ${this.name} ${this.h.value})`);(0,n.warn)(`XFA - node "${this[ne]}"${r} has already enough "${t}"!`);return!1}[oe](e){return this.hasOwnProperty(e[ne])&&e[re]===this[re]}[J](){return!1}[c](){return!1}[G](){return!1}[V](){return!1}[he](){this.para&&this[U]()[S].paraStack.pop()}[ue](){this[U]()[S].paraStack.push(this.para)}[me](e){this.id&&this[re]===s.NamespaceIds.template.id&&e.set(this.id,this)}[U](){return this[X].template}[Z](){return!1}[Q](){return!1}[h](e){e[$e]=this;this[Ie].push(e);!e[X]&&this[X]&&(e[X]=this[X])}[de](e){const t=this[Ie].indexOf(e);this[Ie].splice(t,1)}[H](){return this.hasOwnProperty("value")}[ye](e){}[ce](e){}[x](){}[d](e){delete this[Re];if(this[g]){e.clean(this[g]);delete this[g]}}[z](e){return this[Ie].indexOf(e)}[W](e,t){t[$e]=this;this[Ie].splice(e,0,t);!t[X]&&this[X]&&(t[X]=this[X])}[ee](){return!this.name}[ae](){return""}[Se](){return 0===this[Ie].length?this[b]:this[Ie].map((e=>e[Se]())).join("")}get[Te](){const e=Object.getPrototypeOf(this);if(!e._attributes){const t=e._attributes=new Set;for(const e of Object.getOwnPropertyNames(this)){if(null===this[e]||this[e]instanceof XFAObject||this[e]instanceof XFAObjectArray)break;t.add(e)}}return(0,n.shadow)(this,Te,e._attributes)}[Y](e){let t=this;for(;t;){if(t===e)return!0;t=t[_]()}return!1}[_](){return this[$e]}[$](){return this[_]()}[R](e=null){return e?this[e]:this[Ie]}[w](){const e=Object.create(null);this[b]&&(e.$content=this[b]);for(const t of Object.getOwnPropertyNames(this)){const a=this[t];null!==a&&(a instanceof XFAObject?e[t]=a[w]():a instanceof XFAObjectArray?a.isEmpty()||(e[t]=a.dump()):e[t]=a)}return e}[Ce](){return null}[Ae](){return r.HTMLResult.EMPTY}*[L](){for(const e of this[R]())yield e}*[De](e,t){for(const a of this[L]())if(!e||t===e.has(a[ne])){const e=this[F](),t=a[Ae](e);t.success||(this[S].failingNode=a);yield t}}[k](){return null}[l](e,t){this[S].children.push(e)}[F](){}[u]({filter:e=null,include:t=!0}){if(this[S].generator){const e=this[F](),t=this[S].failingNode[Ae](e);if(!t.success)return t;t.html&&this[l](t.html,t.bbox);delete this[S].failingNode}else this[S].generator=this[De](e,t);for(;;){const e=this[S].generator.next();if(e.done)break;const t=e.value;if(!t.success)return t;t.html&&this[l](t.html,t.bbox)}this[S].generator=null;return r.HTMLResult.EMPTY}[be](e){this[Ue]=new Set(Object.keys(e))}[Be](e){const t=this[Te],a=this[Ue];return[...e].filter((e=>t.has(e)&&!a.has(e)))}[ge](e,t=new Set){for(const a of this[Ie])a[_e](e,t)}[_e](e,t){const a=this[Ne](e,t);a?this[Fe](a,e,t):this[ge](e,t)}[Ne](e,t){const{use:a,usehref:r}=this;if(!a&&!r)return null;let i=null,s=null,c=null,l=a;if(r){l=r;r.startsWith("#som(")&&r.endsWith(")")?s=r.slice("#som(".length,r.length-1):r.startsWith(".#som(")&&r.endsWith(")")?s=r.slice(".#som(".length,r.length-1):r.startsWith("#")?c=r.slice(1):r.startsWith(".#")&&(c=r.slice(2))}else a.startsWith("#")?c=a.slice(1):s=a;this.use=this.usehref="";if(c)i=e.get(c);else{i=(0,o.searchNode)(e.get(fe),this,s,!0,!1);i&&(i=i[0])}if(!i){(0,n.warn)(`XFA - Invalid prototype reference: ${l}.`);return null}if(i[ne]!==this[ne]){(0,n.warn)(`XFA - Incompatible prototype: ${i[ne]} !== ${this[ne]}.`);return null}if(t.has(i)){(0,n.warn)("XFA - Cycle detected in prototypes use.");return null}t.add(i);const h=i[Ne](e,t);h&&i[Fe](h,e,t);i[ge](e,t);t.delete(i);return i}[Fe](e,t,a){if(a.has(e)){(0,n.warn)("XFA - Cycle detected in prototypes use.");return}!this[b]&&e[b]&&(this[b]=e[b]);new Set(a).add(e);for(const t of this[Be](e[Ue])){this[t]=e[t];this[Ue]&&this[Ue].add(t)}for(const r of Object.getOwnPropertyNames(this)){if(this[Te].has(r))continue;const n=this[r],i=e[r];if(n instanceof XFAObjectArray){for(const e of n[Ie])e[_e](t,a);for(let r=n[Ie].length,s=i[Ie].length;rXFAObject[Me](e))):"object"==typeof e&&null!==e?Object.assign({},e):e}[p](){const e=Object.create(Object.getPrototypeOf(this));for(const t of Object.getOwnPropertySymbols(this))try{e[t]=this[t]}catch(a){(0,n.shadow)(e,t,this[t])}e[ve]=`${e[ne]}${He++}`;e[Ie]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[Te].has(t)){e[t]=XFAObject[Me](this[t]);continue}const a=this[t];e[t]=a instanceof XFAObjectArray?new XFAObjectArray(a[Le]):null}for(const t of this[Ie]){const a=t[ne],r=t[p]();e[Ie].push(r);r[$e]=e;null===e[a]?e[a]=r:e[a][Ie].push(r)}return e}[R](e=null){return e?this[Ie].filter((t=>t[ne]===e)):this[Ie]}[O](e){return this[e]}[T](e,t,a=!0){return Array.from(this[M](e,t,a))}*[M](e,t,a=!0){if("parent"!==e){for(const a of this[Ie]){a[ne]===e&&(yield a);a.name===e&&(yield a);(t||a[ee]())&&(yield*a[M](e,t,!1))}a&&this[Te].has(e)&&(yield new XFAAttribute(this,e,this[e]))}else yield this[$e]}}t.XFAObject=XFAObject;class XFAObjectArray{constructor(e=1/0){this[Le]=e;this[Ie]=[]}push(e){if(this[Ie].length<=this[Le]){this[Ie].push(e);return!0}(0,n.warn)(`XFA - node "${e[ne]}" accepts no more than ${this[Le]} children`);return!1}isEmpty(){return 0===this[Ie].length}dump(){return 1===this[Ie].length?this[Ie][0][w]():this[Ie].map((e=>e[w]()))}[p](){const e=new XFAObjectArray(this[Le]);e[Ie]=this[Ie].map((e=>e[p]()));return e}get children(){return this[Ie]}clear(){this[Ie].length=0}}t.XFAObjectArray=XFAObjectArray;class XFAAttribute{constructor(e,t,a){this[$e]=e;this[ne]=t;this[b]=a;this[m]=!1;this[ve]="attribute"+He++}[_](){return this[$e]}[K](){return!0}[E](){return this[b].trim()}[ye](e){e=e.value||"";this[b]=e.toString()}[Se](){return this[b]}[Y](e){return this[$e]===e||this[$e][Y](e)}}t.XFAAttribute=XFAAttribute;class XmlObject extends XFAObject{constructor(e,t,a={}){super(e,t);this[b]="";this[Pe]=null;if("#text"!==t){const e=new Map;this[Oe]=e;for(const[t,r]of Object.entries(a))e.set(t,new XFAAttribute(this,t,r));if(a.hasOwnProperty(ie)){const e=a[ie].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[Pe]=!1:"dataValue"===e&&(this[Pe]=!0))}}this[m]=!1}[ke](e){const t=this[ne];if("#text"===t){e.push((0,i.encodeToXmlString)(this[b]));return}const a=(0,n.utf8StringToString)(t),r=this[re]===qe?"xfa:":"";e.push(`<${r}${a}`);for(const[t,a]of this[Oe].entries()){const r=(0,n.utf8StringToString)(t);e.push(` ${r}="${(0,i.encodeToXmlString)(a[b])}"`)}null!==this[Pe]&&(this[Pe]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[b]||0!==this[Ie].length){e.push(">");if(this[b])"string"==typeof this[b]?e.push((0,i.encodeToXmlString)(this[b])):this[b][ke](e);else for(const t of this[Ie])t[ke](e);e.push(``)}else e.push("/>")}[se](e){if(this[b]){const e=new XmlObject(this[re],"#text");this[h](e);e[b]=this[b];this[b]=""}this[h](e);return!0}[ce](e){this[b]+=e}[x](){if(this[b]&&this[Ie].length>0){const e=new XmlObject(this[re],"#text");this[h](e);e[b]=this[b];delete this[b]}}[Ae](){return"#text"===this[ne]?r.HTMLResult.success({name:"#text",value:this[b]}):r.HTMLResult.EMPTY}[R](e=null){return e?this[Ie].filter((t=>t[ne]===e)):this[Ie]}[v](){return this[Oe]}[O](e){const t=this[Oe].get(e);return void 0!==t?t:this[R](e)}*[M](e,t){const a=this[Oe].get(e);a&&(yield a);for(const a of this[Ie]){a[ne]===e&&(yield a);t&&(yield*a[M](e,t))}}*[C](e,t){const a=this[Oe].get(e);!a||t&&a[m]||(yield a);for(const a of this[Ie])yield*a[C](e,t)}*[N](e,t,a){for(const r of this[Ie]){r[ne]!==e||a&&r[m]||(yield r);t&&(yield*r[N](e,t,a))}}[K](){return null===this[Pe]?0===this[Ie].length||this[Ie][0][re]===s.NamespaceIds.xhtml.id:this[Pe]}[E](){return null===this[Pe]?0===this[Ie].length?this[b].trim():this[Ie][0][re]===s.NamespaceIds.xhtml.id?this[Ie][0][Se]().trim():null:this[b].trim()}[ye](e){e=e.value||"";this[b]=e.toString()}[w](e=!1){const t=Object.create(null);e&&(t.$ns=this[re]);this[b]&&(t.$content=this[b]);t.$name=this[ne];t.children=[];for(const a of this[Ie])t.children.push(a[w](e));t.attributes=Object.create(null);for(const[e,a]of this[Oe])t.attributes[e]=a[b];return t}}t.XmlObject=XmlObject;class ContentObject extends XFAObject{constructor(e,t){super(e,t);this[b]=""}[ce](e){this[b]+=e}[x](){}}t.ContentObject=ContentObject;t.OptionObject=class OptionObject extends ContentObject{constructor(e,t,a){super(e,t);this[je]=a}[x](){this[b]=(0,r.getKeyword)({data:this[b],defaultValue:this[je][0],validate:e=>this[je].includes(e)})}[d](e){super[d](e);delete this[je]}};t.StringObject=class StringObject extends ContentObject{[x](){this[b]=this[b].trim()}};class IntegerObject extends ContentObject{constructor(e,t,a,r){super(e,t);this[Ee]=a;this[Xe]=r}[x](){this[b]=(0,r.getInteger)({data:this[b],defaultValue:this[Ee],validate:this[Xe]})}[d](e){super[d](e);delete this[Ee];delete this[Xe]}}t.IntegerObject=IntegerObject;t.Option01=class Option01 extends IntegerObject{constructor(e,t){super(e,t,0,(e=>1===e))}};t.Option10=class Option10 extends IntegerObject{constructor(e,t){super(e,t,1,(e=>0===e))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.HTMLResult=void 0;t.getBBox=function getBBox(e){const t=-1;if(!e)return{x:t,y:t,width:t,height:t};const a=e.trim().split(/\s*,\s*/).map((e=>getMeasurement(e,"-1")));if(a.length<4||a[2]<0||a[3]<0)return{x:t,y:t,width:t,height:t};const[r,n,i,s]=a;return{x:r,y:n,width:i,height:s}};t.getColor=function getColor(e,t=[0,0,0]){let[a,r,n]=t;if(!e)return{r:a,g:r,b:n};const i=e.trim().split(/\s*,\s*/).map((e=>Math.min(Math.max(0,parseInt(e.trim(),10)),255))).map((e=>isNaN(e)?0:e));if(i.length<3)return{r:a,g:r,b:n};[a,r,n]=i;return{r:a,g:r,b:n}};t.getFloat=function getFloat({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const r=parseFloat(e);if(!isNaN(r)&&a(r))return r;return t};t.getInteger=function getInteger({data:e,defaultValue:t,validate:a}){if(!e)return t;e=e.trim();const r=parseInt(e,10);if(!isNaN(r)&&a(r))return r;return t};t.getKeyword=getKeyword;t.getMeasurement=getMeasurement;t.getRatio=function getRatio(e){if(!e)return{num:1,den:1};const t=e.trim().split(/\s*:\s*/).map((e=>parseFloat(e))).filter((e=>!isNaN(e)));1===t.length&&t.push(1);if(0===t.length)return{num:1,den:1};const[a,r]=t;return{num:a,den:r}};t.getRelevant=function getRelevant(e){if(!e)return[];return e.trim().split(/\s+/).map((e=>({excluded:"-"===e[0],viewname:e.substring(1)})))};t.getStringOption=function getStringOption(e,t){return getKeyword({data:e,defaultValue:t[0],validate:e=>t.includes(e)})};t.stripQuotes=function stripQuotes(e){if(e.startsWith("'")||e.startsWith('"'))return e.slice(1,e.length-1);return e};var r=a(2);const n={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},i=/([+-]?\d+\.?\d*)(.*)/;function getKeyword({data:e,defaultValue:t,validate:a}){return e&&a(e=e.trim())?e:t}function getMeasurement(e,t="0"){t=t||"0";if(!e)return getMeasurement(t);const a=e.trim().match(i);if(!a)return getMeasurement(t);const[,r,s]=a,o=parseFloat(r);if(isNaN(o))return getMeasurement(t);if(0===o)return 0;const c=n[s];return c?c(o):o}class HTMLResult{static get FAILURE(){return(0,r.shadow)(this,"FAILURE",new HTMLResult(!1,null,null,null))}static get EMPTY(){return(0,r.shadow)(this,"EMPTY",new HTMLResult(!0,null,null,null))}constructor(e,t,a,r){this.success=e;this.html=t;this.bbox=a;this.breakNode=r}isBreak(){return!!this.breakNode}static breakNode(e){return new HTMLResult(!1,null,null,e)}static success(e,t=null){return new HTMLResult(!0,e,t,null)}}t.HTMLResult=HTMLResult},(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NamespaceIds=t.$buildXFAObject=void 0;const a=Symbol();t.$buildXFAObject=a;t.NamespaceIds={config:{id:0,check:e=>e.startsWith("http://www.xfa.org/schema/xci/")},connectionSet:{id:1,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-connection-set/")},datasets:{id:2,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-data/")},form:{id:3,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-form/")},localeSet:{id:4,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-locale-set/")},pdf:{id:5,check:e=>"http://ns.adobe.com/xdp/pdf/"===e},signature:{id:6,check:e=>"http://www.w3.org/2000/09/xmldsig#"===e},sourceSet:{id:7,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-source-set/")},stylesheet:{id:8,check:e=>"http://www.w3.org/1999/XSL/Transform"===e},template:{id:9,check:e=>e.startsWith("http://www.xfa.org/schema/xfa-template/")},xdc:{id:10,check:e=>e.startsWith("http://www.xfa.org/schema/xdc/")},xdp:{id:11,check:e=>"http://ns.adobe.com/xdp/"===e},xfdf:{id:12,check:e=>"http://ns.adobe.com/xfdf/"===e},xhtml:{id:13,check:e=>"http://www.w3.org/1999/xhtml"===e},xmpmeta:{id:14,check:e=>"http://ns.adobe.com/xmpmeta/"===e}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.createDataNode=function createDataNode(e,t,a){const n=parseExpression(a);if(!n)return null;if(n.some((e=>e.operator===l)))return null;const s=f.get(n[0].name);let o=0;if(s){e=s(e,t);o=1}else e=t||e;for(let t=n.length;o0&&p.push(e)}if(0!==p.length||u||0!==d)e=isFinite(f)?p.filter((e=>fe[f])):p.flat();else{const a=t[r.$getParent]();if(!(t=a))return null;d=-1;e=[t]}}if(0===e.length)return null;return e};var r=a(77),n=a(79),i=a(2);const s=/^[^.[]+/,o=/^[^\]]+/,c=0,l=1,h=2,u=3,d=4,f=new Map([["$data",(e,t)=>e.datasets?e.datasets.data:e],["$record",(e,t)=>(e.datasets?e.datasets.data:e)[r.$getChildren]()[0]],["$template",(e,t)=>e.template],["$connectionSet",(e,t)=>e.connectionSet],["$form",(e,t)=>e.form],["$layout",(e,t)=>e.layout],["$host",(e,t)=>e.host],["$dataWindow",(e,t)=>e.dataWindow],["$event",(e,t)=>e.event],["!",(e,t)=>e.datasets],["$xfa",(e,t)=>e],["xfa",(e,t)=>e],["$",(e,t)=>t]]),g=new WeakMap,p=n.NamespaceIds.datasets.id;function parseExpression(e,t,a=!0){let r=e.match(s);if(!r)return null;let[n]=r;const f=[{name:n,cacheName:"."+n,index:0,js:null,formCalc:null,operator:c}];let g=n.length;for(;g{Object.defineProperty(t,"__esModule",{value:!0});t.Binder=void 0;var r=a(77),n=a(82),i=a(80),s=a(79),o=a(2);const c=s.NamespaceIds.datasets.id;function createText(e){const t=new n.Text({});t[r.$content]=e;return t}t.Binder=class Binder{constructor(e){this.root=e;this.datasets=e.datasets;e.datasets&&e.datasets.data?this.data=e.datasets.data:this.data=new r.XmlObject(s.NamespaceIds.datasets.id,"data");this.emptyMerge=0===this.data[r.$getChildren]().length;this.root.form=this.form=e.template[r.$clone]()}_isConsumeData(){return!this.emptyMerge&&this._mergeMode}_isMatchTemplate(){return!this._isConsumeData()}bind(){this._bindElement(this.form,this.data);return this.form}getData(){return this.data}_bindValue(e,t,a){e[r.$data]=t;if(e[r.$hasSettableValue]())if(t[r.$isDataValue]()){const a=t[r.$getDataValue]();e[r.$setValue](createText(a))}else if(e instanceof n.Field&&e.ui&&e.ui.choiceList&&"multiSelect"===e.ui.choiceList.open){const a=t[r.$getChildren]().map((e=>e[r.$content].trim())).join("\n");e[r.$setValue](createText(a))}else this._isConsumeData()&&(0,o.warn)("XFA - Nodes haven't the same type.");else!t[r.$isDataValue]()||this._isMatchTemplate()?this._bindElement(e,t):(0,o.warn)("XFA - Nodes haven't the same type.")}_findDataByNameToConsume(e,t,a,n){if(!e)return null;let i,o;for(let n=0;n<3;n++){i=a[r.$getRealChildrenByNameIt](e,!1,!0);for(;;){o=i.next().value;if(!o)break;if(t===o[r.$isDataValue]())return o}if(a[r.$namespaceId]===s.NamespaceIds.datasets.id&&"data"===a[r.$nodeName])break;a=a[r.$getParent]()}if(!n)return null;i=this.data[r.$getRealChildrenByNameIt](e,!0,!1);o=i.next().value;if(o)return o;i=this.data[r.$getAttributeIt](e,!0);o=i.next().value;return o&&o[r.$isDataValue]()?o:null}_setProperties(e,t){if(e.hasOwnProperty("setProperty"))for(const{ref:a,target:s,connection:c}of e.setProperty.children){if(c)continue;if(!a)continue;const l=(0,i.searchNode)(this.root,t,a,!1,!1);if(!l){(0,o.warn)(`XFA - Invalid reference: ${a}.`);continue}const[h]=l;if(!h[r.$isDescendent](this.data)){(0,o.warn)("XFA - Invalid node: must be a data node.");continue}const u=(0,i.searchNode)(this.root,e,s,!1,!1);if(!u){(0,o.warn)(`XFA - Invalid target: ${s}.`);continue}const[d]=u;if(!d[r.$isDescendent](e)){(0,o.warn)("XFA - Invalid target: must be a property or subproperty.");continue}const f=d[r.$getParent]();if(d instanceof n.SetProperty||f instanceof n.SetProperty){(0,o.warn)("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(d instanceof n.BindItems||f instanceof n.BindItems){(0,o.warn)("XFA - Invalid target: cannot be a bindItems or one of its properties.");continue}const g=h[r.$text](),p=d[r.$nodeName];if(d instanceof r.XFAAttribute){const e=Object.create(null);e[p]=g;const t=Reflect.construct(Object.getPrototypeOf(f).constructor,[e]);f[p]=t[p]}else if(d.hasOwnProperty(r.$content)){d[r.$data]=h;d[r.$content]=g;d[r.$finalize]()}else(0,o.warn)("XFA - Invalid node to use in setProperty")}}_bindItems(e,t){if(!e.hasOwnProperty("items")||!e.hasOwnProperty("bindItems")||e.bindItems.isEmpty())return;for(const t of e.items.children)e[r.$removeChild](t);e.items.clear();const a=new n.Items({}),s=new n.Items({});e[r.$appendChild](a);e.items.push(a);e[r.$appendChild](s);e.items.push(s);for(const{ref:n,labelRef:c,valueRef:l,connection:h}of e.bindItems.children){if(h)continue;if(!n)continue;const e=(0,i.searchNode)(this.root,t,n,!1,!1);if(e)for(const t of e){if(!t[r.$isDescendent](this.datasets)){(0,o.warn)(`XFA - Invalid ref (${n}): must be a datasets child.`);continue}const e=(0,i.searchNode)(this.root,t,c,!0,!1);if(!e){(0,o.warn)(`XFA - Invalid label: ${c}.`);continue}const[h]=e;if(!h[r.$isDescendent](this.datasets)){(0,o.warn)("XFA - Invalid label: must be a datasets child.");continue}const u=(0,i.searchNode)(this.root,t,l,!0,!1);if(!u){(0,o.warn)(`XFA - Invalid value: ${l}.`);continue}const[d]=u;if(!d[r.$isDescendent](this.datasets)){(0,o.warn)("XFA - Invalid value: must be a datasets child.");continue}const f=createText(h[r.$text]()),g=createText(d[r.$text]());a[r.$appendChild](f);a.text.push(f);s[r.$appendChild](g);s.text.push(g)}else(0,o.warn)(`XFA - Invalid reference: ${n}.`)}}_bindOccurrences(e,t,a){let n;if(t.length>1){n=e[r.$clone]();n[r.$removeChild](n.occur);n.occur=null}this._bindValue(e,t[0],a);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const i=e[r.$getParent](),s=e[r.$nodeName],o=i[r.$indexOf](e);for(let e=1,c=t.length;et.name===e.name)).length:a[n].children.length;const s=a[r.$indexOf](e)+1,o=t.initial-i;if(o){const t=e[r.$clone]();t[r.$removeChild](t.occur);t.occur=null;a[n].push(t);a[r.$insertAt](s,t);for(let e=1;e0)this._bindOccurrences(n,[e[0]],null);else if(this.emptyMerge){const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId],a=n[r.$data]=new r.XmlObject(e,n.name||"root");t[r.$appendChild](a);this._bindElement(n,a)}continue}if(!n[r.$isBindable]())continue;let e=!1,s=null,l=null,h=null;if(n.bind){switch(n.bind.match){case"none":this._setAndBind(n,t);continue;case"global":e=!0;break;case"dataRef":if(!n.bind.ref){(0,o.warn)(`XFA - ref is empty in node ${n[r.$nodeName]}.`);this._setAndBind(n,t);continue}l=n.bind.ref}n.bind.picture&&(s=n.bind.picture[r.$content])}const[u,d]=this._getOccurInfo(n);if(l){h=(0,i.searchNode)(this.root,t,l,!0,!1);if(null===h){h=(0,i.createDataNode)(this.data,t,l);if(!h)continue;this._isConsumeData()&&(h[r.$consumed]=!0);this._setAndBind(n,h);continue}this._isConsumeData()&&(h=h.filter((e=>!e[r.$consumed])));h.length>d?h=h.slice(0,d):0===h.length&&(h=null);h&&this._isConsumeData()&&h.forEach((e=>{e[r.$consumed]=!0}))}else{if(!n.name){this._setAndBind(n,t);continue}if(this._isConsumeData()){const a=[];for(;a.length0?a:null}else{h=t[r.$getRealChildrenByNameIt](n.name,!1,this.emptyMerge).next().value;if(!h){if(0===u){a.push(n);continue}const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId];h=n[r.$data]=new r.XmlObject(e,n.name);this.emptyMerge&&(h[r.$consumed]=!0);t[r.$appendChild](h);this._setAndBind(n,h);continue}this.emptyMerge&&(h[r.$consumed]=!0);h=[h]}}h?this._bindOccurrences(n,h,s):u>0?this._setAndBind(n,t):a.push(n)}a.forEach((e=>e[r.$getParent]()[r.$removeChild](e)))}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Value=t.Text=t.TemplateNamespace=t.Template=t.SetProperty=t.Items=t.Field=t.BindItems=void 0;var r=a(77),n=a(79),i=a(83),s=a(84),o=a(78),c=a(2),l=a(85),h=a(6),u=a(80);const d=n.NamespaceIds.template.id,f="http://www.w3.org/2000/svg",g=/^H(\d+)$/,p=new Set(["image/gif","image/jpeg","image/jpg","image/pjpeg","image/png","image/apng","image/x-png","image/bmp","image/x-ms-bmp","image/tiff","image/tif","application/octet-stream"]),m=[[[66,77],"image/bmp"],[[255,216,255],"image/jpeg"],[[73,73,42,0],"image/tiff"],[[77,77,0,42],"image/tiff"],[[71,73,70,56,57,97],"image/gif"],[[137,80,78,71,13,10,26,10],"image/png"]];function getBorderDims(e){if(!e||!e.border)return{w:0,h:0};const t=e.border[r.$getExtra]();return t?{w:t.widths[0]+t.widths[2]+t.insets[0]+t.insets[2],h:t.widths[1]+t.widths[3]+t.insets[1]+t.insets[3]}:{w:0,h:0}}function hasMargin(e){return e.margin&&(e.margin.topInset||e.margin.rightInset||e.margin.bottomInset||e.margin.leftInset)}function _setValue(e,t){if(!e.value){const t=new Value({});e[r.$appendChild](t);e.value=t}e.value[r.$setValue](t)}function*getContainedChildren(e){for(const t of e[r.$getChildren]())t instanceof SubformSet?yield*t[r.$getContainedChildren]():yield t}function isRequired(e){return e.validate&&"error"===e.validate.nullTest}function setTabIndex(e){for(;e;){if(!e.traversal){e[r.$tabIndex]=e[r.$getParent]()[r.$tabIndex];return}if(e[r.$tabIndex])return;let t=null;for(const a of e.traversal[r.$getChildren]())if("next"===a.operation){t=a;break}if(!t||!t.ref){e[r.$tabIndex]=e[r.$getParent]()[r.$tabIndex];return}const a=e[r.$getTemplateRoot]();e[r.$tabIndex]=++a[r.$tabIndex];const n=a[r.$searchNode](t.ref,e);if(!n)return;e=n[0]}}function applyAssist(e,t){const a=e.assist;if(a){const e=a[r.$toHTML]();e&&(t.title=e);const n=a.role.match(g);if(n){const e="heading",a=n[1];t.role=e;t["aria-level"]=a}}if("table"===e.layout)t.role="table";else if("row"===e.layout)t.role="row";else{const a=e[r.$getParent]();"row"===a.layout&&(a.assist&&"TH"===a.assist.role?t.role="columnheader":t.role="cell")}}function ariaLabel(e){if(!e.assist)return null;const t=e.assist;return t.speak&&""!==t.speak[r.$content]?t.speak[r.$content]:t.toolTip?t.toolTip[r.$content]:null}function valueToHtml(e){return o.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:Object.create(null)},children:[{name:"span",attributes:{style:Object.create(null)},value:e}]})}function setFirstUnsplittable(e){const t=e[r.$getTemplateRoot]();if(null===t[r.$extra].firstUnsplittable){t[r.$extra].firstUnsplittable=e;t[r.$extra].noLayoutFailure=!0}}function unsetFirstUnsplittable(e){const t=e[r.$getTemplateRoot]();t[r.$extra].firstUnsplittable===e&&(t[r.$extra].noLayoutFailure=!1)}function handleBreak(e){if(e[r.$extra])return!1;e[r.$extra]=Object.create(null);if("auto"===e.targetType)return!1;const t=e[r.$getTemplateRoot]();let a=null;if(e.target){a=t[r.$searchNode](e.target,e[r.$getParent]());if(!a)return!1;a=a[0]}const{currentPageArea:n,currentContentArea:i}=t[r.$extra];if("pageArea"===e.targetType){a instanceof PageArea||(a=null);if(e.startNew){e[r.$extra].target=a||n;return!0}if(a&&a!==n){e[r.$extra].target=a;return!0}return!1}a instanceof ContentArea||(a=null);const s=a&&a[r.$getParent]();let o,c=s;if(e.startNew)if(a){const e=s.contentArea.children,t=e.indexOf(i),r=e.indexOf(a);-1!==t&&te;n[r.$extra].noLayoutFailure=!0;const o=t[r.$toHTML](a);e[r.$addHTML](o.html,o.bbox);n[r.$extra].noLayoutFailure=i;t[r.$getSubformParent]=s}class AppearanceFilter extends r.StringObject{constructor(e){super(d,"appearanceFilter");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Arc extends r.XFAObject{constructor(e){super(d,"arc",!0);this.circular=(0,o.getInteger)({data:e.circular,defaultValue:0,validate:e=>1===e});this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.startAngle=(0,o.getFloat)({data:e.startAngle,defaultValue:0,validate:e=>!0});this.sweepAngle=(0,o.getFloat)({data:e.sweepAngle,defaultValue:360,validate:e=>!0});this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null;this.fill=null}[r.$toHTML](){const e=this.edge||new Edge({}),t=e[r.$toStyle](),a=Object.create(null);this.fill&&"visible"===this.fill.presence?Object.assign(a,this.fill[r.$toStyle]()):a.fill="transparent";a.strokeWidth=(0,s.measureToString)("visible"===e.presence?e.thickness:0);a.stroke=t.color;let n;const i={xmlns:f,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)n={name:"ellipse",attributes:{xmlns:f,cx:"50%",cy:"50%",rx:"50%",ry:"50%",style:a}};else{const e=this.startAngle*Math.PI/180,t=this.sweepAngle*Math.PI/180,r=this.sweepAngle>180?1:0,[s,o,c,l]=[50*(1+Math.cos(e)),50*(1-Math.sin(e)),50*(1+Math.cos(e+t)),50*(1-Math.sin(e+t))];n={name:"path",attributes:{xmlns:f,d:`M ${s} ${o} A 50 50 0 ${r} 0 ${c} ${l}`,vectorEffect:"non-scaling-stroke",style:a}};Object.assign(i,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const c={name:"svg",children:[n],attributes:i};if(hasMargin(this[r.$getParent]()[r.$getParent]()))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[c]});c.attributes.style.position="absolute";return o.HTMLResult.success(c)}}class Area extends r.XFAObject{constructor(e){super(d,"area",!0);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.id=e.id||"";this.name=e.name||"";this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.desc=null;this.extras=null;this.area=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$isTransparent](){return!0}[r.$isBindable](){return!0}[r.$addHTML](e,t){const[a,n,i,s]=t;this[r.$extra].width=Math.max(this[r.$extra].width,a+i);this[r.$extra].height=Math.max(this[r.$extra].height,n+s);this[r.$extra].children.push(e)}[r.$getAvailableSpace](){return this[r.$extra].availableSpace}[r.$toHTML](e){const t=(0,s.toStyle)(this,"position"),a={style:t,id:this[r.$uid],class:["xfaArea"]};(0,s.isPrintOnly)(this)&&a.class.push("xfaPrintOnly");this.name&&(a.xfaName=this.name);const n=[];this[r.$extra]={children:n,width:0,height:0,availableSpace:e};const i=this[r.$childrenToHTML]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!i.success){if(i.isBreak())return i;delete this[r.$extra];return o.HTMLResult.FAILURE}t.width=(0,s.measureToString)(this[r.$extra].width);t.height=(0,s.measureToString)(this[r.$extra].height);const c={name:"div",attributes:a,children:n},l=[this.x,this.y,this[r.$extra].width,this[r.$extra].height];delete this[r.$extra];return o.HTMLResult.success(c,l)}}class Assist extends r.XFAObject{constructor(e){super(d,"assist",!0);this.id=e.id||"";this.role=e.role||"";this.use=e.use||"";this.usehref=e.usehref||"";this.speak=null;this.toolTip=null}[r.$toHTML](){return this.toolTip&&this.toolTip[r.$content]?this.toolTip[r.$content]:null}}class Barcode extends r.XFAObject{constructor(e){super(d,"barcode",!0);this.charEncoding=(0,o.getKeyword)({data:e.charEncoding?e.charEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.checksum=(0,o.getStringOption)(e.checksum,["none","1mod10","1mod10_1mod11","2mod10","auto"]);this.dataColumnCount=(0,o.getInteger)({data:e.dataColumnCount,defaultValue:-1,validate:e=>e>=0});this.dataLength=(0,o.getInteger)({data:e.dataLength,defaultValue:-1,validate:e=>e>=0});this.dataPrep=(0,o.getStringOption)(e.dataPrep,["none","flateCompress"]);this.dataRowCount=(0,o.getInteger)({data:e.dataRowCount,defaultValue:-1,validate:e=>e>=0});this.endChar=e.endChar||"";this.errorCorrectionLevel=(0,o.getInteger)({data:e.errorCorrectionLevel,defaultValue:-1,validate:e=>e>=0&&e<=8});this.id=e.id||"";this.moduleHeight=(0,o.getMeasurement)(e.moduleHeight,"5mm");this.moduleWidth=(0,o.getMeasurement)(e.moduleWidth,"0.25mm");this.printCheckDigit=(0,o.getInteger)({data:e.printCheckDigit,defaultValue:0,validate:e=>1===e});this.rowColumnRatio=(0,o.getRatio)(e.rowColumnRatio);this.startChar=e.startChar||"";this.textLocation=(0,o.getStringOption)(e.textLocation,["below","above","aboveEmbedded","belowEmbedded","none"]);this.truncate=(0,o.getInteger)({data:e.truncate,defaultValue:0,validate:e=>1===e});this.type=(0,o.getStringOption)(e.type?e.type.toLowerCase():"",["aztec","codabar","code2of5industrial","code2of5interleaved","code2of5matrix","code2of5standard","code3of9","code3of9extended","code11","code49","code93","code128","code128a","code128b","code128c","code128sscc","datamatrix","ean8","ean8add2","ean8add5","ean13","ean13add2","ean13add5","ean13pwcd","fim","logmars","maxicode","msi","pdf417","pdf417macro","plessey","postauscust2","postauscust3","postausreplypaid","postausstandard","postukrm4scc","postusdpbc","postusimb","postusstandard","postus5zip","qrcode","rfid","rss14","rss14expanded","rss14limited","rss14stacked","rss14stackedomni","rss14truncated","telepen","ucc128","ucc128random","ucc128sscc","upca","upcaadd2","upcaadd5","upcapwcd","upce","upceadd2","upceadd5","upcean2","upcean5","upsmaxicode"]);this.upsMode=(0,o.getStringOption)(e.upsMode,["usCarrier","internationalCarrier","secureSymbol","standardSymbol"]);this.use=e.use||"";this.usehref=e.usehref||"";this.wideNarrowRatio=(0,o.getRatio)(e.wideNarrowRatio);this.encrypt=null;this.extras=null}}class Bind extends r.XFAObject{constructor(e){super(d,"bind",!0);this.match=(0,o.getStringOption)(e.match,["once","dataRef","global","none"]);this.ref=e.ref||"";this.picture=null}}class BindItems extends r.XFAObject{constructor(e){super(d,"bindItems");this.connection=e.connection||"";this.labelRef=e.labelRef||"";this.ref=e.ref||"";this.valueRef=e.valueRef||""}}t.BindItems=BindItems;class Bookend extends r.XFAObject{constructor(e){super(d,"bookend");this.id=e.id||"";this.leader=e.leader||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}}class BooleanElement extends r.Option01{constructor(e){super(d,"boolean");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$toHTML](e){return valueToHtml(1===this[r.$content]?"1":"0")}}class Border extends r.XFAObject{constructor(e){super(d,"border",!0);this.break=(0,o.getStringOption)(e.break,["close","open"]);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new r.XFAObjectArray(4);this.edge=new r.XFAObjectArray(4);this.extras=null;this.fill=null;this.margin=null}[r.$getExtra](){if(!this[r.$extra]){const e=this.edge.children.slice();if(e.length<4){const t=e.at(-1)||new Edge({});for(let a=e.length;a<4;a++)e.push(t)}const t=e.map((e=>e.thickness)),a=[0,0,0,0];if(this.margin){a[0]=this.margin.topInset;a[1]=this.margin.rightInset;a[2]=this.margin.bottomInset;a[3]=this.margin.leftInset}this[r.$extra]={widths:t,insets:a,edges:e}}return this[r.$extra]}[r.$toStyle](){const{edges:e}=this[r.$getExtra](),t=e.map((e=>{const t=e[r.$toStyle]();t.color=t.color||"#000000";return t})),a=Object.create(null);this.margin&&Object.assign(a,this.margin[r.$toStyle]());this.fill&&"visible"===this.fill.presence&&Object.assign(a,this.fill[r.$toStyle]());if(this.corner.children.some((e=>0!==e.radius))){const e=this.corner.children.map((e=>e[r.$toStyle]()));if(2===e.length||3===e.length){const t=e.at(-1);for(let a=e.length;a<4;a++)e.push(t)}a.borderRadius=e.map((e=>e.radius)).join(" ")}switch(this.presence){case"invisible":case"hidden":a.borderStyle="";break;case"inactive":a.borderStyle="none";break;default:a.borderStyle=t.map((e=>e.style)).join(" ")}a.borderWidth=t.map((e=>e.width)).join(" ");a.borderColor=t.map((e=>e.color)).join(" ");return a}}class Break extends r.XFAObject{constructor(e){super(d,"break",!0);this.after=(0,o.getStringOption)(e.after,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.afterTarget=e.afterTarget||"";this.before=(0,o.getStringOption)(e.before,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.beforeTarget=e.beforeTarget||"";this.bookendLeader=e.bookendLeader||"";this.bookendTrailer=e.bookendTrailer||"";this.id=e.id||"";this.overflowLeader=e.overflowLeader||"";this.overflowTarget=e.overflowTarget||"";this.overflowTrailer=e.overflowTrailer||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class BreakAfter extends r.XFAObject{constructor(e){super(d,"breakAfter",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=(0,o.getStringOption)(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}}class BreakBefore extends r.XFAObject{constructor(e){super(d,"breakBefore",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=(0,o.getInteger)({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=(0,o.getStringOption)(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}[r.$toHTML](e){this[r.$extra]={};return o.HTMLResult.FAILURE}}class Button extends r.XFAObject{constructor(e){super(d,"button",!0);this.highlight=(0,o.getStringOption)(e.highlight,["inverted","none","outline","push"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toHTML](e){const t=this[r.$getParent]()[r.$getParent](),a={name:"button",attributes:{id:this[r.$uid],class:["xfaButton"],style:{}},children:[]};for(const e of t.event.children){if("click"!==e.activity||!e.script)continue;const t=(0,h.recoverJsURL)(e.script[r.$content]);if(!t)continue;const n=(0,s.fixURL)(t.url);n&&a.children.push({name:"a",attributes:{id:"link"+this[r.$uid],href:n,newWindow:t.newWindow,class:["xfaLink"],style:{}},children:[]})}return o.HTMLResult.success(a)}}class Calculate extends r.XFAObject{constructor(e){super(d,"calculate",!0);this.id=e.id||"";this.override=(0,o.getStringOption)(e.override,["disabled","error","ignore","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.script=null}}class Caption extends r.XFAObject{constructor(e){super(d,"caption",!0);this.id=e.id||"";this.placement=(0,o.getStringOption)(e.placement,["left","bottom","inline","right","top"]);this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.reserve=Math.ceil((0,o.getMeasurement)(e.reserve));this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.font=null;this.margin=null;this.para=null;this.value=null}[r.$setValue](e){_setValue(this,e)}[r.$getExtra](e){if(!this[r.$extra]){let{width:t,height:a}=e;switch(this.placement){case"left":case"right":case"inline":t=this.reserve<=0?t:this.reserve;break;case"top":case"bottom":a=this.reserve<=0?a:this.reserve}this[r.$extra]=(0,s.layoutNode)(this,{width:t,height:a})}return this[r.$extra]}[r.$toHTML](e){if(!this.value)return o.HTMLResult.EMPTY;this[r.$pushPara]();const t=this.value[r.$toHTML](e).html;if(!t){this[r.$popPara]();return o.HTMLResult.EMPTY}const a=this.reserve;if(this.reserve<=0){const{w:t,h:a}=this[r.$getExtra](e);switch(this.placement){case"left":case"right":case"inline":this.reserve=t;break;case"top":case"bottom":this.reserve=a}}const n=[];"string"==typeof t?n.push({name:"#text",value:t}):n.push(t);const i=(0,s.toStyle)(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(i.width=(0,s.measureToString)(this.reserve));break;case"top":case"bottom":this.reserve>0&&(i.height=(0,s.measureToString)(this.reserve))}(0,s.setPara)(this,null,t);this[r.$popPara]();this.reserve=a;return o.HTMLResult.success({name:"div",attributes:{style:i,class:["xfaCaption"]},children:n})}}class Certificate extends r.StringObject{constructor(e){super(d,"certificate");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Certificates extends r.XFAObject{constructor(e){super(d,"certificates",!0);this.credentialServerPolicy=(0,o.getStringOption)(e.credentialServerPolicy,["optional","required"]);this.id=e.id||"";this.url=e.url||"";this.urlPolicy=e.urlPolicy||"";this.use=e.use||"";this.usehref=e.usehref||"";this.encryption=null;this.issuers=null;this.keyUsage=null;this.oids=null;this.signing=null;this.subjectDNs=null}}class CheckButton extends r.XFAObject{constructor(e){super(d,"checkButton",!0);this.id=e.id||"";this.mark=(0,o.getStringOption)(e.mark,["default","check","circle","cross","diamond","square","star"]);this.shape=(0,o.getStringOption)(e.shape,["square","round"]);this.size=(0,o.getMeasurement)(e.size,"10pt");this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)("margin"),a=(0,s.measureToString)(this.size);t.width=t.height=a;let n,i,c;const l=this[r.$getParent]()[r.$getParent](),h=l.items.children.length&&l.items.children[0][r.$toHTML]().html||[],u={on:(void 0!==h[0]?h[0]:"on").toString(),off:(void 0!==h[1]?h[1]:"off").toString()},d=(l.value&&l.value[r.$text]()||"off")===u.on||void 0,f=l[r.$getSubformParent](),g=l[r.$uid];let p;if(f instanceof ExclGroup){c=f[r.$uid];n="radio";i="xfaRadio";p=f[r.$data]&&f[r.$data][r.$uid]||f[r.$uid]}else{n="checkbox";i="xfaCheckbox";p=l[r.$data]&&l[r.$data][r.$uid]||l[r.$uid]}const m={name:"input",attributes:{class:[i],style:t,fieldId:g,dataId:p,type:n,checked:d,xfaOn:u.on,xfaOff:u.off,"aria-label":ariaLabel(l),"aria-required":!1}};c&&(m.attributes.name=c);if(isRequired(l)){m.attributes["aria-required"]=!0;m.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[m]})}}class ChoiceList extends r.XFAObject{constructor(e){super(d,"choiceList",!0);this.commitOn=(0,o.getStringOption)(e.commitOn,["select","exit"]);this.id=e.id||"";this.open=(0,o.getStringOption)(e.open,["userControl","always","multiSelect","onEntry"]);this.textEntry=(0,o.getInteger)({data:e.textEntry,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","margin"),a=this[r.$getParent]()[r.$getParent](),n={fontSize:`calc(${a.font&&a.font.size||10}px * var(--scale-factor))`},i=[];if(a.items.children.length>0){const e=a.items;let t=0,s=0;if(2===e.children.length){t=e.children[0].save;s=1-t}const o=e.children[t][r.$toHTML]().html,c=e.children[s][r.$toHTML]().html;let l=!1;const h=a.value&&a.value[r.$text]()||"";for(let e=0,t=o.length;ee>=0});this.use=e.use||"";this.usehref=e.usehref||""}}class Connect extends r.XFAObject{constructor(e){super(d,"connect",!0);this.connection=e.connection||"";this.id=e.id||"";this.ref=e.ref||"";this.usage=(0,o.getStringOption)(e.usage,["exportAndImport","exportOnly","importOnly"]);this.use=e.use||"";this.usehref=e.usehref||"";this.picture=null}}class ContentArea extends r.XFAObject{constructor(e){super(d,"contentArea",!0);this.h=(0,o.getMeasurement)(e.h);this.id=e.id||"";this.name=e.name||"";this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=(0,o.getMeasurement)(e.w);this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.desc=null;this.extras=null}[r.$toHTML](e){const t={left:(0,s.measureToString)(this.x),top:(0,s.measureToString)(this.y),width:(0,s.measureToString)(this.w),height:(0,s.measureToString)(this.h)},a=["xfaContentarea"];(0,s.isPrintOnly)(this)&&a.push("xfaPrintOnly");return o.HTMLResult.success({name:"div",children:[],attributes:{style:t,class:a,id:this[r.$uid]}})}}class Corner extends r.XFAObject{constructor(e){super(d,"corner",!0);this.id=e.id||"";this.inverted=(0,o.getInteger)({data:e.inverted,defaultValue:0,validate:e=>1===e});this.join=(0,o.getStringOption)(e.join,["square","round"]);this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.radius=(0,o.getMeasurement)(e.radius);this.stroke=(0,o.getStringOption)(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=(0,o.getMeasurement)(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"visibility");e.radius=(0,s.measureToString)("square"===this.join?0:this.radius);return e}}class DateElement extends r.ContentObject{constructor(e){super(d,"date");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class DateTime extends r.ContentObject{constructor(e){super(d,"dateTime");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class DateTimeEdit extends r.XFAObject{constructor(e){super(d,"dateTimeEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.picker=(0,o.getStringOption)(e.picker,["host","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin"),a=this[r.$getParent]()[r.$getParent](),n={name:"input",attributes:{type:"text",fieldId:a[r.$uid],dataId:a[r.$data]&&a[r.$data][r.$uid]||a[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Decimal extends r.ContentObject{constructor(e){super(d,"decimal");this.fracDigits=(0,o.getInteger)({data:e.fracDigits,defaultValue:2,validate:e=>!0});this.id=e.id||"";this.leadDigits=(0,o.getInteger)({data:e.leadDigits,defaultValue:-1,validate:e=>!0});this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseFloat(this[r.$content].trim());this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class DefaultUi extends r.XFAObject{constructor(e){super(d,"defaultUi",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class Desc extends r.XFAObject{constructor(e){super(d,"desc",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}}class DigestMethod extends r.OptionObject{constructor(e){super(d,"digestMethod",["","SHA1","SHA256","SHA512","RIPEMD160"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class DigestMethods extends r.XFAObject{constructor(e){super(d,"digestMethods",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.digestMethod=new r.XFAObjectArray}}class Draw extends r.XFAObject{constructor(e){super(d,"draw",!0);this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.rotate=(0,o.getInteger)({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.border=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.value=null;this.setProperty=new r.XFAObjectArray}[r.$setValue](e){_setValue(this,e)}[r.$toHTML](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);this[r.$pushPara]();const t=this.w,a=this.h,{w:n,h:c,isBroken:l}=(0,s.layoutNode)(this,e);if(n&&""===this.w){if(l&&this[r.$getSubformParent]()[r.$isThereMoreWidth]()){this[r.$popPara]();return o.HTMLResult.FAILURE}this.w=n}c&&""===this.h&&(this.h=c);setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e)){this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.FAILURE}unsetFirstUnsplittable(this);const h=(0,s.toStyle)(this,"font","hAlign","dimensions","position","presence","rotate","anchorType","border","margin");(0,s.setMinMaxDimensions)(this,h);if(h.margin){h.padding=h.margin;delete h.margin}const u=["xfaDraw"];this.font&&u.push("xfaFont");(0,s.isPrintOnly)(this)&&u.push("xfaPrintOnly");const d={style:h,id:this[r.$uid],class:u};this.name&&(d.xfaName=this.name);const f={name:"div",attributes:d,children:[]};applyAssist(this,d);const g=(0,s.computeBbox)(this,f,e),p=this.value?this.value[r.$toHTML](e).html:null;if(null===p){this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.success((0,s.createWrapper)(this,f),g)}f.children.push(p);(0,s.setPara)(this,h,p);this.w=t;this.h=a;this[r.$popPara]();return o.HTMLResult.success((0,s.createWrapper)(this,f),g)}}class Edge extends r.XFAObject{constructor(e){super(d,"edge",!0);this.cap=(0,o.getStringOption)(e.cap,["square","butt","round"]);this.id=e.id||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.stroke=(0,o.getStringOption)(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=(0,o.getMeasurement)(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"visibility");Object.assign(e,{linecap:this.cap,width:(0,s.measureToString)(this.thickness),color:this.color?this.color[r.$toStyle]():"#000000",style:""});if("visible"!==this.presence)e.style="none";else switch(this.stroke){case"solid":e.style="solid";break;case"dashDot":case"dashDotDot":case"dashed":e.style="dashed";break;case"dotted":e.style="dotted";break;case"embossed":e.style="ridge";break;case"etched":e.style="groove";break;case"lowered":e.style="inset";break;case"raised":e.style="outset"}return e}}class Encoding extends r.OptionObject{constructor(e){super(d,"encoding",["adbe.x509.rsa_sha1","adbe.pkcs7.detached","adbe.pkcs7.sha1"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Encodings extends r.XFAObject{constructor(e){super(d,"encodings",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encoding=new r.XFAObjectArray}}class Encrypt extends r.XFAObject{constructor(e){super(d,"encrypt",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=null}}class EncryptData extends r.XFAObject{constructor(e){super(d,"encryptData",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["encrypt","decrypt"]);this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Encryption extends r.XFAObject{constructor(e){super(d,"encryption",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class EncryptionMethod extends r.OptionObject{constructor(e){super(d,"encryptionMethod",["","AES256-CBC","TRIPLEDES-CBC","AES128-CBC","AES192-CBC"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EncryptionMethods extends r.XFAObject{constructor(e){super(d,"encryptionMethods",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encryptionMethod=new r.XFAObjectArray}}class Event extends r.XFAObject{constructor(e){super(d,"event",!0);this.activity=(0,o.getStringOption)(e.activity,["click","change","docClose","docReady","enter","exit","full","indexChange","initialize","mouseDown","mouseEnter","mouseExit","mouseUp","postExecute","postOpen","postPrint","postSave","postSign","postSubmit","preExecute","preOpen","prePrint","preSave","preSign","preSubmit","ready","validationState"]);this.id=e.id||"";this.listen=(0,o.getStringOption)(e.listen,["refOnly","refAndDescendents"]);this.name=e.name||"";this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.encryptData=null;this.execute=null;this.script=null;this.signData=null;this.submit=null}}class ExData extends r.ContentObject{constructor(e){super(d,"exData");this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.maxLength=(0,o.getInteger)({data:e.maxLength,defaultValue:-1,validate:e=>e>=-1});this.name=e.name||"";this.rid=e.rid||"";this.transferEncoding=(0,o.getStringOption)(e.transferEncoding,["none","base64","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$isCDATAXml](){return"text/html"===this.contentType}[r.$onChild](e){if("text/html"===this.contentType&&e[r.$namespaceId]===n.NamespaceIds.xhtml.id){this[r.$content]=e;return!0}if("text/xml"===this.contentType){this[r.$content]=e;return!0}return!1}[r.$toHTML](e){return"text/html"===this.contentType&&this[r.$content]?this[r.$content][r.$toHTML](e):o.HTMLResult.EMPTY}}class ExObject extends r.XFAObject{constructor(e){super(d,"exObject",!0);this.archive=e.archive||"";this.classId=e.classId||"";this.codeBase=e.codeBase||"";this.codeType=e.codeType||"";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}}class ExclGroup extends r.XFAObject{constructor(e){super(d,"exclGroup",!0);this.access=(0,o.getStringOption)(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=(0,o.getStringOption)(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.margin=null;this.para=null;this.traversal=null;this.validate=null;this.connect=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray}[r.$isBindable](){return!0}[r.$hasSettableValue](){return!0}[r.$setValue](e){for(const t of this.field.children){if(!t.value){const e=new Value({});t[r.$appendChild](e);t.value=e}t.value[r.$setValue](e)}}[r.$isThereMoreWidth](){return this.layout.endsWith("-tb")&&0===this[r.$extra].attempt&&this[r.$extra].numberInLine>0||this[r.$getParent]()[r.$isThereMoreWidth]()}[r.$isSplittable](){const e=this[r.$getSubformParent]();if(!e[r.$isSplittable]())return!1;if(void 0!==this[r.$extra]._isSplittable)return this[r.$extra]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[r.$extra]._isSplittable=!1;return!1}if(e.layout&&e.layout.endsWith("-tb")&&0!==e[r.$extra].numberInLine)return!1;this[r.$extra]._isSplittable=!0;return!0}[r.$flushHTML](){return(0,i.flushHTML)(this)}[r.$addHTML](e,t){(0,i.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,i.getAvailableSpace)(this)}[r.$toHTML](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);const t=[],a={id:this[r.$uid],class:[]};(0,s.setAccess)(this,a.class);this[r.$extra]||(this[r.$extra]=Object.create(null));Object.assign(this[r.$extra],{children:t,attributes:a,attempt:0,line:null,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[r.$isSplittable]();n||setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e))return o.HTMLResult.FAILURE;const c=new Set(["field"]);if(this.layout.includes("row")){const e=this[r.$getSubformParent]().columnWidths;if(Array.isArray(e)&&e.length>0){this[r.$extra].columnWidths=e;this[r.$extra].currentColumn=0}}const l=(0,s.toStyle)(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),h=["xfaExclgroup"],u=(0,s.layoutClass)(this);u&&h.push(u);(0,s.isPrintOnly)(this)&&h.push("xfaPrintOnly");a.style=l;a.class=h;this.name&&(a.xfaName=this.name);this[r.$pushPara]();const d="lr-tb"===this.layout||"rl-tb"===this.layout,f=d?2:1;for(;this[r.$extra].attempte>=1||-1===e});this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.rotate=(0,o.getInteger)({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.border=null;this.calculate=null;this.caption=null;this.desc=null;this.extras=null;this.font=null;this.format=null;this.items=new r.XFAObjectArray(2);this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.validate=null;this.value=null;this.bindItems=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray}[r.$isBindable](){return!0}[r.$setValue](e){_setValue(this,e)}[r.$toHTML](e){setTabIndex(this);if(!this.ui){this.ui=new Ui({});this.ui[r.$globalData]=this[r.$globalData];this[r.$appendChild](this.ui);let e;switch(this.items.children.length){case 0:e=new TextEdit({});this.ui.textEdit=e;break;case 1:e=new CheckButton({});this.ui.checkButton=e;break;case 2:e=new ChoiceList({});this.ui.choiceList=e}this.ui[r.$appendChild](e)}if(!this.ui||"hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return o.HTMLResult.EMPTY;this.caption&&delete this.caption[r.$extra];this[r.$pushPara]();const t=this.caption?this.caption[r.$toHTML](e).html:null,a=this.w,n=this.h;let c=0,h=0;if(this.margin){c=this.margin.leftInset+this.margin.rightInset;h=this.margin.topInset+this.margin.bottomInset}let u=null;if(""===this.w||""===this.h){let t=null,a=null,n=0,i=0;if(this.ui.checkButton)n=i=this.ui.checkButton.size;else{const{w:t,h:a}=(0,s.layoutNode)(this,e);if(null!==t){n=t;i=a}else i=(0,l.getMetrics)(this.font,!0).lineNoGap}u=getBorderDims(this.ui[r.$getExtra]());n+=u.w;i+=u.h;if(this.caption){const{w:s,h:c,isBroken:l}=this.caption[r.$getExtra](e);if(l&&this[r.$getSubformParent]()[r.$isThereMoreWidth]()){this[r.$popPara]();return o.HTMLResult.FAILURE}t=s;a=c;switch(this.caption.placement){case"left":case"right":case"inline":t+=n;break;case"top":case"bottom":a+=i}}else{t=n;a=i}if(t&&""===this.w){t+=c;this.w=Math.min(this.maxW<=0?1/0:this.maxW,this.minW+1e>=1&&e<=5});this.appearanceFilter=null;this.certificates=null;this.digestMethods=null;this.encodings=null;this.encryptionMethods=null;this.handler=null;this.lockDocument=null;this.mdp=null;this.reasons=null;this.timeStamp=null}}class Float extends r.ContentObject{constructor(e){super(d,"float");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseFloat(this[r.$content].trim());this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class Font extends r.XFAObject{constructor(e){super(d,"font",!0);this.baselineShift=(0,o.getMeasurement)(e.baselineShift);this.fontHorizontalScale=(0,o.getFloat)({data:e.fontHorizontalScale,defaultValue:100,validate:e=>e>=0});this.fontVerticalScale=(0,o.getFloat)({data:e.fontVerticalScale,defaultValue:100,validate:e=>e>=0});this.id=e.id||"";this.kerningMode=(0,o.getStringOption)(e.kerningMode,["none","pair"]);this.letterSpacing=(0,o.getMeasurement)(e.letterSpacing,"0");this.lineThrough=(0,o.getInteger)({data:e.lineThrough,defaultValue:0,validate:e=>1===e||2===e});this.lineThroughPeriod=(0,o.getStringOption)(e.lineThroughPeriod,["all","word"]);this.overline=(0,o.getInteger)({data:e.overline,defaultValue:0,validate:e=>1===e||2===e});this.overlinePeriod=(0,o.getStringOption)(e.overlinePeriod,["all","word"]);this.posture=(0,o.getStringOption)(e.posture,["normal","italic"]);this.size=(0,o.getMeasurement)(e.size,"10pt");this.typeface=e.typeface||"Courier";this.underline=(0,o.getInteger)({data:e.underline,defaultValue:0,validate:e=>1===e||2===e});this.underlinePeriod=(0,o.getStringOption)(e.underlinePeriod,["all","word"]);this.use=e.use||"";this.usehref=e.usehref||"";this.weight=(0,o.getStringOption)(e.weight,["normal","bold"]);this.extras=null;this.fill=null}[r.$clean](e){super[r.$clean](e);this[r.$globalData].usedTypefaces.add(this.typeface)}[r.$toStyle](){const e=(0,s.toStyle)(this,"fill"),t=e.color;if(t)if("#000000"===t)delete e.color;else if(!t.startsWith("#")){e.background=t;e.backgroundClip="text";e.color="transparent"}this.baselineShift&&(e.verticalAlign=(0,s.measureToString)(this.baselineShift));e.fontKerning="none"===this.kerningMode?"none":"normal";e.letterSpacing=(0,s.measureToString)(this.letterSpacing);if(0!==this.lineThrough){e.textDecoration="line-through";2===this.lineThrough&&(e.textDecorationStyle="double")}if(0!==this.overline){e.textDecoration="overline";2===this.overline&&(e.textDecorationStyle="double")}e.fontStyle=this.posture;e.fontSize=(0,s.measureToString)(.99*this.size);(0,s.setFontFamily)(this,this,this[r.$globalData].fontFinder,e);if(0!==this.underline){e.textDecoration="underline";2===this.underline&&(e.textDecorationStyle="double")}e.fontWeight=this.weight;return e}}class Format extends r.XFAObject{constructor(e){super(d,"format",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null}}class Handler extends r.StringObject{constructor(e){super(d,"handler");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Hyphenation extends r.XFAObject{constructor(e){super(d,"hyphenation");this.excludeAllCaps=(0,o.getInteger)({data:e.excludeAllCaps,defaultValue:0,validate:e=>1===e});this.excludeInitialCap=(0,o.getInteger)({data:e.excludeInitialCap,defaultValue:0,validate:e=>1===e});this.hyphenate=(0,o.getInteger)({data:e.hyphenate,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.pushCharacterCount=(0,o.getInteger)({data:e.pushCharacterCount,defaultValue:3,validate:e=>e>=0});this.remainCharacterCount=(0,o.getInteger)({data:e.remainCharacterCount,defaultValue:3,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||"";this.wordCharacterCount=(0,o.getInteger)({data:e.wordCharacterCount,defaultValue:7,validate:e=>e>=0})}}class Image extends r.StringObject{constructor(e){super(d,"image");this.aspect=(0,o.getStringOption)(e.aspect,["fit","actual","height","none","width"]);this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.name=e.name||"";this.transferEncoding=(0,o.getStringOption)(e.transferEncoding,["base64","none","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$toHTML](){if(this.contentType&&!p.has(this.contentType.toLowerCase()))return o.HTMLResult.EMPTY;let e=this[r.$globalData].images&&this[r.$globalData].images.get(this.href);if(!e&&(this.href||!this[r.$content]))return o.HTMLResult.EMPTY;e||"base64"!==this.transferEncoding||(e=(0,c.stringToBytes)(atob(this[r.$content])));if(!e)return o.HTMLResult.EMPTY;if(!this.contentType){for(const[t,a]of m)if(e.length>t.length&&t.every(((t,a)=>t===e[a]))){this.contentType=a;break}if(!this.contentType)return o.HTMLResult.EMPTY}const t=new Blob([e],{type:this.contentType});let a;switch(this.aspect){case"fit":case"actual":break;case"height":a={height:"100%",objectFit:"fill"};break;case"none":a={width:"100%",height:"100%",objectFit:"fill"};break;case"width":a={width:"100%",objectFit:"fill"}}const n=this[r.$getParent]();return o.HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:a,src:URL.createObjectURL(t),alt:n?ariaLabel(n[r.$getParent]()):null}})}}class ImageEdit extends r.XFAObject{constructor(e){super(d,"imageEdit",!0);this.data=(0,o.getStringOption)(e.data,["link","embed"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[r.$toHTML](e){return"embed"===this.data?o.HTMLResult.success({name:"div",children:[],attributes:{}}):o.HTMLResult.EMPTY}}class Integer extends r.ContentObject{constructor(e){super(d,"integer");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=parseInt(this[r.$content].trim(),10);this[r.$content]=isNaN(e)?null:e}[r.$toHTML](e){return valueToHtml(null!==this[r.$content]?this[r.$content].toString():"")}}class Issuers extends r.XFAObject{constructor(e){super(d,"issuers",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class Items extends r.XFAObject{constructor(e){super(d,"items",!0);this.id=e.id||"";this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.ref=e.ref||"";this.save=(0,o.getInteger)({data:e.save,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}[r.$toHTML](){const e=[];for(const t of this[r.$getChildren]())e.push(t[r.$text]());return o.HTMLResult.success(e)}}t.Items=Items;class Keep extends r.XFAObject{constructor(e){super(d,"keep",!0);this.id=e.id||"";const t=["none","contentArea","pageArea"];this.intact=(0,o.getStringOption)(e.intact,t);this.next=(0,o.getStringOption)(e.next,t);this.previous=(0,o.getStringOption)(e.previous,t);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class KeyUsage extends r.XFAObject{constructor(e){super(d,"keyUsage");const t=["","yes","no"];this.crlSign=(0,o.getStringOption)(e.crlSign,t);this.dataEncipherment=(0,o.getStringOption)(e.dataEncipherment,t);this.decipherOnly=(0,o.getStringOption)(e.decipherOnly,t);this.digitalSignature=(0,o.getStringOption)(e.digitalSignature,t);this.encipherOnly=(0,o.getStringOption)(e.encipherOnly,t);this.id=e.id||"";this.keyAgreement=(0,o.getStringOption)(e.keyAgreement,t);this.keyCertSign=(0,o.getStringOption)(e.keyCertSign,t);this.keyEncipherment=(0,o.getStringOption)(e.keyEncipherment,t);this.nonRepudiation=(0,o.getStringOption)(e.nonRepudiation,t);this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Line extends r.XFAObject{constructor(e){super(d,"line",!0);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.slope=(0,o.getStringOption)(e.slope,["\\","/"]);this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null}[r.$toHTML](){const e=this[r.$getParent]()[r.$getParent](),t=this.edge||new Edge({}),a=t[r.$toStyle](),n=Object.create(null),i="visible"===t.presence?t.thickness:0;n.strokeWidth=(0,s.measureToString)(i);n.stroke=a.color;let c,l,h,u,d="100%",g="100%";if(e.w<=i){[c,l,h,u]=["50%",0,"50%","100%"];d=n.strokeWidth}else if(e.h<=i){[c,l,h,u]=[0,"50%","100%","50%"];g=n.strokeWidth}else"\\"===this.slope?[c,l,h,u]=[0,0,"100%","100%"]:[c,l,h,u]=[0,"100%","100%",0];const p={name:"svg",children:[{name:"line",attributes:{xmlns:f,x1:c,y1:l,x2:h,y2:u,style:n}}],attributes:{xmlns:f,width:d,height:g,style:{overflow:"visible"}}};if(hasMargin(e))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[p]});p.attributes.style.position="absolute";return o.HTMLResult.success(p)}}class Linear extends r.XFAObject{constructor(e){super(d,"linear",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["toRight","toBottom","toLeft","toTop"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";return`linear-gradient(${this.type.replace(/([RBLT])/," $1").toLowerCase()}, ${e}, ${this.color?this.color[r.$toStyle]():"#000000"})`}}class LockDocument extends r.ContentObject{constructor(e){super(d,"lockDocument");this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){this[r.$content]=(0,o.getStringOption)(this[r.$content],["auto","0","1"])}}class Manifest extends r.XFAObject{constructor(e){super(d,"manifest",!0);this.action=(0,o.getStringOption)(e.action,["include","all","exclude"]);this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.ref=new r.XFAObjectArray}}class Margin extends r.XFAObject{constructor(e){super(d,"margin",!0);this.bottomInset=(0,o.getMeasurement)(e.bottomInset,"0");this.id=e.id||"";this.leftInset=(0,o.getMeasurement)(e.leftInset,"0");this.rightInset=(0,o.getMeasurement)(e.rightInset,"0");this.topInset=(0,o.getMeasurement)(e.topInset,"0");this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toStyle](){return{margin:(0,s.measureToString)(this.topInset)+" "+(0,s.measureToString)(this.rightInset)+" "+(0,s.measureToString)(this.bottomInset)+" "+(0,s.measureToString)(this.leftInset)}}}class Mdp extends r.XFAObject{constructor(e){super(d,"mdp");this.id=e.id||"";this.permissions=(0,o.getInteger)({data:e.permissions,defaultValue:2,validate:e=>1===e||3===e});this.signatureType=(0,o.getStringOption)(e.signatureType,["filler","author"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Medium extends r.XFAObject{constructor(e){super(d,"medium");this.id=e.id||"";this.imagingBBox=(0,o.getBBox)(e.imagingBBox);this.long=(0,o.getMeasurement)(e.long);this.orientation=(0,o.getStringOption)(e.orientation,["portrait","landscape"]);this.short=(0,o.getMeasurement)(e.short);this.stock=e.stock||"";this.trayIn=(0,o.getStringOption)(e.trayIn,["auto","delegate","pageFront"]);this.trayOut=(0,o.getStringOption)(e.trayOut,["auto","delegate"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Message extends r.XFAObject{constructor(e){super(d,"message",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.text=new r.XFAObjectArray}}class NumericEdit extends r.XFAObject{constructor(e){super(d,"numericEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin"),a=this[r.$getParent]()[r.$getParent](),n={name:"input",attributes:{type:"text",fieldId:a[r.$uid],dataId:a[r.$data]&&a[r.$data][r.$uid]||a[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){n.attributes["aria-required"]=!0;n.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[n]})}}class Occur extends r.XFAObject{constructor(e){super(d,"occur",!0);this.id=e.id||"";this.initial=""!==e.initial?(0,o.getInteger)({data:e.initial,defaultValue:"",validate:e=>!0}):"";this.max=""!==e.max?(0,o.getInteger)({data:e.max,defaultValue:1,validate:e=>!0}):"";this.min=""!==e.min?(0,o.getInteger)({data:e.min,defaultValue:1,validate:e=>!0}):"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$clean](){const e=this[r.$getParent](),t=this.min;""===this.min&&(this.min=e instanceof PageArea||e instanceof PageSet?0:1);""===this.max&&(this.max=""===t?e instanceof PageArea||e instanceof PageSet?-1:1:this.min);-1!==this.max&&this.max!0});this.name=e.name||"";this.numbered=(0,o.getInteger)({data:e.numbered,defaultValue:1,validate:e=>!0});this.oddOrEven=(0,o.getStringOption)(e.oddOrEven,["any","even","odd"]);this.pagePosition=(0,o.getStringOption)(e.pagePosition,["any","first","last","only","rest"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.desc=null;this.extras=null;this.medium=null;this.occur=null;this.area=new r.XFAObjectArray;this.contentArea=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.subform=new r.XFAObjectArray}[r.$isUsable](){if(!this[r.$extra]){this[r.$extra]={numberOfUse:0};return!0}return!this.occur||-1===this.occur.max||this[r.$extra].numberOfUsee.oddOrEven===t&&e.pagePosition===a));if(n)return n;n=this.pageArea.children.find((e=>"any"===e.oddOrEven&&e.pagePosition===a));if(n)return n;n=this.pageArea.children.find((e=>"any"===e.oddOrEven&&"any"===e.pagePosition));return n||this.pageArea.children[0]}}class Para extends r.XFAObject{constructor(e){super(d,"para",!0);this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.lineHeight=e.lineHeight?(0,o.getMeasurement)(e.lineHeight,"0pt"):"";this.marginLeft=e.marginLeft?(0,o.getMeasurement)(e.marginLeft,"0pt"):"";this.marginRight=e.marginRight?(0,o.getMeasurement)(e.marginRight,"0pt"):"";this.orphans=(0,o.getInteger)({data:e.orphans,defaultValue:0,validate:e=>e>=0});this.preserve=e.preserve||"";this.radixOffset=e.radixOffset?(0,o.getMeasurement)(e.radixOffset,"0pt"):"";this.spaceAbove=e.spaceAbove?(0,o.getMeasurement)(e.spaceAbove,"0pt"):"";this.spaceBelow=e.spaceBelow?(0,o.getMeasurement)(e.spaceBelow,"0pt"):"";this.tabDefault=e.tabDefault?(0,o.getMeasurement)(this.tabDefault):"";this.tabStops=(e.tabStops||"").trim().split(/\s+/).map(((e,t)=>t%2==1?(0,o.getMeasurement)(e):e));this.textIndent=e.textIndent?(0,o.getMeasurement)(e.textIndent,"0pt"):"";this.use=e.use||"";this.usehref=e.usehref||"";this.vAlign=(0,o.getStringOption)(e.vAlign,["top","bottom","middle"]);this.widows=(0,o.getInteger)({data:e.widows,defaultValue:0,validate:e=>e>=0});this.hyphenation=null}[r.$toStyle](){const e=(0,s.toStyle)(this,"hAlign");""!==this.marginLeft&&(e.paddingLeft=(0,s.measureToString)(this.marginLeft));""!==this.marginRight&&(e.paddingight=(0,s.measureToString)(this.marginRight));""!==this.spaceAbove&&(e.paddingTop=(0,s.measureToString)(this.spaceAbove));""!==this.spaceBelow&&(e.paddingBottom=(0,s.measureToString)(this.spaceBelow));if(""!==this.textIndent){e.textIndent=(0,s.measureToString)(this.textIndent);(0,s.fixTextIndent)(e)}this.lineHeight>0&&(e.lineHeight=(0,s.measureToString)(this.lineHeight));""!==this.tabDefault&&(e.tabSize=(0,s.measureToString)(this.tabDefault));this.tabStops.length;this.hyphenatation&&Object.assign(e,this.hyphenatation[r.$toStyle]());return e}}class PasswordEdit extends r.XFAObject{constructor(e){super(d,"passwordEdit",!0);this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.passwordChar=e.passwordChar||"*";this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}}class Pattern extends r.XFAObject{constructor(e){super(d,"pattern",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["crossHatch","crossDiagonal","diagonalLeft","diagonalRight","horizontal","vertical"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";const t=this.color?this.color[r.$toStyle]():"#000000",a="repeating-linear-gradient",n=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${a}(to top,${n}) ${a}(to right,${n})`;case"crossDiagonal":return`${a}(45deg,${n}) ${a}(-45deg,${n})`;case"diagonalLeft":return`${a}(45deg,${n})`;case"diagonalRight":return`${a}(-45deg,${n})`;case"horizontal":return`${a}(to top,${n})`;case"vertical":return`${a}(to right,${n})`}return""}}class Picture extends r.StringObject{constructor(e){super(d,"picture");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Proto extends r.XFAObject{constructor(e){super(d,"proto",!0);this.appearanceFilter=new r.XFAObjectArray;this.arc=new r.XFAObjectArray;this.area=new r.XFAObjectArray;this.assist=new r.XFAObjectArray;this.barcode=new r.XFAObjectArray;this.bindItems=new r.XFAObjectArray;this.bookend=new r.XFAObjectArray;this.boolean=new r.XFAObjectArray;this.border=new r.XFAObjectArray;this.break=new r.XFAObjectArray;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.button=new r.XFAObjectArray;this.calculate=new r.XFAObjectArray;this.caption=new r.XFAObjectArray;this.certificate=new r.XFAObjectArray;this.certificates=new r.XFAObjectArray;this.checkButton=new r.XFAObjectArray;this.choiceList=new r.XFAObjectArray;this.color=new r.XFAObjectArray;this.comb=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.contentArea=new r.XFAObjectArray;this.corner=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.dateTimeEdit=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.defaultUi=new r.XFAObjectArray;this.desc=new r.XFAObjectArray;this.digestMethod=new r.XFAObjectArray;this.digestMethods=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.edge=new r.XFAObjectArray;this.encoding=new r.XFAObjectArray;this.encodings=new r.XFAObjectArray;this.encrypt=new r.XFAObjectArray;this.encryptData=new r.XFAObjectArray;this.encryption=new r.XFAObjectArray;this.encryptionMethod=new r.XFAObjectArray;this.encryptionMethods=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.execute=new r.XFAObjectArray;this.extras=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.fill=new r.XFAObjectArray;this.filter=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.font=new r.XFAObjectArray;this.format=new r.XFAObjectArray;this.handler=new r.XFAObjectArray;this.hyphenation=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.imageEdit=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.issuers=new r.XFAObjectArray;this.items=new r.XFAObjectArray;this.keep=new r.XFAObjectArray;this.keyUsage=new r.XFAObjectArray;this.line=new r.XFAObjectArray;this.linear=new r.XFAObjectArray;this.lockDocument=new r.XFAObjectArray;this.manifest=new r.XFAObjectArray;this.margin=new r.XFAObjectArray;this.mdp=new r.XFAObjectArray;this.medium=new r.XFAObjectArray;this.message=new r.XFAObjectArray;this.numericEdit=new r.XFAObjectArray;this.occur=new r.XFAObjectArray;this.oid=new r.XFAObjectArray;this.oids=new r.XFAObjectArray;this.overflow=new r.XFAObjectArray;this.pageArea=new r.XFAObjectArray;this.pageSet=new r.XFAObjectArray;this.para=new r.XFAObjectArray;this.passwordEdit=new r.XFAObjectArray;this.pattern=new r.XFAObjectArray;this.picture=new r.XFAObjectArray;this.radial=new r.XFAObjectArray;this.reason=new r.XFAObjectArray;this.reasons=new r.XFAObjectArray;this.rectangle=new r.XFAObjectArray;this.ref=new r.XFAObjectArray;this.script=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray;this.signData=new r.XFAObjectArray;this.signature=new r.XFAObjectArray;this.signing=new r.XFAObjectArray;this.solid=new r.XFAObjectArray;this.speak=new r.XFAObjectArray;this.stipple=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray;this.subjectDN=new r.XFAObjectArray;this.subjectDNs=new r.XFAObjectArray;this.submit=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.textEdit=new r.XFAObjectArray;this.time=new r.XFAObjectArray;this.timeStamp=new r.XFAObjectArray;this.toolTip=new r.XFAObjectArray;this.traversal=new r.XFAObjectArray;this.traverse=new r.XFAObjectArray;this.ui=new r.XFAObjectArray;this.validate=new r.XFAObjectArray;this.value=new r.XFAObjectArray;this.variables=new r.XFAObjectArray}}class Radial extends r.XFAObject{constructor(e){super(d,"radial",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["toEdge","toCenter"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){e=e?e[r.$toStyle]():"#FFFFFF";const t=this.color?this.color[r.$toStyle]():"#000000";return`radial-gradient(circle at center, ${"toEdge"===this.type?`${e},${t}`:`${t},${e}`})`}}class Reason extends r.StringObject{constructor(e){super(d,"reason");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Reasons extends r.XFAObject{constructor(e){super(d,"reasons",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.reason=new r.XFAObjectArray}}class Rectangle extends r.XFAObject{constructor(e){super(d,"rectangle",!0);this.hand=(0,o.getStringOption)(e.hand,["even","left","right"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new r.XFAObjectArray(4);this.edge=new r.XFAObjectArray(4);this.fill=null}[r.$toHTML](){const e=this.edge.children.length?this.edge.children[0]:new Edge({}),t=e[r.$toStyle](),a=Object.create(null);this.fill&&"visible"===this.fill.presence?Object.assign(a,this.fill[r.$toStyle]()):a.fill="transparent";a.strokeWidth=(0,s.measureToString)("visible"===e.presence?e.thickness:0);a.stroke=t.color;const n=(this.corner.children.length?this.corner.children[0]:new Corner({}))[r.$toStyle](),i={name:"svg",children:[{name:"rect",attributes:{xmlns:f,width:"100%",height:"100%",x:0,y:0,rx:n.radius,ry:n.radius,style:a}}],attributes:{xmlns:f,style:{overflow:"visible"},width:"100%",height:"100%"}};if(hasMargin(this[r.$getParent]()[r.$getParent]()))return o.HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[i]});i.attributes.style.position="absolute";return o.HTMLResult.success(i)}}class RefElement extends r.StringObject{constructor(e){super(d,"ref");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Script extends r.StringObject{constructor(e){super(d,"script");this.binding=e.binding||"";this.contentType=e.contentType||"";this.id=e.id||"";this.name=e.name||"";this.runAt=(0,o.getStringOption)(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class SetProperty extends r.XFAObject{constructor(e){super(d,"setProperty");this.connection=e.connection||"";this.ref=e.ref||"";this.target=e.target||""}}t.SetProperty=SetProperty;class SignData extends r.XFAObject{constructor(e){super(d,"signData",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["sign","clear","verify"]);this.ref=e.ref||"";this.target=e.target||"";this.use=e.use||"";this.usehref=e.usehref||"";this.filter=null;this.manifest=null}}class Signature extends r.XFAObject{constructor(e){super(d,"signature",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["PDF1.3","PDF1.6"]);this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.filter=null;this.manifest=null;this.margin=null}}class Signing extends r.XFAObject{constructor(e){super(d,"signing",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new r.XFAObjectArray}}class Solid extends r.XFAObject{constructor(e){super(d,"solid",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[r.$toStyle](e){return e?e[r.$toStyle]():"#FFFFFF"}}class Speak extends r.StringObject{constructor(e){super(d,"speak");this.disable=(0,o.getInteger)({data:e.disable,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.priority=(0,o.getStringOption)(e.priority,["custom","caption","name","toolTip"]);this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Stipple extends r.XFAObject{constructor(e){super(d,"stipple",!0);this.id=e.id||"";this.rate=(0,o.getInteger)({data:e.rate,defaultValue:50,validate:e=>e>=0&&e<=100});this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[r.$toStyle](e){const t=this.rate/100;return c.Util.makeHexColor(Math.round(e.value.r*(1-t)+this.value.r*t),Math.round(e.value.g*(1-t)+this.value.g*t),Math.round(e.value.b*(1-t)+this.value.b*t))}}class Subform extends r.XFAObject{constructor(e){super(d,"subform",!0);this.access=(0,o.getStringOption)(e.access,["open","nonInteractive","protected","readOnly"]);this.allowMacro=(0,o.getInteger)({data:e.allowMacro,defaultValue:0,validate:e=>1===e});this.anchorType=(0,o.getStringOption)(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=(0,o.getInteger)({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.columnWidths=(e.columnWidths||"").trim().split(/\s+/).map((e=>"-1"===e?-1:(0,o.getMeasurement)(e)));this.h=e.h?(0,o.getMeasurement)(e.h):"";this.hAlign=(0,o.getStringOption)(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=(0,o.getStringOption)(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.locale=e.locale||"";this.maxH=(0,o.getMeasurement)(e.maxH,"0pt");this.maxW=(0,o.getMeasurement)(e.maxW,"0pt");this.mergeMode=(0,o.getStringOption)(e.mergeMode,["consumeData","matchTemplate"]);this.minH=(0,o.getMeasurement)(e.minH,"0pt");this.minW=(0,o.getMeasurement)(e.minW,"0pt");this.name=e.name||"";this.presence=(0,o.getStringOption)(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=(0,o.getRelevant)(e.relevant);this.restoreState=(0,o.getStringOption)(e.restoreState,["manual","auto"]);this.scope=(0,o.getStringOption)(e.scope,["name","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?(0,o.getMeasurement)(e.w):"";this.x=(0,o.getMeasurement)(e.x,"0pt");this.y=(0,o.getMeasurement)(e.y,"0pt");this.assist=null;this.bind=null;this.bookend=null;this.border=null;this.break=null;this.calculate=null;this.desc=null;this.extras=null;this.keep=null;this.margin=null;this.occur=null;this.overflow=null;this.pageSet=null;this.para=null;this.traversal=null;this.validate=null;this.variables=null;this.area=new r.XFAObjectArray;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.connect=new r.XFAObjectArray;this.draw=new r.XFAObjectArray;this.event=new r.XFAObjectArray;this.exObject=new r.XFAObjectArray;this.exclGroup=new r.XFAObjectArray;this.field=new r.XFAObjectArray;this.proto=new r.XFAObjectArray;this.setProperty=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}[r.$getSubformParent](){const e=this[r.$getParent]();return e instanceof SubformSet?e[r.$getSubformParent]():e}[r.$isBindable](){return!0}[r.$isThereMoreWidth](){return this.layout.endsWith("-tb")&&0===this[r.$extra].attempt&&this[r.$extra].numberInLine>0||this[r.$getParent]()[r.$isThereMoreWidth]()}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$flushHTML](){return(0,i.flushHTML)(this)}[r.$addHTML](e,t){(0,i.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,i.getAvailableSpace)(this)}[r.$isSplittable](){const e=this[r.$getSubformParent]();if(!e[r.$isSplittable]())return!1;if(void 0!==this[r.$extra]._isSplittable)return this[r.$extra]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[r.$extra]._isSplittable=!1;return!1}if(this.keep&&"none"!==this.keep.intact){this[r.$extra]._isSplittable=!1;return!1}if(e.layout&&e.layout.endsWith("-tb")&&0!==e[r.$extra].numberInLine)return!1;this[r.$extra]._isSplittable=!0;return!0}[r.$toHTML](e){setTabIndex(this);if(this.break){if("auto"!==this.break.after||""!==this.break.afterTarget){const e=new BreakAfter({targetType:this.break.after,target:this.break.afterTarget,startNew:this.break.startNew.toString()});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.breakAfter.push(e)}if("auto"!==this.break.before||""!==this.break.beforeTarget){const e=new BreakBefore({targetType:this.break.before,target:this.break.beforeTarget,startNew:this.break.startNew.toString()});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.breakBefore.push(e)}if(""!==this.break.overflowTarget){const e=new Overflow({target:this.break.overflowTarget,leader:this.break.overflowLeader,trailer:this.break.overflowTrailer});e[r.$globalData]=this[r.$globalData];this[r.$appendChild](e);this.overflow.push(e)}this[r.$removeChild](this.break);this.break=null}if("hidden"===this.presence||"inactive"===this.presence)return o.HTMLResult.EMPTY;(this.breakBefore.children.length>1||this.breakAfter.children.length>1)&&(0,c.warn)("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");if(this.breakBefore.children.length>=1){const e=this.breakBefore.children[0];if(handleBreak(e))return o.HTMLResult.breakNode(e)}if(this[r.$extra]&&this[r.$extra].afterBreakAfter)return o.HTMLResult.EMPTY;(0,s.fixDimensions)(this);const t=[],a={id:this[r.$uid],class:[]};(0,s.setAccess)(this,a.class);this[r.$extra]||(this[r.$extra]=Object.create(null));Object.assign(this[r.$extra],{children:t,line:null,attributes:a,attempt:0,numberInLine:0,availableSpace:{width:Math.min(this.w||1/0,e.width),height:Math.min(this.h||1/0,e.height)},width:0,height:0,prevHeight:0,currentWidth:0});const n=this[r.$getTemplateRoot](),l=n[r.$extra].noLayoutFailure,h=this[r.$isSplittable]();h||setFirstUnsplittable(this);if(!(0,i.checkDimensions)(this,e))return o.HTMLResult.FAILURE;const u=new Set(["area","draw","exclGroup","field","subform","subformSet"]);if(this.layout.includes("row")){const e=this[r.$getSubformParent]().columnWidths;if(Array.isArray(e)&&e.length>0){this[r.$extra].columnWidths=e;this[r.$extra].currentColumn=0}}const d=(0,s.toStyle)(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),f=["xfaSubform"],g=(0,s.layoutClass)(this);g&&f.push(g);a.style=d;a.class=f;this.name&&(a.xfaName=this.name);if(this.overflow){const t=this.overflow[r.$getExtra]();if(t.addLeader){t.addLeader=!1;handleOverflow(this,t.leader,e)}}this[r.$pushPara]();const p="lr-tb"===this.layout||"rl-tb"===this.layout,m=p?2:1;for(;this[r.$extra].attempt=1){const e=this.breakAfter.children[0];if(handleBreak(e)){this[r.$extra].afterBreakAfter=C;return o.HTMLResult.breakNode(e)}}delete this[r.$extra];return C}}class SubformSet extends r.XFAObject{constructor(e){super(d,"subformSet",!0);this.id=e.id||"";this.name=e.name||"";this.relation=(0,o.getStringOption)(e.relation,["ordered","choice","unordered"]);this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.bookend=null;this.break=null;this.desc=null;this.extras=null;this.occur=null;this.overflow=null;this.breakAfter=new r.XFAObjectArray;this.breakBefore=new r.XFAObjectArray;this.subform=new r.XFAObjectArray;this.subformSet=new r.XFAObjectArray}*[r.$getContainedChildren](){yield*getContainedChildren(this)}[r.$getSubformParent](){let e=this[r.$getParent]();for(;!(e instanceof Subform);)e=e[r.$getParent]();return e}[r.$isBindable](){return!0}}class SubjectDN extends r.ContentObject{constructor(e){super(d,"subjectDN");this.delimiter=e.delimiter||",";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){this[r.$content]=new Map(this[r.$content].split(this.delimiter).map((e=>{(e=e.split("=",2))[0]=e[0].trim();return e})))}}class SubjectDNs extends r.XFAObject{constructor(e){super(d,"subjectDNs",!0);this.id=e.id||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.subjectDN=new r.XFAObjectArray}}class Submit extends r.XFAObject{constructor(e){super(d,"submit",!0);this.embedPDF=(0,o.getInteger)({data:e.embedPDF,defaultValue:0,validate:e=>1===e});this.format=(0,o.getStringOption)(e.format,["xdp","formdata","pdf","urlencoded","xfd","xml"]);this.id=e.id||"";this.target=e.target||"";this.textEncoding=(0,o.getKeyword)({data:e.textEncoding?e.textEncoding.toLowerCase():"",defaultValue:"",validate:e=>["utf-8","big-five","fontspecific","gbk","gb-18030","gb-2312","ksc-5601","none","shift-jis","ucs-2","utf-16"].includes(e)||e.match(/iso-8859-\d{2}/)});this.use=e.use||"";this.usehref=e.usehref||"";this.xdpContent=e.xdpContent||"";this.encrypt=null;this.encryptData=new r.XFAObjectArray;this.signData=new r.XFAObjectArray}}class Template extends r.XFAObject{constructor(e){super(d,"template",!0);this.baseProfile=(0,o.getStringOption)(e.baseProfile,["full","interactiveForms"]);this.extras=null;this.subform=new r.XFAObjectArray}[r.$finalize](){0===this.subform.children.length&&(0,c.warn)("XFA - No subforms in template node.");this.subform.children.length>=2&&(0,c.warn)("XFA - Several subforms in template node: please file a bug.");this[r.$tabIndex]=5e3}[r.$isSplittable](){return!0}[r.$searchNode](e,t){return e.startsWith("#")?[this[r.$ids].get(e.slice(1))]:(0,u.searchNode)(this,t,e,!0,!0)}*[r.$toPages](){if(!this.subform.children.length)return o.HTMLResult.success({name:"div",children:[]});this[r.$extra]={overflowNode:null,firstUnsplittable:null,currentContentArea:null,currentPageArea:null,noLayoutFailure:!1,pageNumber:1,pagePosition:"first",oddOrEven:"odd",blankOrNotBlank:"nonBlank",paraStack:[]};const e=this.subform.children[0];e.pageSet[r.$cleanPage]();const t=e.pageSet.pageArea.children,a={name:"div",children:[]};let n=null,i=null,s=null;if(e.breakBefore.children.length>=1){i=e.breakBefore.children[0];s=i.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){i=e.subform.children[0].breakBefore.children[0];s=i.target}else if(e.break&&e.break.beforeTarget){i=e.break;s=i.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break&&e.subform.children[0].break.beforeTarget){i=e.subform.children[0].break;s=i.beforeTarget}if(i){const e=this[r.$searchNode](s,i[r.$getParent]());if(e instanceof PageArea){n=e;i[r.$extra]={}}}n||(n=t[0]);n[r.$extra]={numberOfUse:1};const l=n[r.$getParent]();l[r.$extra]={numberOfUse:1,pageIndex:l.pageArea.children.indexOf(n),pageSetIndex:0};let h,u=null,d=null,f=!0,g=0,p=0;for(;;){if(f)g=0;else{a.children.pop();if(3==++g){(0,c.warn)("XFA - Something goes wrong: please file a bug.");return a}}h=null;this[r.$extra].currentPageArea=n;const t=n[r.$toHTML]().html;a.children.push(t);if(u){this[r.$extra].noLayoutFailure=!0;t.children.push(u[r.$toHTML](n[r.$extra].space).html);u=null}if(d){this[r.$extra].noLayoutFailure=!0;t.children.push(d[r.$toHTML](n[r.$extra].space).html);d=null}const i=n.contentArea.children,s=t.children.filter((e=>e.attributes.class.includes("xfaContentarea")));f=!1;this[r.$extra].firstUnsplittable=null;this[r.$extra].noLayoutFailure=!1;const flush=t=>{const a=e[r.$flushHTML]();if(a){f=f||a.children&&0!==a.children.length;s[t].children.push(a)}};for(let t=p,n=i.length;t1&&a.children.pop();return a}if(c.isBreak()){const e=c.breakNode;flush(t);if("auto"===e.targetType)continue;if(e.leader){u=this[r.$searchNode](e.leader,e[r.$getParent]());u=u?u[0]:null}if(e.trailer){d=this[r.$searchNode](e.trailer,e[r.$getParent]());d=d?d[0]:null}if("pageArea"===e.targetType){h=e[r.$extra].target;t=1/0}else if(e[r.$extra].target){h=e[r.$extra].target;p=e[r.$extra].index+1;t=1/0}else t=e[r.$extra].index}else if(this[r.$extra].overflowNode){const e=this[r.$extra].overflowNode;this[r.$extra].overflowNode=null;const a=e[r.$getExtra](),n=a.target;a.addLeader=null!==a.leader;a.addTrailer=null!==a.trailer;flush(t);const s=t;t=1/0;if(n instanceof PageArea)h=n;else if(n instanceof ContentArea){const e=i.indexOf(n);if(-1!==e)e>s?t=e-1:p=e;else{h=n[r.$getParent]();p=h.contentArea.children.indexOf(n)}}}else flush(t)}this[r.$extra].pageNumber+=1;h&&(h[r.$isUsable]()?h[r.$extra].numberOfUse+=1:h=null);n=h||n[r.$getNextPage]();yield null}}}t.Template=Template;class Text extends r.ContentObject{constructor(e){super(d,"text");this.id=e.id||"";this.maxChars=(0,o.getInteger)({data:e.maxChars,defaultValue:0,validate:e=>e>=0});this.name=e.name||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$acceptWhitespace](){return!0}[r.$onChild](e){if(e[r.$namespaceId]===n.NamespaceIds.xhtml.id){this[r.$content]=e;return!0}(0,c.warn)(`XFA - Invalid content in Text: ${e[r.$nodeName]}.`);return!1}[r.$onText](e){this[r.$content]instanceof r.XFAObject||super[r.$onText](e)}[r.$finalize](){"string"==typeof this[r.$content]&&(this[r.$content]=this[r.$content].replace(/\r\n/g,"\n"))}[r.$getExtra](){return"string"==typeof this[r.$content]?this[r.$content].split(/[\u2029\u2028\n]/).reduce(((e,t)=>{t&&e.push(t);return e}),[]).join("\n"):this[r.$content][r.$text]()}[r.$toHTML](e){if("string"==typeof this[r.$content]){const e=valueToHtml(this[r.$content]).html;if(this[r.$content].includes("\u2029")){e.name="div";e.children=[];this[r.$content].split("\u2029").map((e=>e.split(/[\u2028\n]/).reduce(((e,t)=>{e.push({name:"span",value:t},{name:"br"});return e}),[]))).forEach((t=>{e.children.push({name:"p",children:t})}))}else if(/[\u2028\n]/.test(this[r.$content])){e.name="div";e.children=[];this[r.$content].split(/[\u2028\n]/).forEach((t=>{e.children.push({name:"span",value:t},{name:"br"})}))}return o.HTMLResult.success(e)}return this[r.$content][r.$toHTML](e)}}t.Text=Text;class TextEdit extends r.XFAObject{constructor(e){super(d,"textEdit",!0);this.allowRichText=(0,o.getInteger)({data:e.allowRichText,defaultValue:0,validate:e=>1===e});this.hScrollPolicy=(0,o.getStringOption)(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.multiLine=(0,o.getInteger)({data:e.multiLine,defaultValue:"",validate:e=>0===e||1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.vScrollPolicy=(0,o.getStringOption)(e.vScrollPolicy,["auto","off","on"]);this.border=null;this.comb=null;this.extras=null;this.margin=null}[r.$toHTML](e){const t=(0,s.toStyle)(this,"border","font","margin");let a;const n=this[r.$getParent]()[r.$getParent]();""===this.multiLine&&(this.multiLine=n instanceof Draw?1:0);a=1===this.multiLine?{name:"textarea",attributes:{dataId:n[r.$data]&&n[r.$data][r.$uid]||n[r.$uid],fieldId:n[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:n[r.$data]&&n[r.$data][r.$uid]||n[r.$uid],fieldId:n[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(n),"aria-required":!1}};if(isRequired(n)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Time extends r.StringObject{constructor(e){super(d,"time");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[r.$finalize](){const e=this[r.$content].trim();this[r.$content]=e?new Date(e):null}[r.$toHTML](e){return valueToHtml(this[r.$content]?this[r.$content].toString():"")}}class TimeStamp extends r.XFAObject{constructor(e){super(d,"timeStamp");this.id=e.id||"";this.server=e.server||"";this.type=(0,o.getStringOption)(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class ToolTip extends r.StringObject{constructor(e){super(d,"toolTip");this.id=e.id||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Traversal extends r.XFAObject{constructor(e){super(d,"traversal",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.traverse=new r.XFAObjectArray}}class Traverse extends r.XFAObject{constructor(e){super(d,"traverse",!0);this.id=e.id||"";this.operation=(0,o.getStringOption)(e.operation,["next","back","down","first","left","right","up"]);this.ref=e.ref||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.script=null}get name(){return this.operation}[r.$isTransparent](){return!1}}class Ui extends r.XFAObject{constructor(e){super(d,"ui",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null;this.barcode=null;this.button=null;this.checkButton=null;this.choiceList=null;this.dateTimeEdit=null;this.defaultUi=null;this.imageEdit=null;this.numericEdit=null;this.passwordEdit=null;this.signature=null;this.textEdit=null}[r.$getExtra](){if(void 0===this[r.$extra]){for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"picture"===e)continue;const t=this[e];if(t instanceof r.XFAObject){this[r.$extra]=t;return t}}this[r.$extra]=null}return this[r.$extra]}[r.$toHTML](e){const t=this[r.$getExtra]();return t?t[r.$toHTML](e):o.HTMLResult.EMPTY}}class Validate extends r.XFAObject{constructor(e){super(d,"validate",!0);this.formatTest=(0,o.getStringOption)(e.formatTest,["warning","disabled","error"]);this.id=e.id||"";this.nullTest=(0,o.getStringOption)(e.nullTest,["disabled","error","warning"]);this.scriptTest=(0,o.getStringOption)(e.scriptTest,["error","disabled","warning"]);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.message=null;this.picture=null;this.script=null}}class Value extends r.XFAObject{constructor(e){super(d,"value",!0);this.id=e.id||"";this.override=(0,o.getInteger)({data:e.override,defaultValue:0,validate:e=>1===e});this.relevant=(0,o.getRelevant)(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.arc=null;this.boolean=null;this.date=null;this.dateTime=null;this.decimal=null;this.exData=null;this.float=null;this.image=null;this.integer=null;this.line=null;this.rectangle=null;this.text=null;this.time=null}[r.$setValue](e){const t=this[r.$getParent]();if(t instanceof Field&&t.ui&&t.ui.imageEdit){if(!this.image){this.image=new Image({});this[r.$appendChild](this.image)}this.image[r.$content]=e[r.$content];return}const a=e[r.$nodeName];if(null===this[a]){for(const e of Object.getOwnPropertyNames(this)){const t=this[e];if(t instanceof r.XFAObject){this[e]=null;this[r.$removeChild](t)}}this[e[r.$nodeName]]=e;this[r.$appendChild](e)}else this[a][r.$content]=e[r.$content]}[r.$text](){if(this.exData)return"string"==typeof this.exData[r.$content]?this.exData[r.$content].trim():this.exData[r.$content][r.$text]().trim();for(const e of Object.getOwnPropertyNames(this)){if("image"===e)continue;const t=this[e];if(t instanceof r.XFAObject)return(t[r.$content]||"").toString().trim()}return null}[r.$toHTML](e){for(const t of Object.getOwnPropertyNames(this)){const a=this[t];if(a instanceof r.XFAObject)return a[r.$toHTML](e)}return o.HTMLResult.EMPTY}}t.Value=Value;class Variables extends r.XFAObject{constructor(e){super(d,"variables",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new r.XFAObjectArray;this.date=new r.XFAObjectArray;this.dateTime=new r.XFAObjectArray;this.decimal=new r.XFAObjectArray;this.exData=new r.XFAObjectArray;this.float=new r.XFAObjectArray;this.image=new r.XFAObjectArray;this.integer=new r.XFAObjectArray;this.manifest=new r.XFAObjectArray;this.script=new r.XFAObjectArray;this.text=new r.XFAObjectArray;this.time=new r.XFAObjectArray}[r.$isTransparent](){return!0}}class TemplateNamespace{static[n.$buildXFAObject](e,t){if(TemplateNamespace.hasOwnProperty(e)){const a=TemplateNamespace[e](t);a[r.$setSetAttributes](t);return a}}static appearanceFilter(e){return new AppearanceFilter(e)}static arc(e){return new Arc(e)}static area(e){return new Area(e)}static assist(e){return new Assist(e)}static barcode(e){return new Barcode(e)}static bind(e){return new Bind(e)}static bindItems(e){return new BindItems(e)}static bookend(e){return new Bookend(e)}static boolean(e){return new BooleanElement(e)}static border(e){return new Border(e)}static break(e){return new Break(e)}static breakAfter(e){return new BreakAfter(e)}static breakBefore(e){return new BreakBefore(e)}static button(e){return new Button(e)}static calculate(e){return new Calculate(e)}static caption(e){return new Caption(e)}static certificate(e){return new Certificate(e)}static certificates(e){return new Certificates(e)}static checkButton(e){return new CheckButton(e)}static choiceList(e){return new ChoiceList(e)}static color(e){return new Color(e)}static comb(e){return new Comb(e)}static connect(e){return new Connect(e)}static contentArea(e){return new ContentArea(e)}static corner(e){return new Corner(e)}static date(e){return new DateElement(e)}static dateTime(e){return new DateTime(e)}static dateTimeEdit(e){return new DateTimeEdit(e)}static decimal(e){return new Decimal(e)}static defaultUi(e){return new DefaultUi(e)}static desc(e){return new Desc(e)}static digestMethod(e){return new DigestMethod(e)}static digestMethods(e){return new DigestMethods(e)}static draw(e){return new Draw(e)}static edge(e){return new Edge(e)}static encoding(e){return new Encoding(e)}static encodings(e){return new Encodings(e)}static encrypt(e){return new Encrypt(e)}static encryptData(e){return new EncryptData(e)}static encryption(e){return new Encryption(e)}static encryptionMethod(e){return new EncryptionMethod(e)}static encryptionMethods(e){return new EncryptionMethods(e)}static event(e){return new Event(e)}static exData(e){return new ExData(e)}static exObject(e){return new ExObject(e)}static exclGroup(e){return new ExclGroup(e)}static execute(e){return new Execute(e)}static extras(e){return new Extras(e)}static field(e){return new Field(e)}static fill(e){return new Fill(e)}static filter(e){return new Filter(e)}static float(e){return new Float(e)}static font(e){return new Font(e)}static format(e){return new Format(e)}static handler(e){return new Handler(e)}static hyphenation(e){return new Hyphenation(e)}static image(e){return new Image(e)}static imageEdit(e){return new ImageEdit(e)}static integer(e){return new Integer(e)}static issuers(e){return new Issuers(e)}static items(e){return new Items(e)}static keep(e){return new Keep(e)}static keyUsage(e){return new KeyUsage(e)}static line(e){return new Line(e)}static linear(e){return new Linear(e)}static lockDocument(e){return new LockDocument(e)}static manifest(e){return new Manifest(e)}static margin(e){return new Margin(e)}static mdp(e){return new Mdp(e)}static medium(e){return new Medium(e)}static message(e){return new Message(e)}static numericEdit(e){return new NumericEdit(e)}static occur(e){return new Occur(e)}static oid(e){return new Oid(e)}static oids(e){return new Oids(e)}static overflow(e){return new Overflow(e)}static pageArea(e){return new PageArea(e)}static pageSet(e){return new PageSet(e)}static para(e){return new Para(e)}static passwordEdit(e){return new PasswordEdit(e)}static pattern(e){return new Pattern(e)}static picture(e){return new Picture(e)}static proto(e){return new Proto(e)}static radial(e){return new Radial(e)}static reason(e){return new Reason(e)}static reasons(e){return new Reasons(e)}static rectangle(e){return new Rectangle(e)}static ref(e){return new RefElement(e)}static script(e){return new Script(e)}static setProperty(e){return new SetProperty(e)}static signData(e){return new SignData(e)}static signature(e){return new Signature(e)}static signing(e){return new Signing(e)}static solid(e){return new Solid(e)}static speak(e){return new Speak(e)}static stipple(e){return new Stipple(e)}static subform(e){return new Subform(e)}static subformSet(e){return new SubformSet(e)}static subjectDN(e){return new SubjectDN(e)}static subjectDNs(e){return new SubjectDNs(e)}static submit(e){return new Submit(e)}static template(e){return new Template(e)}static text(e){return new Text(e)}static textEdit(e){return new TextEdit(e)}static time(e){return new Time(e)}static timeStamp(e){return new TimeStamp(e)}static toolTip(e){return new ToolTip(e)}static traversal(e){return new Traversal(e)}static traverse(e){return new Traverse(e)}static ui(e){return new Ui(e)}static validate(e){return new Validate(e)}static value(e){return new Value(e)}static variables(e){return new Variables(e)}}t.TemplateNamespace=TemplateNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.addHTML=function addHTML(e,t,a){const i=e[r.$extra],s=i.availableSpace,[o,c,l,h]=a;switch(e.layout){case"position":i.width=Math.max(i.width,o+l);i.height=Math.max(i.height,c+h);i.children.push(t);break;case"lr-tb":case"rl-tb":if(!i.line||1===i.attempt){i.line=createLine(e,[]);i.children.push(i.line);i.numberInLine=0}i.numberInLine+=1;i.line.children.push(t);if(0===i.attempt){i.currentWidth+=l;i.height=Math.max(i.height,i.prevHeight+h)}else{i.currentWidth=l;i.prevHeight=i.height;i.height+=h;i.attempt=0}i.width=Math.max(i.width,i.currentWidth);break;case"rl-row":case"row":{i.children.push(t);i.width+=l;i.height=Math.max(i.height,h);const e=(0,n.measureToString)(i.height);for(const t of i.children)t.attributes.style.height=e;break}case"table":case"tb":i.width=Math.min(s.width,Math.max(i.width,l));i.height+=h;i.children.push(t)}};t.checkDimensions=function checkDimensions(e,t){if(null===e[r.$getTemplateRoot]()[r.$extra].firstUnsplittable)return!0;if(0===e.w||0===e.h)return!0;const a=e[r.$getSubformParent](),n=a[r.$extra]&&a[r.$extra].attempt||0,[,i,s,o]=function getTransformedBBox(e){let t,a,r=""===e.w?NaN:e.w,n=""===e.h?NaN:e.h,[i,s]=[0,0];switch(e.anchorType||""){case"bottomCenter":[i,s]=[r/2,n];break;case"bottomLeft":[i,s]=[0,n];break;case"bottomRight":[i,s]=[r,n];break;case"middleCenter":[i,s]=[r/2,n/2];break;case"middleLeft":[i,s]=[0,n/2];break;case"middleRight":[i,s]=[r,n/2];break;case"topCenter":[i,s]=[r/2,0];break;case"topRight":[i,s]=[r,0]}switch(e.rotate||0){case 0:[t,a]=[-i,-s];break;case 90:[t,a]=[-s,i];[r,n]=[n,-r];break;case 180:[t,a]=[i,s];[r,n]=[-r,-n];break;case 270:[t,a]=[s,-i];[r,n]=[-n,r]}return[e.x+t+Math.min(0,r),e.y+a+Math.min(0,n),Math.abs(r),Math.abs(n)]}(e);switch(a.layout){case"lr-tb":case"rl-tb":return 0===n?e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure?""!==e.w?Math.round(s-t.width)<=2:t.width>2:!(""!==e.h&&Math.round(o-t.height)>2)&&(""!==e.w?Math.round(s-t.width)<=2||0===a[r.$extra].numberInLine&&t.height>2:t.width>2):!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||!(""!==e.h&&Math.round(o-t.height)>2)&&((""===e.w||Math.round(s-t.width)<=2||!a[r.$isThereMoreWidth]())&&t.height>2);case"table":case"tb":return!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||(""===e.h||e[r.$isSplittable]()?(""===e.w||Math.round(s-t.width)<=2||!a[r.$isThereMoreWidth]())&&t.height>2:Math.round(o-t.height)<=2);case"position":if(e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure)return!0;if(""===e.h||Math.round(o+i-t.height)<=2)return!0;const c=e[r.$getTemplateRoot]()[r.$extra].currentContentArea;return o+i>c.h;case"rl-row":case"row":return!!e[r.$getTemplateRoot]()[r.$extra].noLayoutFailure||(""===e.h||Math.round(o-t.height)<=2);default:return!0}};t.flushHTML=function flushHTML(e){if(!e[r.$extra])return null;const t={name:"div",attributes:e[r.$extra].attributes,children:e[r.$extra].children};if(e[r.$extra].failingNode){const a=e[r.$extra].failingNode[r.$flushHTML]();a&&(e.layout.endsWith("-tb")?t.children.push(createLine(e,[a])):t.children.push(a))}if(0===t.children.length)return null;return t};t.getAvailableSpace=function getAvailableSpace(e){const t=e[r.$extra].availableSpace,a=e.margin?e.margin.topInset+e.margin.bottomInset:0,n=e.margin?e.margin.leftInset+e.margin.rightInset:0;switch(e.layout){case"lr-tb":case"rl-tb":return 0===e[r.$extra].attempt?{width:t.width-n-e[r.$extra].currentWidth,height:t.height-a-e[r.$extra].prevHeight}:{width:t.width-n,height:t.height-a-e[r.$extra].height};case"rl-row":case"row":return{width:e[r.$extra].columnWidths.slice(e[r.$extra].currentColumn).reduce(((e,t)=>e+t)),height:t.height-n};case"table":case"tb":return{width:t.width-n,height:t.height-a-e[r.$extra].height};default:return t}};var r=a(77),n=a(84);function createLine(e,t){return{name:"div",attributes:{class:["lr-tb"===e.layout?"xfaLr":"xfaRl"]},children:t}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.computeBbox=function computeBbox(e,t,a){let n;if(""!==e.w&&""!==e.h)n=[e.x,e.y,e.w,e.h];else{if(!a)return null;let i=e.w;if(""===i){if(0===e.maxW){const t=e[r.$getSubformParent]();i="position"===t.layout&&""!==t.w?0:e.minW}else i=Math.min(e.maxW,a.width);t.attributes.style.width=measureToString(i)}let s=e.h;if(""===s){if(0===e.maxH){const t=e[r.$getSubformParent]();s="position"===t.layout&&""!==t.h?0:e.minH}else s=Math.min(e.maxH,a.height);t.attributes.style.height=measureToString(s)}n=[e.x,e.y,i,s]}return n};t.createWrapper=function createWrapper(e,t){const{attributes:a}=t,{style:n}=a,i={name:"div",attributes:{class:["xfaWrapper"],style:Object.create(null)},children:[]};a.class.push("xfaWrapped");if(e.border){const{widths:a,insets:s}=e.border[r.$extra];let o,c,l=s[0],h=s[3];const u=s[0]+s[2],d=s[1]+s[3];switch(e.border.hand){case"even":l-=a[0]/2;h-=a[3]/2;o=`calc(100% + ${(a[1]+a[3])/2-d}px)`;c=`calc(100% + ${(a[0]+a[2])/2-u}px)`;break;case"left":l-=a[0];h-=a[3];o=`calc(100% + ${a[1]+a[3]-d}px)`;c=`calc(100% + ${a[0]+a[2]-u}px)`;break;case"right":o=d?`calc(100% - ${d}px)`:"100%";c=u?`calc(100% - ${u}px)`:"100%"}const f=["xfaBorder"];isPrintOnly(e.border)&&f.push("xfaPrintOnly");const g={name:"div",attributes:{class:f,style:{top:`${l}px`,left:`${h}px`,width:o,height:c}},children:[]};for(const e of["border","borderWidth","borderColor","borderRadius","borderStyle"])if(void 0!==n[e]){g.attributes.style[e]=n[e];delete n[e]}i.children.push(g,t)}else i.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==n[e]){i.attributes.style[e]=n[e];delete n[e]}"absolute"===n.position?i.attributes.style.position="absolute":i.attributes.style.position="relative";delete n.position;if(n.alignSelf){i.attributes.style.alignSelf=n.alignSelf;delete n.alignSelf}return i};t.fixDimensions=function fixDimensions(e){const t=e[r.$getSubformParent]();if(t.layout&&t.layout.includes("row")){const a=t[r.$extra],n=e.colSpan;let i;i=-1===n?a.columnWidths.slice(a.currentColumn).reduce(((e,t)=>e+t),0):a.columnWidths.slice(a.currentColumn,a.currentColumn+n).reduce(((e,t)=>e+t),0);isNaN(i)||(e.w=i)}t.layout&&"position"!==t.layout&&(e.x=e.y=0);"table"===e.layout&&""===e.w&&Array.isArray(e.columnWidths)&&(e.w=e.columnWidths.reduce(((e,t)=>e+t),0))};t.fixTextIndent=function fixTextIndent(e){const t=(0,i.getMeasurement)(e.textIndent,"0px");if(t>=0)return;const a="padding"+("left"==("right"===e.textAlign?"right":"left")?"Left":"Right"),r=(0,i.getMeasurement)(e[a],"0px");e[a]=r-t+"px"};t.fixURL=function fixURL(e){const t=(0,n.createValidAbsoluteUrl)(e,null,{addDefaultProtocol:!0,tryConvertEncoding:!0});return t?t.href:null};t.isPrintOnly=isPrintOnly;t.layoutClass=function layoutClass(e){switch(e.layout){case"position":default:return"xfaPosition";case"lr-tb":return"xfaLrTb";case"rl-row":return"xfaRlRow";case"rl-tb":return"xfaRlTb";case"row":return"xfaRow";case"table":return"xfaTable";case"tb":return"xfaTb"}};t.layoutNode=function layoutNode(e,t){let a=null,n=null,i=!1;if((!e.w||!e.h)&&e.value){let s=0,o=0;if(e.margin){s=e.margin.leftInset+e.margin.rightInset;o=e.margin.topInset+e.margin.bottomInset}let c=null,l=null;if(e.para){l=Object.create(null);c=""===e.para.lineHeight?null:e.para.lineHeight;l.top=""===e.para.spaceAbove?0:e.para.spaceAbove;l.bottom=""===e.para.spaceBelow?0:e.para.spaceBelow;l.left=""===e.para.marginLeft?0:e.para.marginLeft;l.right=""===e.para.marginRight?0:e.para.marginRight}let h=e.font;if(!h){const t=e[r.$getTemplateRoot]();let a=e[r.$getParent]();for(;a&&a!==t;){if(a.font){h=a.font;break}a=a[r.$getParent]()}}const u=(e.w||t.width)-s,d=e[r.$globalData].fontFinder;if(e.value.exData&&e.value.exData[r.$content]&&"text/html"===e.value.exData.contentType){const t=layoutText(e.value.exData[r.$content],h,l,c,d,u);n=t.width;a=t.height;i=t.isBroken}else{const t=e.value[r.$text]();if(t){const e=layoutText(t,h,l,c,d,u);n=e.width;a=e.height;i=e.isBroken}}null===n||e.w||(n+=s);null===a||e.h||(a+=o)}return{w:n,h:a,isBroken:i}};t.measureToString=measureToString;t.setAccess=function setAccess(e,t){switch(e.access){case"nonInteractive":t.push("xfaNonInteractive");break;case"readOnly":t.push("xfaReadOnly");break;case"protected":t.push("xfaDisabled")}};t.setFontFamily=function setFontFamily(e,t,a,r){if(!a){delete r.fontFamily;return}const n=(0,i.stripQuotes)(e.typeface);r.fontFamily=`"${n}"`;const o=a.find(n);if(o){const{fontFamily:a}=o.regular.cssFontInfo;a!==n&&(r.fontFamily=`"${a}"`);const i=getCurrentPara(t);if(i&&""!==i.lineHeight)return;if(r.lineHeight)return;const c=(0,s.selectFont)(e,o);c&&(r.lineHeight=Math.max(1.2,c.lineHeight))}};t.setMinMaxDimensions=function setMinMaxDimensions(e,t){if("position"===e[r.$getSubformParent]().layout){e.minW>0&&(t.minWidth=measureToString(e.minW));e.maxW>0&&(t.maxWidth=measureToString(e.maxW));e.minH>0&&(t.minHeight=measureToString(e.minH));e.maxH>0&&(t.maxHeight=measureToString(e.maxH))}};t.setPara=function setPara(e,t,a){if(a.attributes.class&&a.attributes.class.includes("xfaRich")){if(t){""===e.h&&(t.height="auto");""===e.w&&(t.width="auto")}const n=getCurrentPara(e);if(n){const e=a.attributes.style;e.display="flex";e.flexDirection="column";switch(n.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=n[r.$toStyle]();for(const[a,r]of Object.entries(t))a in e||(e[a]=r)}}};t.toStyle=function toStyle(e,...t){const a=Object.create(null);for(const i of t){const t=e[i];if(null!==t)if(c.hasOwnProperty(i))c[i](e,a);else if(t instanceof r.XFAObject){const e=t[r.$toStyle]();e?Object.assign(a,e):(0,n.warn)(`(DEBUG) - XFA - style for ${i} not implemented yet`)}}return a};var r=a(77),n=a(2),i=a(78),s=a(85),o=a(86);function measureToString(e){return"string"==typeof e?"0px":Number.isInteger(e)?`${e}px`:`${e.toFixed(2)}px`}const c={anchorType(e,t){const a=e[r.$getSubformParent]();if(a&&(!a.layout||"position"===a.layout)){"transform"in t||(t.transform="");switch(e.anchorType){case"bottomCenter":t.transform+="translate(-50%, -100%)";break;case"bottomLeft":t.transform+="translate(0,-100%)";break;case"bottomRight":t.transform+="translate(-100%,-100%)";break;case"middleCenter":t.transform+="translate(-50%,-50%)";break;case"middleLeft":t.transform+="translate(0,-50%)";break;case"middleRight":t.transform+="translate(-100%,-50%)";break;case"topCenter":t.transform+="translate(-50%,0)";break;case"topRight":t.transform+="translate(-100%,0)"}}},dimensions(e,t){const a=e[r.$getSubformParent]();let n=e.w;const i=e.h;if(a.layout&&a.layout.includes("row")){const t=a[r.$extra],i=e.colSpan;let s;if(-1===i){s=t.columnWidths.slice(t.currentColumn).reduce(((e,t)=>e+t),0);t.currentColumn=0}else{s=t.columnWidths.slice(t.currentColumn,t.currentColumn+i).reduce(((e,t)=>e+t),0);t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(s)||(n=e.w=s)}t.width=""!==n?measureToString(n):"auto";t.height=""!==i?measureToString(i):"auto"},position(e,t){const a=e[r.$getSubformParent]();if(!a||!a.layout||"position"===a.layout){t.position="absolute";t.left=measureToString(e.x);t.top=measureToString(e.y)}},rotate(e,t){if(e.rotate){"transform"in t||(t.transform="");t.transform+=`rotate(-${e.rotate}deg)`;t.transformOrigin="top left"}},presence(e,t){switch(e.presence){case"invisible":t.visibility="hidden";break;case"hidden":case"inactive":t.display="none"}},hAlign(e,t){if("para"===e[r.$nodeName])switch(e.hAlign){case"justifyAll":t.textAlign="justify-all";break;case"radix":t.textAlign="left";break;default:t.textAlign=e.hAlign}else switch(e.hAlign){case"left":t.alignSelf="start";break;case"center":t.alignSelf="center";break;case"right":t.alignSelf="end"}},margin(e,t){e.margin&&(t.margin=e.margin[r.$toStyle]().margin)}};function layoutText(e,t,a,n,i,s){const c=new o.TextMeasure(t,a,n,i);"string"==typeof e?c.addString(e):e[r.$pushGlyphs](c);return c.compute(s)}function isPrintOnly(e){return e.relevant.length>0&&!e.relevant[0].excluded&&"print"===e.relevant[0].viewname}function getCurrentPara(e){const t=e[r.$getTemplateRoot]()[r.$extra].paraStack;return t.length?t.at(-1):null}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FontFinder=void 0;t.getMetrics=function getMetrics(e,t=!1){let a=null;if(e){const t=(0,n.stripQuotes)(e.typeface),i=e[r.$globalData].fontFinder.find(t);a=selectFont(e,i)}if(!a)return{lineHeight:12,lineGap:2,lineNoGap:10};const i=e.size||10,s=a.lineHeight?Math.max(t?0:1.2,a.lineHeight):1.2,o=void 0===a.lineGap?.2:a.lineGap;return{lineHeight:s*i,lineGap:o*i,lineNoGap:Math.max(1,s-o)*i}};t.selectFont=selectFont;var r=a(77),n=a(78),i=a(2);t.FontFinder=class FontFinder{constructor(e){this.fonts=new Map;this.cache=new Map;this.warned=new Set;this.defaultFont=null;this.add(e)}add(e,t=null){for(const t of e)this.addPdfFont(t);for(const e of this.fonts.values())e.regular||(e.regular=e.italic||e.bold||e.bolditalic);if(!t||0===t.size)return;const a=this.fonts.get("PdfJS-Fallback-PdfJS-XFA");for(const e of t)this.fonts.set(e,a)}addPdfFont(e){const t=e.cssFontInfo,a=t.fontFamily;let r=this.fonts.get(a);if(!r){r=Object.create(null);this.fonts.set(a,r);this.defaultFont||(this.defaultFont=r)}let n="";const i=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?n=i>=700?"bolditalic":"italic":i>=700&&(n="bold");if(!n){(e.name.includes("Bold")||e.psName&&e.psName.includes("Bold"))&&(n="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName&&(e.psName.includes("Italic")||e.psName.endsWith("It")))&&(n+="italic")}n||(n="regular");r[n]=e}getDefault(){return this.defaultFont}find(e,t=!0){let a=this.fonts.get(e)||this.cache.get(e);if(a)return a;const r=/,|-|_| |bolditalic|bold|italic|regular|it/gi;let n=e.replace(r,"");a=this.fonts.get(n);if(a){this.cache.set(e,a);return a}n=n.toLowerCase();const s=[];for(const[e,t]of this.fonts.entries())e.replace(r,"").toLowerCase().startsWith(n)&&s.push(t);if(0===s.length)for(const[,e]of this.fonts.entries())e.regular.name&&e.regular.name.replace(r,"").toLowerCase().startsWith(n)&&s.push(e);if(0===s.length){n=n.replace(/psmt|mt/gi,"");for(const[e,t]of this.fonts.entries())e.replace(r,"").toLowerCase().startsWith(n)&&s.push(t)}if(0===s.length)for(const e of this.fonts.values())e.regular.name&&e.regular.name.replace(r,"").toLowerCase().startsWith(n)&&s.push(e);if(s.length>=1){1!==s.length&&t&&(0,i.warn)(`XFA - Too many choices to guess the correct font: ${e}`);this.cache.set(e,s[0]);return s[0]}if(t&&!this.warned.has(e)){this.warned.add(e);(0,i.warn)(`XFA - Cannot find the font: ${e}`)}return null}};function selectFont(e,t){return"italic"===e.posture?"bold"===e.weight?t.bolditalic:t.italic:"bold"===e.weight?t.bold:t.regular}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.TextMeasure=void 0;var r=a(85);class FontInfo{constructor(e,t,a,n){this.lineHeight=a;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(n);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const i=n.find(e.typeface);if(i){this.pdfFont=(0,r.selectFont)(e,i);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(n))}else[this.pdfFont,this.xfaFont]=this.defaultFont(n)}defaultFont(e){const t=e.find("Helvetica",!1)||e.find("Myriad Pro",!1)||e.find("Arial",!1)||e.getDefault();if(t&&t.regular){const e=t.regular;return[e,{typeface:e.cssFontInfo.fontFamily,posture:"normal",weight:"normal",size:10,letterSpacing:0}]}return[null,{typeface:"Courier",posture:"normal",weight:"normal",size:10,letterSpacing:0}]}}class FontSelector{constructor(e,t,a,r){this.fontFinder=r;this.stack=[new FontInfo(e,t,a,r)]}pushData(e,t,a){const r=this.stack.at(-1);for(const t of["typeface","posture","weight","size","letterSpacing"])e[t]||(e[t]=r.xfaFont[t]);for(const e of["top","bottom","left","right"])isNaN(t[e])&&(t[e]=r.paraMargin[e]);const n=new FontInfo(e,t,a||r.lineHeight,this.fontFinder);n.pdfFont||(n.pdfFont=r.pdfFont);this.stack.push(n)}popFont(){this.stack.pop()}topFont(){return this.stack.at(-1)}}t.TextMeasure=class TextMeasure{constructor(e,t,a,r){this.glyphs=[];this.fontSelector=new FontSelector(e,t,a,r);this.extraHeight=0}pushData(e,t,a){this.fontSelector.pushData(e,t,a)}popFont(e){return this.fontSelector.popFont()}addPara(){const e=this.fontSelector.topFont();this.extraHeight+=e.paraMargin.top+e.paraMargin.bottom}addString(e){if(!e)return;const t=this.fontSelector.topFont(),a=t.xfaFont.size;if(t.pdfFont){const r=t.xfaFont.letterSpacing,n=t.pdfFont,i=n.lineHeight||1.2,s=t.lineHeight||Math.max(1.2,i)*a,o=i-(void 0===n.lineGap?.2:n.lineGap),c=Math.max(1,o)*a,l=a/1e3,h=n.defaultWidth||n.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=n.encodeString(t).join(""),a=n.charsToGlyphs(e);for(const e of a){const t=e.width||h;this.glyphs.push([t*l+r,s,c,e.unicode,!1])}this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}else{for(const t of e.split(/[\u2029\n]/)){for(const e of t.split(""))this.glyphs.push([a,1.2*a,a,e,!1]);this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}}compute(e){let t=-1,a=0,r=0,n=0,i=0,s=0,o=!1,c=!0;for(let l=0,h=this.glyphs.length;le){r=Math.max(r,i);i=0;n+=s;s=m;t=-1;a=0;o=!0;c=!1}else{s=Math.max(m,s);a=i;i+=h;t=l}else if(i+h>e){n+=s;s=m;if(-1!==t){l=t;r=Math.max(r,a);i=0;t=-1;a=0}else{r=Math.max(r,i);i=h}o=!0;c=!1}else{i+=h;s=Math.max(m,s)}}r=Math.max(r,i);n+=s+this.extraHeight;return{width:1.02*r,height:n,isBroken:o}}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DataHandler=void 0;var r=a(77);t.DataHandler=class DataHandler{constructor(e,t){this.data=t;this.dataset=e.datasets||null}serialize(e){const t=[[-1,this.data[r.$getChildren]()]];for(;t.length>0;){const a=t.at(-1),[n,i]=a;if(n+1===i.length){t.pop();continue}const s=i[++a[0]],o=e.get(s[r.$uid]);if(o)s[r.$setValue](o);else{const t=s[r.$getAttributes]();for(const a of t.values()){const t=e.get(a[r.$uid]);if(t){a[r.$setValue](t);break}}}const c=s[r.$getChildren]();c.length>0&&t.push([-1,c])}const a=[''];if(this.dataset)for(const e of this.dataset[r.$getChildren]())"data"!==e[r.$nodeName]&&e[r.$toString](a);this.data[r.$toString](a);a.push("");return a.join("")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XFAParser=void 0;var r=a(77),n=a(66),i=a(89),s=a(2);class XFAParser extends n.XMLParserBase{constructor(e=null,t=!1){super();this._builder=new i.Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=n.XMLParserErrorCode.NoError;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===n.XMLParserErrorCode.NoError){this._current[r.$finalize]();return this._current.element}}onText(e){e=e.replace(this._nbsps,(e=>e.slice(1)+" "));this._richText||this._current[r.$acceptWhitespace]()?this._current[r.$onText](e,this._richText):this._whiteRegex.test(e)||this._current[r.$onText](e.trim())}onCdata(e){this._current[r.$onText](e)}_mkAttributes(e,t){let a=null,n=null;const i=Object.create({});for(const{name:o,value:c}of e)if("xmlns"===o)a?(0,s.warn)(`XFA - multiple namespace definition in <${t}>`):a=c;else if(o.startsWith("xmlns:")){const e=o.substring("xmlns:".length);n||(n=[]);n.push({prefix:e,value:c})}else{const e=o.indexOf(":");if(-1===e)i[o]=c;else{let t=i[r.$nsAttributes];t||(t=i[r.$nsAttributes]=Object.create(null));const[a,n]=[o.slice(0,e),o.slice(e+1)];let s=t[a];s||(s=t[a]=Object.create(null));s[n]=c}}return[a,n,i]}_getNameAndPrefix(e,t){const a=e.indexOf(":");return-1===a?[e,null]:[e.substring(a+1),t?"":e.substring(0,a)]}onBeginElement(e,t,a){const[n,i,s]=this._mkAttributes(t,e),[o,c]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),l=this._builder.build({nsPrefix:c,name:o,attributes:s,namespace:n,prefixes:i});l[r.$globalData]=this._globalData;if(a){l[r.$finalize]();this._current[r.$onChild](l)&&l[r.$setId](this._ids);l[r.$clean](this._builder)}else{this._stack.push(this._current);this._current=l}}onEndElement(e){const t=this._current;if(t[r.$isCDATAXml]()&&"string"==typeof t[r.$content]){const e=new XFAParser;e._globalData=this._globalData;const a=e.parse(t[r.$content]);t[r.$content]=null;t[r.$onChild](a)}t[r.$finalize]();this._current=this._stack.pop();this._current[r.$onChild](t)&&t[r.$setId](this._ids);t[r.$clean](this._builder)}onError(e){this._errorCode=e}}t.XFAParser=XFAParser},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Builder=void 0;var r=a(79),n=a(77),i=a(90),s=a(82),o=a(99),c=a(2);class Root extends n.XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[n.$ids]=e}[n.$onChild](e){this.element=e;return!0}[n.$finalize](){super[n.$finalize]();if(this.element.template instanceof s.Template){this[n.$ids].set(n.$root,this.element);this.element.template[n.$resolvePrototypes](this[n.$ids]);this.element.template[n.$ids]=this[n.$ids]}}}class Empty extends n.XFAObject{constructor(){super(-1,"",Object.create(null))}[n.$onChild](e){return!1}}t.Builder=class Builder{constructor(e=null){this._namespaceStack=[];this._nsAgnosticLevel=0;this._namespacePrefixes=new Map;this._namespaces=new Map;this._nextNsId=Math.max(...Object.values(r.NamespaceIds).map((({id:e})=>e)));this._currentNamespace=e||new o.UnknownNamespace(++this._nextNsId)}buildRoot(e){return new Root(e)}build({nsPrefix:e,name:t,attributes:a,namespace:s,prefixes:o}){const c=null!==s;if(c){this._namespaceStack.push(this._currentNamespace);this._currentNamespace=this._searchNamespace(s)}o&&this._addNamespacePrefix(o);if(a.hasOwnProperty(n.$nsAttributes)){const e=i.NamespaceSetUp.datasets,t=a[n.$nsAttributes];let r=null;for(const[a,n]of Object.entries(t)){if(this._getNamespaceToUse(a)===e){r={xfa:n};break}}r?a[n.$nsAttributes]=r:delete a[n.$nsAttributes]}const l=this._getNamespaceToUse(e),h=l&&l[r.$buildXFAObject](t,a)||new Empty;h[n.$isNsAgnostic]()&&this._nsAgnosticLevel++;(c||o||h[n.$isNsAgnostic]())&&(h[n.$cleanup]={hasNamespace:c,prefixes:o,nsAgnostic:h[n.$isNsAgnostic]()});return h}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[a,{check:n}]of Object.entries(r.NamespaceIds))if(n(e)){t=i.NamespaceSetUp[a];if(t){this._namespaces.set(e,t);return t}break}t=new o.UnknownNamespace(++this._nextNsId);this._namespaces.set(e,t);return t}_addNamespacePrefix(e){for(const{prefix:t,value:a}of e){const e=this._searchNamespace(a);let r=this._namespacePrefixes.get(t);if(!r){r=[];this._namespacePrefixes.set(t,r)}r.push(e)}}_getNamespaceToUse(e){if(!e)return this._currentNamespace;const t=this._namespacePrefixes.get(e);if(t&&t.length>0)return t.at(-1);(0,c.warn)(`Unknown namespace prefix: ${e}.`);return null}clean(e){const{hasNamespace:t,prefixes:a,nsAgnostic:r}=e;t&&(this._currentNamespace=this._namespaceStack.pop());a&&a.forEach((({prefix:e})=>{this._namespacePrefixes.get(e).pop()}));r&&this._nsAgnosticLevel--}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NamespaceSetUp=void 0;var r=a(91),n=a(92),i=a(93),s=a(94),o=a(95),c=a(96),l=a(82),h=a(97),u=a(98);const d={config:r.ConfigNamespace,connection:n.ConnectionSetNamespace,datasets:i.DatasetsNamespace,localeSet:s.LocaleSetNamespace,signature:o.SignatureNamespace,stylesheet:c.StylesheetNamespace,template:l.TemplateNamespace,xdp:h.XdpNamespace,xhtml:u.XhtmlNamespace};t.NamespaceSetUp=d},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ConfigNamespace=void 0;var r=a(79),n=a(77),i=a(78),s=a(2);const o=r.NamespaceIds.config.id;class Acrobat extends n.XFAObject{constructor(e){super(o,"acrobat",!0);this.acrobat7=null;this.autoSave=null;this.common=null;this.validate=null;this.validateApprovalSignatures=null;this.submitUrl=new n.XFAObjectArray}}class Acrobat7 extends n.XFAObject{constructor(e){super(o,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends n.OptionObject{constructor(e){super(o,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends n.OptionObject{constructor(e){super(o,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends n.Option01{constructor(e){super(o,"addSilentPrint")}}class AddViewerPreferences extends n.Option01{constructor(e){super(o,"addViewerPreferences")}}class AdjustData extends n.Option10{constructor(e){super(o,"adjustData")}}class AdobeExtensionLevel extends n.IntegerObject{constructor(e){super(o,"adobeExtensionLevel",0,(e=>e>=1&&e<=8))}}class Agent extends n.XFAObject{constructor(e){super(o,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new n.XFAObjectArray}}class AlwaysEmbed extends n.ContentObject{constructor(e){super(o,"alwaysEmbed")}}class Amd extends n.StringObject{constructor(e){super(o,"amd")}}class Area extends n.XFAObject{constructor(e){super(o,"area");this.level=(0,i.getInteger)({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=(0,i.getStringOption)(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends n.OptionObject{constructor(e){super(o,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends n.OptionObject{constructor(e){super(o,"autoSave",["disabled","enabled"])}}class Base extends n.StringObject{constructor(e){super(o,"base")}}class BatchOutput extends n.XFAObject{constructor(e){super(o,"batchOutput");this.format=(0,i.getStringOption)(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends n.ContentObject{constructor(e){super(o,"behaviorOverride")}[n.$finalize](){this[n.$content]=new Map(this[n.$content].trim().split(/\s+/).filter((e=>e.includes(":"))).map((e=>e.split(":",2))))}}class Cache extends n.XFAObject{constructor(e){super(o,"cache",!0);this.templateCache=null}}class Change extends n.Option01{constructor(e){super(o,"change")}}class Common extends n.XFAObject{constructor(e){super(o,"common",!0);this.data=null;this.locale=null;this.localeSet=null;this.messaging=null;this.suppressBanner=null;this.template=null;this.validationMessaging=null;this.versionControl=null;this.log=new n.XFAObjectArray}}class Compress extends n.XFAObject{constructor(e){super(o,"compress");this.scope=(0,i.getStringOption)(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends n.Option01{constructor(e){super(o,"compressLogicalStructure")}}class CompressObjectStream extends n.Option10{constructor(e){super(o,"compressObjectStream")}}class Compression extends n.XFAObject{constructor(e){super(o,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends n.XFAObject{constructor(e){super(o,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new n.XFAObjectArray}}class Conformance extends n.OptionObject{constructor(e){super(o,"conformance",["A","B"])}}class ContentCopy extends n.Option01{constructor(e){super(o,"contentCopy")}}class Copies extends n.IntegerObject{constructor(e){super(o,"copies",1,(e=>e>=1))}}class Creator extends n.StringObject{constructor(e){super(o,"creator")}}class CurrentPage extends n.IntegerObject{constructor(e){super(o,"currentPage",0,(e=>e>=0))}}class Data extends n.XFAObject{constructor(e){super(o,"data",!0);this.adjustData=null;this.attributes=null;this.incrementalLoad=null;this.outputXSL=null;this.range=null;this.record=null;this.startNode=null;this.uri=null;this.window=null;this.xsl=null;this.excludeNS=new n.XFAObjectArray;this.transform=new n.XFAObjectArray}}class Debug extends n.XFAObject{constructor(e){super(o,"debug",!0);this.uri=null}}class DefaultTypeface extends n.ContentObject{constructor(e){super(o,"defaultTypeface");this.writingScript=(0,i.getStringOption)(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends n.OptionObject{constructor(e){super(o,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends n.Option01{constructor(e){super(o,"documentAssembly")}}class Driver extends n.XFAObject{constructor(e){super(o,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends n.OptionObject{constructor(e){super(o,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends n.OptionObject{constructor(e){super(o,"dynamicRender",["forbidden","required"])}}class Embed extends n.Option01{constructor(e){super(o,"embed")}}class Encrypt extends n.Option01{constructor(e){super(o,"encrypt")}}class Encryption extends n.XFAObject{constructor(e){super(o,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends n.OptionObject{constructor(e){super(o,"encryptionLevel",["40bit","128bit"])}}class Enforce extends n.StringObject{constructor(e){super(o,"enforce")}}class Equate extends n.XFAObject{constructor(e){super(o,"equate");this.force=(0,i.getInteger)({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends n.XFAObject{constructor(e){super(o,"equateRange");this.from=e.from||"";this.to=e.to||"";this._unicodeRange=e.unicodeRange||""}get unicodeRange(){const e=[],t=/U\+([0-9a-fA-F]+)/,a=this._unicodeRange;for(let r of a.split(",").map((e=>e.trim())).filter((e=>!!e))){r=r.split("-",2).map((e=>{const a=e.match(t);return a?parseInt(a[1],16):0}));1===r.length&&r.push(r[0]);e.push(r)}return(0,s.shadow)(this,"unicodeRange",e)}}class Exclude extends n.ContentObject{constructor(e){super(o,"exclude")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e)))}}class ExcludeNS extends n.StringObject{constructor(e){super(o,"excludeNS")}}class FlipLabel extends n.OptionObject{constructor(e){super(o,"flipLabel",["usePrinterSetting","on","off"])}}class FontInfo extends n.XFAObject{constructor(e){super(o,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new n.XFAObjectArray;this.defaultTypeface=new n.XFAObjectArray;this.neverEmbed=new n.XFAObjectArray}}class FormFieldFilling extends n.Option01{constructor(e){super(o,"formFieldFilling")}}class GroupParent extends n.StringObject{constructor(e){super(o,"groupParent")}}class IfEmpty extends n.OptionObject{constructor(e){super(o,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends n.StringObject{constructor(e){super(o,"includeXDPContent")}}class IncrementalLoad extends n.OptionObject{constructor(e){super(o,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends n.Option01{constructor(e){super(o,"incrementalMerge")}}class Interactive extends n.Option01{constructor(e){super(o,"interactive")}}class Jog extends n.OptionObject{constructor(e){super(o,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends n.XFAObject{constructor(e){super(o,"labelPrinter",!0);this.name=(0,i.getStringOption)(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends n.OptionObject{constructor(e){super(o,"layout",["paginate","panel"])}}class Level extends n.IntegerObject{constructor(e){super(o,"level",0,(e=>e>0))}}class Linearized extends n.Option01{constructor(e){super(o,"linearized")}}class Locale extends n.StringObject{constructor(e){super(o,"locale")}}class LocaleSet extends n.StringObject{constructor(e){super(o,"localeSet")}}class Log extends n.XFAObject{constructor(e){super(o,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends n.XFAObject{constructor(e){super(o,"map",!0);this.equate=new n.XFAObjectArray;this.equateRange=new n.XFAObjectArray}}class MediumInfo extends n.XFAObject{constructor(e){super(o,"mediumInfo",!0);this.map=null}}class Message extends n.XFAObject{constructor(e){super(o,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends n.XFAObject{constructor(e){super(o,"messaging",!0);this.message=new n.XFAObjectArray}}class Mode extends n.OptionObject{constructor(e){super(o,"mode",["append","overwrite"])}}class ModifyAnnots extends n.Option01{constructor(e){super(o,"modifyAnnots")}}class MsgId extends n.IntegerObject{constructor(e){super(o,"msgId",1,(e=>e>=1))}}class NameAttr extends n.StringObject{constructor(e){super(o,"nameAttr")}}class NeverEmbed extends n.ContentObject{constructor(e){super(o,"neverEmbed")}}class NumberOfCopies extends n.IntegerObject{constructor(e){super(o,"numberOfCopies",null,(e=>e>=2&&e<=5))}}class OpenAction extends n.XFAObject{constructor(e){super(o,"openAction",!0);this.destination=null}}class Output extends n.XFAObject{constructor(e){super(o,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends n.StringObject{constructor(e){super(o,"outputBin")}}class OutputXSL extends n.XFAObject{constructor(e){super(o,"outputXSL",!0);this.uri=null}}class Overprint extends n.OptionObject{constructor(e){super(o,"overprint",["none","both","draw","field"])}}class Packets extends n.StringObject{constructor(e){super(o,"packets")}[n.$finalize](){"*"!==this[n.$content]&&(this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>["config","datasets","template","xfdf","xslt"].includes(e))))}}class PageOffset extends n.XFAObject{constructor(e){super(o,"pageOffset");this.x=(0,i.getInteger)({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=(0,i.getInteger)({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends n.StringObject{constructor(e){super(o,"pageRange")}[n.$finalize](){const e=this[n.$content].trim().split(/\s+/).map((e=>parseInt(e,10))),t=[];for(let a=0,r=e.length;a!1))}}class Pcl extends n.XFAObject{constructor(e){super(o,"pcl",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.pageOffset=null;this.staple=null;this.xdc=null}}class Pdf extends n.XFAObject{constructor(e){super(o,"pdf",!0);this.name=e.name||"";this.adobeExtensionLevel=null;this.batchOutput=null;this.compression=null;this.creator=null;this.encryption=null;this.fontInfo=null;this.interactive=null;this.linearized=null;this.openAction=null;this.pdfa=null;this.producer=null;this.renderPolicy=null;this.scriptModel=null;this.silentPrint=null;this.submitFormat=null;this.tagged=null;this.version=null;this.viewerPreferences=null;this.xdc=null}}class Pdfa extends n.XFAObject{constructor(e){super(o,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends n.XFAObject{constructor(e){super(o,"permissions",!0);this.accessibleContent=null;this.change=null;this.contentCopy=null;this.documentAssembly=null;this.formFieldFilling=null;this.modifyAnnots=null;this.plaintextMetadata=null;this.print=null;this.printHighQuality=null}}class PickTrayByPDFSize extends n.Option01{constructor(e){super(o,"pickTrayByPDFSize")}}class Picture extends n.StringObject{constructor(e){super(o,"picture")}}class PlaintextMetadata extends n.Option01{constructor(e){super(o,"plaintextMetadata")}}class Presence extends n.OptionObject{constructor(e){super(o,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends n.XFAObject{constructor(e){super(o,"present",!0);this.behaviorOverride=null;this.cache=null;this.common=null;this.copies=null;this.destination=null;this.incrementalMerge=null;this.layout=null;this.output=null;this.overprint=null;this.pagination=null;this.paginationOverride=null;this.script=null;this.validate=null;this.xdp=null;this.driver=new n.XFAObjectArray;this.labelPrinter=new n.XFAObjectArray;this.pcl=new n.XFAObjectArray;this.pdf=new n.XFAObjectArray;this.ps=new n.XFAObjectArray;this.submitUrl=new n.XFAObjectArray;this.webClient=new n.XFAObjectArray;this.zpl=new n.XFAObjectArray}}class Print extends n.Option01{constructor(e){super(o,"print")}}class PrintHighQuality extends n.Option01{constructor(e){super(o,"printHighQuality")}}class PrintScaling extends n.OptionObject{constructor(e){super(o,"printScaling",["appdefault","noScaling"])}}class PrinterName extends n.StringObject{constructor(e){super(o,"printerName")}}class Producer extends n.StringObject{constructor(e){super(o,"producer")}}class Ps extends n.XFAObject{constructor(e){super(o,"ps",!0);this.name=e.name||"";this.batchOutput=null;this.fontInfo=null;this.jog=null;this.mediumInfo=null;this.outputBin=null;this.staple=null;this.xdc=null}}class Range extends n.ContentObject{constructor(e){super(o,"range")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s*,\s*/,2).map((e=>e.split("-").map((e=>parseInt(e.trim(),10))))).filter((e=>e.every((e=>!isNaN(e))))).map((e=>{1===e.length&&e.push(e[0]);return e}))}}class Record extends n.ContentObject{constructor(e){super(o,"record")}[n.$finalize](){this[n.$content]=this[n.$content].trim();const e=parseInt(this[n.$content],10);!isNaN(e)&&e>=0&&(this[n.$content]=e)}}class Relevant extends n.ContentObject{constructor(e){super(o,"relevant")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/)}}class Rename extends n.ContentObject{constructor(e){super(o,"rename")}[n.$finalize](){this[n.$content]=this[n.$content].trim();(this[n.$content].toLowerCase().startsWith("xml")||this[n.$content].match(new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u")))&&(0,s.warn)("XFA - Rename: invalid XFA name")}}class RenderPolicy extends n.OptionObject{constructor(e){super(o,"renderPolicy",["server","client"])}}class RunScripts extends n.OptionObject{constructor(e){super(o,"runScripts",["both","client","none","server"])}}class Script extends n.XFAObject{constructor(e){super(o,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends n.OptionObject{constructor(e){super(o,"scriptModel",["XFA","none"])}}class Severity extends n.OptionObject{constructor(e){super(o,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends n.XFAObject{constructor(e){super(o,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends n.XFAObject{constructor(e){super(o,"staple");this.mode=(0,i.getStringOption)(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends n.StringObject{constructor(e){super(o,"startNode")}}class StartPage extends n.IntegerObject{constructor(e){super(o,"startPage",0,(e=>!0))}}class SubmitFormat extends n.OptionObject{constructor(e){super(o,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends n.StringObject{constructor(e){super(o,"submitUrl")}}class SubsetBelow extends n.IntegerObject{constructor(e){super(o,"subsetBelow",100,(e=>e>=0&&e<=100))}}class SuppressBanner extends n.Option01{constructor(e){super(o,"suppressBanner")}}class Tagged extends n.Option01{constructor(e){super(o,"tagged")}}class Template extends n.XFAObject{constructor(e){super(o,"template",!0);this.base=null;this.relevant=null;this.startPage=null;this.uri=null;this.xsl=null}}class Threshold extends n.OptionObject{constructor(e){super(o,"threshold",["trace","error","information","warning"])}}class To extends n.OptionObject{constructor(e){super(o,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends n.XFAObject{constructor(e){super(o,"templateCache");this.maxEntries=(0,i.getInteger)({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends n.XFAObject{constructor(e){super(o,"trace",!0);this.area=new n.XFAObjectArray}}class Transform extends n.XFAObject{constructor(e){super(o,"transform",!0);this.groupParent=null;this.ifEmpty=null;this.nameAttr=null;this.picture=null;this.presence=null;this.rename=null;this.whitespace=null}}class Type extends n.OptionObject{constructor(e){super(o,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends n.StringObject{constructor(e){super(o,"uri")}}class Validate extends n.OptionObject{constructor(e){super(o,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends n.ContentObject{constructor(e){super(o,"validateApprovalSignatures")}[n.$finalize](){this[n.$content]=this[n.$content].trim().split(/\s+/).filter((e=>["docReady","postSign"].includes(e)))}}class ValidationMessaging extends n.OptionObject{constructor(e){super(o,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends n.OptionObject{constructor(e){super(o,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends n.XFAObject{constructor(e){super(o,"VersionControl");this.outputBelow=(0,i.getStringOption)(e.outputBelow,["warn","error","update"]);this.sourceAbove=(0,i.getStringOption)(e.sourceAbove,["warn","error"]);this.sourceBelow=(0,i.getStringOption)(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends n.XFAObject{constructor(e){super(o,"viewerPreferences",!0);this.ADBE_JSConsole=null;this.ADBE_JSDebugger=null;this.addViewerPreferences=null;this.duplexOption=null;this.enforce=null;this.numberOfCopies=null;this.pageRange=null;this.pickTrayByPDFSize=null;this.printScaling=null}}class WebClient extends n.XFAObject{constructor(e){super(o,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends n.OptionObject{constructor(e){super(o,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends n.ContentObject{constructor(e){super(o,"window")}[n.$finalize](){const e=this[n.$content].trim().split(/\s*,\s*/,2).map((e=>parseInt(e,10)));if(e.some((e=>isNaN(e))))this[n.$content]=[0,0];else{1===e.length&&e.push(e[0]);this[n.$content]=e}}}class Xdc extends n.XFAObject{constructor(e){super(o,"xdc",!0);this.uri=new n.XFAObjectArray;this.xsl=new n.XFAObjectArray}}class Xdp extends n.XFAObject{constructor(e){super(o,"xdp",!0);this.packets=null}}class Xsl extends n.XFAObject{constructor(e){super(o,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends n.XFAObject{constructor(e){super(o,"zpl",!0);this.name=e.name?e.name.trim():"";this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class ConfigNamespace{static[r.$buildXFAObject](e,t){if(ConfigNamespace.hasOwnProperty(e))return ConfigNamespace[e](t)}static acrobat(e){return new Acrobat(e)}static acrobat7(e){return new Acrobat7(e)}static ADBE_JSConsole(e){return new ADBE_JSConsole(e)}static ADBE_JSDebugger(e){return new ADBE_JSDebugger(e)}static addSilentPrint(e){return new AddSilentPrint(e)}static addViewerPreferences(e){return new AddViewerPreferences(e)}static adjustData(e){return new AdjustData(e)}static adobeExtensionLevel(e){return new AdobeExtensionLevel(e)}static agent(e){return new Agent(e)}static alwaysEmbed(e){return new AlwaysEmbed(e)}static amd(e){return new Amd(e)}static area(e){return new Area(e)}static attributes(e){return new Attributes(e)}static autoSave(e){return new AutoSave(e)}static base(e){return new Base(e)}static batchOutput(e){return new BatchOutput(e)}static behaviorOverride(e){return new BehaviorOverride(e)}static cache(e){return new Cache(e)}static change(e){return new Change(e)}static common(e){return new Common(e)}static compress(e){return new Compress(e)}static compressLogicalStructure(e){return new CompressLogicalStructure(e)}static compressObjectStream(e){return new CompressObjectStream(e)}static compression(e){return new Compression(e)}static config(e){return new Config(e)}static conformance(e){return new Conformance(e)}static contentCopy(e){return new ContentCopy(e)}static copies(e){return new Copies(e)}static creator(e){return new Creator(e)}static currentPage(e){return new CurrentPage(e)}static data(e){return new Data(e)}static debug(e){return new Debug(e)}static defaultTypeface(e){return new DefaultTypeface(e)}static destination(e){return new Destination(e)}static documentAssembly(e){return new DocumentAssembly(e)}static driver(e){return new Driver(e)}static duplexOption(e){return new DuplexOption(e)}static dynamicRender(e){return new DynamicRender(e)}static embed(e){return new Embed(e)}static encrypt(e){return new Encrypt(e)}static encryption(e){return new Encryption(e)}static encryptionLevel(e){return new EncryptionLevel(e)}static enforce(e){return new Enforce(e)}static equate(e){return new Equate(e)}static equateRange(e){return new EquateRange(e)}static exclude(e){return new Exclude(e)}static excludeNS(e){return new ExcludeNS(e)}static flipLabel(e){return new FlipLabel(e)}static fontInfo(e){return new FontInfo(e)}static formFieldFilling(e){return new FormFieldFilling(e)}static groupParent(e){return new GroupParent(e)}static ifEmpty(e){return new IfEmpty(e)}static includeXDPContent(e){return new IncludeXDPContent(e)}static incrementalLoad(e){return new IncrementalLoad(e)}static incrementalMerge(e){return new IncrementalMerge(e)}static interactive(e){return new Interactive(e)}static jog(e){return new Jog(e)}static labelPrinter(e){return new LabelPrinter(e)}static layout(e){return new Layout(e)}static level(e){return new Level(e)}static linearized(e){return new Linearized(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static log(e){return new Log(e)}static map(e){return new MapElement(e)}static mediumInfo(e){return new MediumInfo(e)}static message(e){return new Message(e)}static messaging(e){return new Messaging(e)}static mode(e){return new Mode(e)}static modifyAnnots(e){return new ModifyAnnots(e)}static msgId(e){return new MsgId(e)}static nameAttr(e){return new NameAttr(e)}static neverEmbed(e){return new NeverEmbed(e)}static numberOfCopies(e){return new NumberOfCopies(e)}static openAction(e){return new OpenAction(e)}static output(e){return new Output(e)}static outputBin(e){return new OutputBin(e)}static outputXSL(e){return new OutputXSL(e)}static overprint(e){return new Overprint(e)}static packets(e){return new Packets(e)}static pageOffset(e){return new PageOffset(e)}static pageRange(e){return new PageRange(e)}static pagination(e){return new Pagination(e)}static paginationOverride(e){return new PaginationOverride(e)}static part(e){return new Part(e)}static pcl(e){return new Pcl(e)}static pdf(e){return new Pdf(e)}static pdfa(e){return new Pdfa(e)}static permissions(e){return new Permissions(e)}static pickTrayByPDFSize(e){return new PickTrayByPDFSize(e)}static picture(e){return new Picture(e)}static plaintextMetadata(e){return new PlaintextMetadata(e)}static presence(e){return new Presence(e)}static present(e){return new Present(e)}static print(e){return new Print(e)}static printHighQuality(e){return new PrintHighQuality(e)}static printScaling(e){return new PrintScaling(e)}static printerName(e){return new PrinterName(e)}static producer(e){return new Producer(e)}static ps(e){return new Ps(e)}static range(e){return new Range(e)}static record(e){return new Record(e)}static relevant(e){return new Relevant(e)}static rename(e){return new Rename(e)}static renderPolicy(e){return new RenderPolicy(e)}static runScripts(e){return new RunScripts(e)}static script(e){return new Script(e)}static scriptModel(e){return new ScriptModel(e)}static severity(e){return new Severity(e)}static silentPrint(e){return new SilentPrint(e)}static staple(e){return new Staple(e)}static startNode(e){return new StartNode(e)}static startPage(e){return new StartPage(e)}static submitFormat(e){return new SubmitFormat(e)}static submitUrl(e){return new SubmitUrl(e)}static subsetBelow(e){return new SubsetBelow(e)}static suppressBanner(e){return new SuppressBanner(e)}static tagged(e){return new Tagged(e)}static template(e){return new Template(e)}static templateCache(e){return new TemplateCache(e)}static threshold(e){return new Threshold(e)}static to(e){return new To(e)}static trace(e){return new Trace(e)}static transform(e){return new Transform(e)}static type(e){return new Type(e)}static uri(e){return new Uri(e)}static validate(e){return new Validate(e)}static validateApprovalSignatures(e){return new ValidateApprovalSignatures(e)}static validationMessaging(e){return new ValidationMessaging(e)}static version(e){return new Version(e)}static versionControl(e){return new VersionControl(e)}static viewerPreferences(e){return new ViewerPreferences(e)}static webClient(e){return new WebClient(e)}static whitespace(e){return new Whitespace(e)}static window(e){return new Window(e)}static xdc(e){return new Xdc(e)}static xdp(e){return new Xdp(e)}static xsl(e){return new Xsl(e)}static zpl(e){return new Zpl(e)}}t.ConfigNamespace=ConfigNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ConnectionSetNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.connectionSet.id;class ConnectionSet extends n.XFAObject{constructor(e){super(i,"connectionSet",!0);this.wsdlConnection=new n.XFAObjectArray;this.xmlConnection=new n.XFAObjectArray;this.xsdConnection=new n.XFAObjectArray}}class EffectiveInputPolicy extends n.XFAObject{constructor(e){super(i,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends n.XFAObject{constructor(e){super(i,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends n.StringObject{constructor(e){super(i,"operation");this.id=e.id||"";this.input=e.input||"";this.name=e.name||"";this.output=e.output||"";this.use=e.use||"";this.usehref=e.usehref||""}}class RootElement extends n.StringObject{constructor(e){super(i,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends n.StringObject{constructor(e){super(i,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends n.StringObject{constructor(e){super(i,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Uri extends n.StringObject{constructor(e){super(i,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends n.StringObject{constructor(e){super(i,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends n.XFAObject{constructor(e){super(i,"wsdlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.effectiveInputPolicy=null;this.effectiveOutputPolicy=null;this.operation=null;this.soapAction=null;this.soapAddress=null;this.wsdlAddress=null}}class XmlConnection extends n.XFAObject{constructor(e){super(i,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends n.XFAObject{constructor(e){super(i,"xsdConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.rootElement=null;this.uri=null}}class ConnectionSetNamespace{static[r.$buildXFAObject](e,t){if(ConnectionSetNamespace.hasOwnProperty(e))return ConnectionSetNamespace[e](t)}static connectionSet(e){return new ConnectionSet(e)}static effectiveInputPolicy(e){return new EffectiveInputPolicy(e)}static effectiveOutputPolicy(e){return new EffectiveOutputPolicy(e)}static operation(e){return new Operation(e)}static rootElement(e){return new RootElement(e)}static soapAction(e){return new SoapAction(e)}static soapAddress(e){return new SoapAddress(e)}static uri(e){return new Uri(e)}static wsdlAddress(e){return new WsdlAddress(e)}static wsdlConnection(e){return new WsdlConnection(e)}static xmlConnection(e){return new XmlConnection(e)}static xsdConnection(e){return new XsdConnection(e)}}t.ConnectionSetNamespace=ConnectionSetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DatasetsNamespace=void 0;var r=a(77),n=a(79);const i=n.NamespaceIds.datasets.id;class Data extends r.XmlObject{constructor(e){super(i,"data",e)}[r.$isNsAgnostic](){return!0}}class Datasets extends r.XFAObject{constructor(e){super(i,"datasets",!0);this.data=null;this.Signature=null}[r.$onChild](e){const t=e[r.$nodeName];("data"===t&&e[r.$namespaceId]===i||"Signature"===t&&e[r.$namespaceId]===n.NamespaceIds.signature.id)&&(this[t]=e);this[r.$appendChild](e)}}class DatasetsNamespace{static[n.$buildXFAObject](e,t){if(DatasetsNamespace.hasOwnProperty(e))return DatasetsNamespace[e](t)}static datasets(e){return new Datasets(e)}static data(e){return new Data(e)}}t.DatasetsNamespace=DatasetsNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LocaleSetNamespace=void 0;var r=a(79),n=a(77),i=a(78);const s=r.NamespaceIds.localeSet.id;class CalendarSymbols extends n.XFAObject{constructor(e){super(s,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new n.XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new n.XFAObjectArray(2)}}class CurrencySymbol extends n.StringObject{constructor(e){super(s,"currencySymbol");this.name=(0,i.getStringOption)(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends n.XFAObject{constructor(e){super(s,"currencySymbols",!0);this.currencySymbol=new n.XFAObjectArray(3)}}class DatePattern extends n.StringObject{constructor(e){super(s,"datePattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class DatePatterns extends n.XFAObject{constructor(e){super(s,"datePatterns",!0);this.datePattern=new n.XFAObjectArray(4)}}class DateTimeSymbols extends n.ContentObject{constructor(e){super(s,"dateTimeSymbols")}}class Day extends n.StringObject{constructor(e){super(s,"day")}}class DayNames extends n.XFAObject{constructor(e){super(s,"dayNames",!0);this.abbr=(0,i.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new n.XFAObjectArray(7)}}class Era extends n.StringObject{constructor(e){super(s,"era")}}class EraNames extends n.XFAObject{constructor(e){super(s,"eraNames",!0);this.era=new n.XFAObjectArray(2)}}class Locale extends n.XFAObject{constructor(e){super(s,"locale",!0);this.desc=e.desc||"";this.name="isoname";this.calendarSymbols=null;this.currencySymbols=null;this.datePatterns=null;this.dateTimeSymbols=null;this.numberPatterns=null;this.numberSymbols=null;this.timePatterns=null;this.typeFaces=null}}class LocaleSet extends n.XFAObject{constructor(e){super(s,"localeSet",!0);this.locale=new n.XFAObjectArray}}class Meridiem extends n.StringObject{constructor(e){super(s,"meridiem")}}class MeridiemNames extends n.XFAObject{constructor(e){super(s,"meridiemNames",!0);this.meridiem=new n.XFAObjectArray(2)}}class Month extends n.StringObject{constructor(e){super(s,"month")}}class MonthNames extends n.XFAObject{constructor(e){super(s,"monthNames",!0);this.abbr=(0,i.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new n.XFAObjectArray(12)}}class NumberPattern extends n.StringObject{constructor(e){super(s,"numberPattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class NumberPatterns extends n.XFAObject{constructor(e){super(s,"numberPatterns",!0);this.numberPattern=new n.XFAObjectArray(4)}}class NumberSymbol extends n.StringObject{constructor(e){super(s,"numberSymbol");this.name=(0,i.getStringOption)(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends n.XFAObject{constructor(e){super(s,"numberSymbols",!0);this.numberSymbol=new n.XFAObjectArray(5)}}class TimePattern extends n.StringObject{constructor(e){super(s,"timePattern");this.name=(0,i.getStringOption)(e.name,["full","long","med","short"])}}class TimePatterns extends n.XFAObject{constructor(e){super(s,"timePatterns",!0);this.timePattern=new n.XFAObjectArray(4)}}class TypeFace extends n.XFAObject{constructor(e){super(s,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends n.XFAObject{constructor(e){super(s,"typeFaces",!0);this.typeFace=new n.XFAObjectArray}}class LocaleSetNamespace{static[r.$buildXFAObject](e,t){if(LocaleSetNamespace.hasOwnProperty(e))return LocaleSetNamespace[e](t)}static calendarSymbols(e){return new CalendarSymbols(e)}static currencySymbol(e){return new CurrencySymbol(e)}static currencySymbols(e){return new CurrencySymbols(e)}static datePattern(e){return new DatePattern(e)}static datePatterns(e){return new DatePatterns(e)}static dateTimeSymbols(e){return new DateTimeSymbols(e)}static day(e){return new Day(e)}static dayNames(e){return new DayNames(e)}static era(e){return new Era(e)}static eraNames(e){return new EraNames(e)}static locale(e){return new Locale(e)}static localeSet(e){return new LocaleSet(e)}static meridiem(e){return new Meridiem(e)}static meridiemNames(e){return new MeridiemNames(e)}static month(e){return new Month(e)}static monthNames(e){return new MonthNames(e)}static numberPattern(e){return new NumberPattern(e)}static numberPatterns(e){return new NumberPatterns(e)}static numberSymbol(e){return new NumberSymbol(e)}static numberSymbols(e){return new NumberSymbols(e)}static timePattern(e){return new TimePattern(e)}static timePatterns(e){return new TimePatterns(e)}static typeFace(e){return new TypeFace(e)}static typeFaces(e){return new TypeFaces(e)}}t.LocaleSetNamespace=LocaleSetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.SignatureNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.signature.id;class Signature extends n.XFAObject{constructor(e){super(i,"signature",!0)}}class SignatureNamespace{static[r.$buildXFAObject](e,t){if(SignatureNamespace.hasOwnProperty(e))return SignatureNamespace[e](t)}static signature(e){return new Signature(e)}}t.SignatureNamespace=SignatureNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.StylesheetNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.stylesheet.id;class Stylesheet extends n.XFAObject{constructor(e){super(i,"stylesheet",!0)}}class StylesheetNamespace{static[r.$buildXFAObject](e,t){if(StylesheetNamespace.hasOwnProperty(e))return StylesheetNamespace[e](t)}static stylesheet(e){return new Stylesheet(e)}}t.StylesheetNamespace=StylesheetNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XdpNamespace=void 0;var r=a(79),n=a(77);const i=r.NamespaceIds.xdp.id;class Xdp extends n.XFAObject{constructor(e){super(i,"xdp",!0);this.uuid=e.uuid||"";this.timeStamp=e.timeStamp||"";this.config=null;this.connectionSet=null;this.datasets=null;this.localeSet=null;this.stylesheet=new n.XFAObjectArray;this.template=null}[n.$onChildCheck](e){const t=r.NamespaceIds[e[n.$nodeName]];return t&&e[n.$namespaceId]===t.id}}class XdpNamespace{static[r.$buildXFAObject](e,t){if(XdpNamespace.hasOwnProperty(e))return XdpNamespace[e](t)}static xdp(e){return new Xdp(e)}}t.XdpNamespace=XdpNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XhtmlNamespace=void 0;var r=a(77),n=a(79),i=a(84),s=a(78);const o=n.NamespaceIds.xhtml.id,c=Symbol(),l=new Set(["color","font","font-family","font-size","font-stretch","font-style","font-weight","margin","margin-bottom","margin-left","margin-right","margin-top","letter-spacing","line-height","orphans","page-break-after","page-break-before","page-break-inside","tab-interval","tab-stop","text-align","text-decoration","text-indent","vertical-align","widows","kerning-mode","xfa-font-horizontal-scale","xfa-font-vertical-scale","xfa-spacerun","xfa-tab-stops"]),h=new Map([["page-break-after","breakAfter"],["page-break-before","breakBefore"],["page-break-inside","breakInside"],["kerning-mode",e=>"none"===e?"none":"normal"],["xfa-font-horizontal-scale",e=>`scaleX(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-font-vertical-scale",e=>`scaleY(${Math.max(0,Math.min(parseInt(e)/100)).toFixed(2)})`],["xfa-spacerun",""],["xfa-tab-stops",""],["font-size",(e,t)=>{e=t.fontSize=(0,s.getMeasurement)(e);return(0,i.measureToString)(.99*e)}],["letter-spacing",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["line-height",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-bottom",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-left",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-right",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["margin-top",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["text-indent",e=>(0,i.measureToString)((0,s.getMeasurement)(e))],["font-family",e=>e],["vertical-align",e=>(0,i.measureToString)((0,s.getMeasurement)(e))]]),u=/\s+/g,d=/[\r\n]+/g,f=/\r\n?/g;function mapStyle(e,t,a){const n=Object.create(null);if(!e)return n;const o=Object.create(null);for(const[t,a]of e.split(";").map((e=>e.split(":",2)))){const e=h.get(t);if(""===e)continue;let r=a;e&&(r="string"==typeof e?e:e(a,o));t.endsWith("scale")?n.transform?n.transform=`${n[t]} ${r}`:n.transform=r:n[t.replaceAll(/-([a-zA-Z])/g,((e,t)=>t.toUpperCase()))]=r}n.fontFamily&&(0,i.setFontFamily)({typeface:n.fontFamily,weight:n.fontWeight||"normal",posture:n.fontStyle||"normal",size:o.fontSize||0},t,t[r.$globalData].fontFinder,n);if(a&&n.verticalAlign&&"0px"!==n.verticalAlign&&n.fontSize){const e=.583,t=.333,a=(0,s.getMeasurement)(n.fontSize);n.fontSize=(0,i.measureToString)(a*e);n.verticalAlign=(0,i.measureToString)(Math.sign((0,s.getMeasurement)(n.verticalAlign))*a*t)}a&&n.fontSize&&(n.fontSize=`calc(${n.fontSize} * var(--scale-factor))`);(0,i.fixTextIndent)(n);return n}const g=new Set(["body","html"]);class XhtmlObject extends r.XmlObject{constructor(e,t){super(o,t);this[c]=!1;this.style=e.style||""}[r.$clean](e){super[r.$clean](e);this.style=function checkStyle(e){return e.style?e.style.trim().split(/\s*;\s*/).filter((e=>!!e)).map((e=>e.split(/\s*:\s*/,2))).filter((([t,a])=>{"font-family"===t&&e[r.$globalData].usedTypefaces.add(a);return l.has(t)})).map((e=>e.join(":"))).join(";"):""}(this)}[r.$acceptWhitespace](){return!g.has(this[r.$nodeName])}[r.$onText](e,t=!1){if(t)this[c]=!0;else{e=e.replace(d,"");this.style.includes("xfa-spacerun:yes")||(e=e.replace(u," "))}e&&(this[r.$content]+=e)}[r.$pushGlyphs](e,t=!0){const a=Object.create(null),n={top:NaN,bottom:NaN,left:NaN,right:NaN};let i=null;for(const[e,t]of this.style.split(";").map((e=>e.split(":",2))))switch(e){case"font-family":a.typeface=(0,s.stripQuotes)(t);break;case"font-size":a.size=(0,s.getMeasurement)(t);break;case"font-weight":a.weight=t;break;case"font-style":a.posture=t;break;case"letter-spacing":a.letterSpacing=(0,s.getMeasurement)(t);break;case"margin":const e=t.split(/ \t/).map((e=>(0,s.getMeasurement)(e)));switch(e.length){case 1:n.top=n.bottom=n.left=n.right=e[0];break;case 2:n.top=n.bottom=e[0];n.left=n.right=e[1];break;case 3:n.top=e[0];n.bottom=e[2];n.left=n.right=e[1];break;case 4:n.top=e[0];n.left=e[1];n.bottom=e[2];n.right=e[3]}break;case"margin-top":n.top=(0,s.getMeasurement)(t);break;case"margin-bottom":n.bottom=(0,s.getMeasurement)(t);break;case"margin-left":n.left=(0,s.getMeasurement)(t);break;case"margin-right":n.right=(0,s.getMeasurement)(t);break;case"line-height":i=(0,s.getMeasurement)(t)}e.pushData(a,n,i);if(this[r.$content])e.addString(this[r.$content]);else for(const t of this[r.$getChildren]())"#text"!==t[r.$nodeName]?t[r.$pushGlyphs](e):e.addString(t[r.$content]);t&&e.popFont()}[r.$toHTML](e){const t=[];this[r.$extra]={children:t};this[r.$childrenToHTML]({});if(0===t.length&&!this[r.$content])return s.HTMLResult.EMPTY;let a;a=this[c]?this[r.$content]?this[r.$content].replace(f,"\n"):void 0:this[r.$content]||void 0;return s.HTMLResult.success({name:this[r.$nodeName],attributes:{href:this.href,style:mapStyle(this.style,this,this[c])},children:t,value:a})}}class A extends XhtmlObject{constructor(e){super(e,"a");this.href=(0,i.fixURL)(e.href)||""}}class B extends XhtmlObject{constructor(e){super(e,"b")}[r.$pushGlyphs](e){e.pushFont({weight:"bold"});super[r.$pushGlyphs](e);e.popFont()}}class Body extends XhtmlObject{constructor(e){super(e,"body")}[r.$toHTML](e){const t=super[r.$toHTML](e),{html:a}=t;if(!a)return s.HTMLResult.EMPTY;a.name="div";a.attributes.class=["xfaRich"];return t}}class Br extends XhtmlObject{constructor(e){super(e,"br")}[r.$text](){return"\n"}[r.$pushGlyphs](e){e.addString("\n")}[r.$toHTML](e){return s.HTMLResult.success({name:"br"})}}class Html extends XhtmlObject{constructor(e){super(e,"html")}[r.$toHTML](e){const t=[];this[r.$extra]={children:t};this[r.$childrenToHTML]({});if(0===t.length)return s.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},value:this[r.$content]||""});if(1===t.length){const e=t[0];if(e.attributes&&e.attributes.class.includes("xfaRich"))return s.HTMLResult.success(e)}return s.HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},children:t})}}class I extends XhtmlObject{constructor(e){super(e,"i")}[r.$pushGlyphs](e){e.pushFont({posture:"italic"});super[r.$pushGlyphs](e);e.popFont()}}class Li extends XhtmlObject{constructor(e){super(e,"li")}}class Ol extends XhtmlObject{constructor(e){super(e,"ol")}}class P extends XhtmlObject{constructor(e){super(e,"p")}[r.$pushGlyphs](e){super[r.$pushGlyphs](e,!1);e.addString("\n");e.addPara();e.popFont()}[r.$text](){return this[r.$getParent]()[r.$getChildren]().at(-1)===this?super[r.$text]():super[r.$text]()+"\n"}}class Span extends XhtmlObject{constructor(e){super(e,"span")}}class Sub extends XhtmlObject{constructor(e){super(e,"sub")}}class Sup extends XhtmlObject{constructor(e){super(e,"sup")}}class Ul extends XhtmlObject{constructor(e){super(e,"ul")}}class XhtmlNamespace{static[n.$buildXFAObject](e,t){if(XhtmlNamespace.hasOwnProperty(e))return XhtmlNamespace[e](t)}static a(e){return new A(e)}static b(e){return new B(e)}static body(e){return new Body(e)}static br(e){return new Br(e)}static html(e){return new Html(e)}static i(e){return new I(e)}static li(e){return new Li(e)}static ol(e){return new Ol(e)}static p(e){return new P(e)}static span(e){return new Span(e)}static sub(e){return new Sub(e)}static sup(e){return new Sup(e)}static ul(e){return new Ul(e)}}t.XhtmlNamespace=XhtmlNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.UnknownNamespace=void 0;var r=a(79),n=a(77);class UnknownNamespace{constructor(e){this.namespaceId=e}[r.$buildXFAObject](e,t){return new n.XmlObject(this.namespaceId,e,t)}}t.UnknownNamespace=UnknownNamespace},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DatasetReader=void 0;var r=a(2),n=a(6),i=a(66);function decodeString(e){try{return(0,r.stringToUTF8String)(e)}catch(t){(0,r.warn)(`UTF-8 decoding failed: "${t}".`);return e}}class DatasetXMLParser extends i.SimpleXMLParser{constructor(e){super(e);this.node=null}onEndElement(e){const t=super.onEndElement(e);if(t&&"xfa:datasets"===e){this.node=t;throw new Error("Aborting DatasetXMLParser.")}}}t.DatasetReader=class DatasetReader{constructor(e){if(e.datasets)this.node=new i.SimpleXMLParser({hasAttributes:!0}).parseFromString(e.datasets).documentElement;else{const t=new DatasetXMLParser({hasAttributes:!0});try{t.parseFromString(e["xdp:xdp"])}catch(e){}this.node=t.node}}getValue(e){if(!this.node||!e)return"";const t=this.node.searchNode((0,n.parseXFAPath)(e),0);if(!t)return"";const a=t.firstChild;return a&&"value"===a.nodeName?t.children.map((e=>decodeString(e.textContent))):decodeString(t.textContent)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XRef=void 0;var r=a(2),n=a(5),i=a(6),s=a(17),o=a(7),c=a(67);t.XRef=class XRef{constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this.xrefstms=Object.create(null);this._cacheMap=new Map;this._pendingRefs=new n.RefSet;this.stats=new i.DocStats(t.msgHandler);this._newRefNum=null}getNewRef(){null===this._newRefNum&&(this._newRefNum=this.entries.length||1);return n.Ref.get(this._newRefNum++,0)}resetNewRef(){this._newRefNum=null}setStartXRef(e){this.startXRefQueue=[e]}parse(e=!1){let t,a,s;if(e){(0,r.warn)("Indexing all PDF objects");t=this.indexObjects()}else t=this.readXRef();t.assignXref(this);this.trailer=t;try{a=t.get("Encrypt")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Encrypt" reference: "${e}".`)}if(a instanceof n.Dict){const e=t.get("ID"),r=e&&e.length?e[0]:"";a.suppressEncryption=!0;this.encrypt=new c.CipherTransformFactory(a,r,this.pdfManager.password)}try{s=t.get("Root")}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Root" reference: "${e}".`)}if(s instanceof n.Dict)try{if(s.get("Pages")instanceof n.Dict){this.root=s;return}}catch(e){if(e instanceof i.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Pages" reference: "${e}".`)}if(!e)throw new i.XRefParseException;throw new r.InvalidPDFException("Invalid Root reference.")}processXRefTable(e){"tableState"in this||(this.tableState={entryNum:0,streamPos:e.lexer.stream.pos,parserBuf1:e.buf1,parserBuf2:e.buf2});const t=this.readXRefTable(e);if(!(0,n.isCmd)(t,"trailer"))throw new r.FormatError("Invalid XRef table: could not find trailer dictionary");let a=e.getObj();a instanceof n.Dict||!a.dict||(a=a.dict);if(!(a instanceof n.Dict))throw new r.FormatError("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return a}readXRefTable(e){const t=e.lexer.stream,a=this.tableState;t.pos=a.streamPos;e.buf1=a.parserBuf1;e.buf2=a.parserBuf2;let i;for(;;){if(!("firstEntryNum"in a)||!("entryCount"in a)){if((0,n.isCmd)(i=e.getObj(),"trailer"))break;a.firstEntryNum=i;a.entryCount=e.getObj()}let s=a.firstEntryNum;const o=a.entryCount;if(!Number.isInteger(s)||!Number.isInteger(o))throw new r.FormatError("Invalid XRef table: wrong types in subsection header");for(let i=a.entryNum;i0;){const[o,c]=s;if(!Number.isInteger(o)||!Number.isInteger(c))throw new r.FormatError(`Invalid XRef range fields: ${o}, ${c}`);if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(i))throw new r.FormatError(`Invalid XRef entry fields length: ${o}, ${c}`);for(let s=t.entryNum;s=e.length);){a+=String.fromCharCode(r);r=e[t]}return a}function skipUntil(e,t,a){const r=a.length,n=e.length;let i=0;for(;t=r)break;t++;i++}return i}const e=/^(\d+)\s+(\d+)\s+obj\b/,t=/\bendobj[\b\s]$/,a=/\s+(\d+\s+\d+\s+obj[\b\s<])$/,o=new Uint8Array([116,114,97,105,108,101,114]),c=new Uint8Array([115,116,97,114,116,120,114,101,102]),l=new Uint8Array([111,98,106]),h=new Uint8Array([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const u=this.stream;u.pos=0;const d=u.getBytes(),f=d.length;let g=u.start;const p=[],m=[];for(;g=f)break;n=d[g]}while(10!==n&&13!==n);continue}const b=readToken(d,g);let y;if(b.startsWith("xref")&&(4===b.length||/\s/.test(b[4]))){g+=skipUntil(d,g,o);p.push(g);g+=skipUntil(d,g,c)}else if(y=e.exec(b)){const e=0|y[1],n=0|y[2];let o,c=g+b.length,f=!1;if(this.entries[e]){if(this.entries[e].gen===n)try{new s.Parser({lexer:new s.Lexer(u.makeSubStream(c))}).getObj();f=!0}catch(e){e instanceof i.ParserEOFException?(0,r.warn)(`indexObjects -- checking object (${b}): "${e}".`):f=!0}}else f=!0;f&&(this.entries[e]={offset:g-u.start,gen:n,uncompressed:!0});for(;c{Object.defineProperty(t,"__esModule",{value:!0});t.MessageHandler=void 0;var r=a(2);const n=1,i=2,s=1,o=2,c=3,l=4,h=5,u=6,d=7,f=8;function wrapReason(e){e instanceof Error||"object"==typeof e&&null!==e||(0,r.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(e.name){case"AbortException":return new r.AbortException(e.message);case"MissingPDFException":return new r.MissingPDFException(e.message);case"PasswordException":return new r.PasswordException(e.message,e.code);case"UnexpectedResponseException":return new r.UnexpectedResponseException(e.message,e.status);case"UnknownErrorException":return new r.UnknownErrorException(e.message,e.details);default:return new r.UnknownErrorException(e.message,e.toString())}}t.MessageHandler=class MessageHandler{constructor(e,t,a){this.sourceName=e;this.targetName=t;this.comObj=a;this.callbackId=1;this.streamId=1;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);this._onComObjOnMessage=e=>{const t=e.data;if(t.targetName!==this.sourceName)return;if(t.stream){this._processStreamMessage(t);return}if(t.callback){const e=t.callbackId,a=this.callbackCapabilities[e];if(!a)throw new Error(`Cannot resolve callback ${e}`);delete this.callbackCapabilities[e];if(t.callback===n)a.resolve(t.data);else{if(t.callback!==i)throw new Error("Unexpected callback case");a.reject(wrapReason(t.reason))}return}const r=this.actionHandler[t.action];if(!r)throw new Error(`Unknown action from worker: ${t.action}`);if(t.callbackId){const e=this.sourceName,s=t.sourceName;new Promise((function(e){e(r(t.data))})).then((function(r){a.postMessage({sourceName:e,targetName:s,callback:n,callbackId:t.callbackId,data:r})}),(function(r){a.postMessage({sourceName:e,targetName:s,callback:i,callbackId:t.callbackId,reason:wrapReason(r)})}))}else t.streamId?this._createStreamSink(t):r(t.data)};a.addEventListener("message",this._onComObjOnMessage)}on(e,t){const a=this.actionHandler;if(a[e])throw new Error(`There is already an actionName called "${e}"`);a[e]=t}send(e,t,a){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},a)}sendWithPromise(e,t,a){const n=this.callbackId++,i=(0,r.createPromiseCapability)();this.callbackCapabilities[n]=i;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:n,data:t},a)}catch(e){i.reject(e)}return i.promise}sendWithStream(e,t,a,n){const i=this.streamId++,o=this.sourceName,c=this.targetName,l=this.comObj;return new ReadableStream({start:a=>{const s=(0,r.createPromiseCapability)();this.streamControllers[i]={controller:a,startCall:s,pullCall:null,cancelCall:null,isClosed:!1};l.postMessage({sourceName:o,targetName:c,action:e,streamId:i,data:t,desiredSize:a.desiredSize},n);return s.promise},pull:e=>{const t=(0,r.createPromiseCapability)();this.streamControllers[i].pullCall=t;l.postMessage({sourceName:o,targetName:c,stream:u,streamId:i,desiredSize:e.desiredSize});return t.promise},cancel:e=>{(0,r.assert)(e instanceof Error,"cancel must have a valid reason");const t=(0,r.createPromiseCapability)();this.streamControllers[i].cancelCall=t;this.streamControllers[i].isClosed=!0;l.postMessage({sourceName:o,targetName:c,stream:s,streamId:i,reason:wrapReason(e)});return t.promise}},a)}_createStreamSink(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,i=this.comObj,s=this,o=this.actionHandler[e.action],u={enqueue(e,s=1,o){if(this.isCancelled)return;const c=this.desiredSize;this.desiredSize-=s;if(c>0&&this.desiredSize<=0){this.sinkCapability=(0,r.createPromiseCapability)();this.ready=this.sinkCapability.promise}i.postMessage({sourceName:a,targetName:n,stream:l,streamId:t,chunk:e},o)},close(){if(!this.isCancelled){this.isCancelled=!0;i.postMessage({sourceName:a,targetName:n,stream:c,streamId:t});delete s.streamSinks[t]}},error(e){(0,r.assert)(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;i.postMessage({sourceName:a,targetName:n,stream:h,streamId:t,reason:wrapReason(e)})}},sinkCapability:(0,r.createPromiseCapability)(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};u.sinkCapability.resolve();u.ready=u.sinkCapability.promise;this.streamSinks[t]=u;new Promise((function(t){t(o(e.data,u))})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:f,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:f,streamId:t,reason:wrapReason(e)})}))}_processStreamMessage(e){const t=e.streamId,a=this.sourceName,n=e.sourceName,i=this.comObj,g=this.streamControllers[t],p=this.streamSinks[t];switch(e.stream){case f:e.success?g.startCall.resolve():g.startCall.reject(wrapReason(e.reason));break;case d:e.success?g.pullCall.resolve():g.pullCall.reject(wrapReason(e.reason));break;case u:if(!p){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,success:!0});break}p.desiredSize<=0&&e.desiredSize>0&&p.sinkCapability.resolve();p.desiredSize=e.desiredSize;new Promise((function(e){e(p.onPull&&p.onPull())})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:d,streamId:t,reason:wrapReason(e)})}));break;case l:(0,r.assert)(g,"enqueue should have stream controller");if(g.isClosed)break;g.controller.enqueue(e.chunk);break;case c:(0,r.assert)(g,"close should have stream controller");if(g.isClosed)break;g.isClosed=!0;g.controller.close();this._deleteStreamController(g,t);break;case h:(0,r.assert)(g,"error should have stream controller");g.controller.error(wrapReason(e.reason));this._deleteStreamController(g,t);break;case o:e.success?g.cancelCall.resolve():g.cancelCall.reject(wrapReason(e.reason));this._deleteStreamController(g,t);break;case s:if(!p)break;new Promise((function(t){t(p.onCancel&&p.onCancel(wrapReason(e.reason)))})).then((function(){i.postMessage({sourceName:a,targetName:n,stream:o,streamId:t,success:!0})}),(function(e){i.postMessage({sourceName:a,targetName:n,stream:o,streamId:t,reason:wrapReason(e)})}));p.sinkCapability.reject(wrapReason(e.reason));p.isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async _deleteStreamController(e,t){await Promise.allSettled([e.startCall&&e.startCall.promise,e.pullCall&&e.pullCall.promise,e.cancelCall&&e.cancelCall.promise]);delete this.streamControllers[t]}destroy(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.PDFWorkerStream=void 0;var r=a(2);t.PDFWorkerStream=class PDFWorkerStream{constructor(e){this._msgHandler=e;this._contentLength=null;this._fullRequestReader=null;this._rangeRequestReaders=[]}getFullReader(){(0,r.assert)(!this._fullRequestReader,"PDFWorkerStream.getFullReader can only be called once.");this._fullRequestReader=new PDFWorkerStreamReader(this._msgHandler);return this._fullRequestReader}getRangeReader(e,t){const a=new PDFWorkerStreamRangeReader(e,t,this._msgHandler);this._rangeRequestReaders.push(a);return a}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);for(const t of this._rangeRequestReaders.slice(0))t.cancel(e)}};class PDFWorkerStreamReader{constructor(e){this._msgHandler=e;this.onProgress=null;this._contentLength=null;this._isRangeSupported=!1;this._isStreamingSupported=!1;const t=this._msgHandler.sendWithStream("GetReader");this._reader=t.getReader();this._headersReady=this._msgHandler.sendWithPromise("ReaderHeadersReady").then((e=>{this._isStreamingSupported=e.isStreamingSupported;this._isRangeSupported=e.isRangeSupported;this._contentLength=e.contentLength}))}get headersReady(){return this._headersReady}get contentLength(){return this._contentLength}get isStreamingSupported(){return this._isStreamingSupported}get isRangeSupported(){return this._isRangeSupported}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}class PDFWorkerStreamRangeReader{constructor(e,t,a){this._msgHandler=a;this.onProgress=null;const r=this._msgHandler.sendWithStream("GetRangeReader",{begin:e,end:t});this._reader=r.getReader()}get isStreamingSupported(){return!1}async read(){const{value:e,done:t}=await this._reader.read();return t?{value:void 0,done:!0}:{value:e.buffer,done:!1}}cancel(e){this._reader.cancel(e)}}}],t={};function __w_pdfjs_require__(a){var r=t[a];if(void 0!==r)return r.exports;var n=t[a]={exports:{}};e[a](n,n.exports,__w_pdfjs_require__);return n.exports}__w_pdfjs_require__.d=(e,t)=>{for(var a in t)__w_pdfjs_require__.o(t,a)&&!__w_pdfjs_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})};__w_pdfjs_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);__w_pdfjs_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{var e=a;Object.defineProperty(e,"__esModule",{value:!0});Object.defineProperty(e,"WorkerMessageHandler",{enumerable:!0,get:function(){return t.WorkerMessageHandler}});var t=__w_pdfjs_require__(1)})();return a})())); \ No newline at end of file diff --git a/public/pdf.worker.mjs b/public/pdf.worker.mjs deleted file mode 100644 index e57ac161..00000000 --- a/public/pdf.worker.mjs +++ /dev/null @@ -1,58148 +0,0 @@ -/** - * @licstart The following is the entire license notice for the - * JavaScript code in this page - * - * Copyright 2024 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @licend The above is the entire license notice for the - * JavaScript code in this page - */ - -/** - * pdfjsVersion = 5.4.54 - * pdfjsBuild = 295fb3ec4 - */ - -;// ./src/shared/util.js -const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); -const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; -const LINE_FACTOR = 1.35; -const LINE_DESCENT_FACTOR = 0.35; -const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; -const RenderingIntentFlag = { - ANY: 0x01, - DISPLAY: 0x02, - PRINT: 0x04, - SAVE: 0x08, - ANNOTATIONS_FORMS: 0x10, - ANNOTATIONS_STORAGE: 0x20, - ANNOTATIONS_DISABLE: 0x40, - IS_EDITING: 0x80, - OPLIST: 0x100 -}; -const AnnotationMode = { - DISABLE: 0, - ENABLE: 1, - ENABLE_FORMS: 2, - ENABLE_STORAGE: 3 -}; -const AnnotationEditorPrefix = "pdfjs_internal_editor_"; -const AnnotationEditorType = { - DISABLE: -1, - NONE: 0, - FREETEXT: 3, - HIGHLIGHT: 9, - STAMP: 13, - INK: 15, - SIGNATURE: 101, - COMMENT: 102 -}; -const AnnotationEditorParamsType = { - RESIZE: 1, - CREATE: 2, - FREETEXT_SIZE: 11, - FREETEXT_COLOR: 12, - FREETEXT_OPACITY: 13, - INK_COLOR: 21, - INK_THICKNESS: 22, - INK_OPACITY: 23, - HIGHLIGHT_COLOR: 31, - HIGHLIGHT_THICKNESS: 32, - HIGHLIGHT_FREE: 33, - HIGHLIGHT_SHOW_ALL: 34, - DRAW_STEP: 41 -}; -const PermissionFlag = { - PRINT: 0x04, - MODIFY_CONTENTS: 0x08, - COPY: 0x10, - MODIFY_ANNOTATIONS: 0x20, - FILL_INTERACTIVE_FORMS: 0x100, - COPY_FOR_ACCESSIBILITY: 0x200, - ASSEMBLE: 0x400, - PRINT_HIGH_QUALITY: 0x800 -}; -const TextRenderingMode = { - FILL: 0, - STROKE: 1, - FILL_STROKE: 2, - INVISIBLE: 3, - FILL_ADD_TO_PATH: 4, - STROKE_ADD_TO_PATH: 5, - FILL_STROKE_ADD_TO_PATH: 6, - ADD_TO_PATH: 7, - FILL_STROKE_MASK: 3, - ADD_TO_PATH_FLAG: 4 -}; -const ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; -const AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; -const AnnotationReplyType = { - GROUP: "Group", - REPLY: "R" -}; -const AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; -const AnnotationFieldFlag = { - READONLY: 0x0000001, - REQUIRED: 0x0000002, - NOEXPORT: 0x0000004, - MULTILINE: 0x0001000, - PASSWORD: 0x0002000, - NOTOGGLETOOFF: 0x0004000, - RADIO: 0x0008000, - PUSHBUTTON: 0x0010000, - COMBO: 0x0020000, - EDIT: 0x0040000, - SORT: 0x0080000, - FILESELECT: 0x0100000, - MULTISELECT: 0x0200000, - DONOTSPELLCHECK: 0x0400000, - DONOTSCROLL: 0x0800000, - COMB: 0x1000000, - RICHTEXT: 0x2000000, - RADIOSINUNISON: 0x2000000, - COMMITONSELCHANGE: 0x4000000 -}; -const AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; -const AnnotationActionEventType = { - E: "Mouse Enter", - X: "Mouse Exit", - D: "Mouse Down", - U: "Mouse Up", - Fo: "Focus", - Bl: "Blur", - PO: "PageOpen", - PC: "PageClose", - PV: "PageVisible", - PI: "PageInvisible", - K: "Keystroke", - F: "Format", - V: "Validate", - C: "Calculate" -}; -const DocumentActionEventType = { - WC: "WillClose", - WS: "WillSave", - DS: "DidSave", - WP: "WillPrint", - DP: "DidPrint" -}; -const PageActionEventType = { - O: "PageOpen", - C: "PageClose" -}; -const VerbosityLevel = { - ERRORS: 0, - WARNINGS: 1, - INFOS: 5 -}; -const OPS = { - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotation: 80, - endAnnotation: 81, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91, - setStrokeTransparent: 92, - setFillTransparent: 93, - rawFillPath: 94 -}; -const DrawOPS = { - moveTo: 0, - lineTo: 1, - curveTo: 2, - closePath: 3 -}; -const PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; -let verbosity = VerbosityLevel.WARNINGS; -function setVerbosityLevel(level) { - if (Number.isInteger(level)) { - verbosity = level; - } -} -function getVerbosityLevel() { - return verbosity; -} -function info(msg) { - if (verbosity >= VerbosityLevel.INFOS) { - console.log(`Info: ${msg}`); - } -} -function warn(msg) { - if (verbosity >= VerbosityLevel.WARNINGS) { - console.log(`Warning: ${msg}`); - } -} -function unreachable(msg) { - throw new Error(msg); -} -function assert(cond, msg) { - if (!cond) { - unreachable(msg); - } -} -function _isValidProtocol(url) { - switch (url?.protocol) { - case "http:": - case "https:": - case "ftp:": - case "mailto:": - case "tel:": - return true; - default: - return false; - } -} -function createValidAbsoluteUrl(url, baseUrl = null, options = null) { - if (!url) { - return null; - } - if (options && typeof url === "string") { - if (options.addDefaultProtocol && url.startsWith("www.")) { - const dots = url.match(/\./g); - if (dots?.length >= 2) { - url = `http://${url}`; - } - } - if (options.tryConvertEncoding) { - try { - url = stringToUTF8String(url); - } catch {} - } - } - const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); - return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; -} -function updateUrlHash(url, hash, allowRel = false) { - const res = URL.parse(url); - if (res) { - res.hash = hash; - return res.href; - } - if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { - return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; - } - return ""; -} -function shadow(obj, prop, value, nonSerializable = false) { - Object.defineProperty(obj, prop, { - value, - enumerable: !nonSerializable, - configurable: true, - writable: false - }); - return value; -} -const BaseException = function BaseExceptionClosure() { - function BaseException(message, name) { - this.message = message; - this.name = name; - } - BaseException.prototype = new Error(); - BaseException.constructor = BaseException; - return BaseException; -}(); -class PasswordException extends BaseException { - constructor(msg, code) { - super(msg, "PasswordException"); - this.code = code; - } -} -class UnknownErrorException extends BaseException { - constructor(msg, details) { - super(msg, "UnknownErrorException"); - this.details = details; - } -} -class InvalidPDFException extends BaseException { - constructor(msg) { - super(msg, "InvalidPDFException"); - } -} -class ResponseException extends BaseException { - constructor(msg, status, missing) { - super(msg, "ResponseException"); - this.status = status; - this.missing = missing; - } -} -class FormatError extends BaseException { - constructor(msg) { - super(msg, "FormatError"); - } -} -class AbortException extends BaseException { - constructor(msg) { - super(msg, "AbortException"); - } -} -function bytesToString(bytes) { - if (typeof bytes !== "object" || bytes?.length === undefined) { - unreachable("Invalid argument for bytesToString"); - } - const length = bytes.length; - const MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - const strBuf = []; - for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - const chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(""); -} -function stringToBytes(str) { - if (typeof str !== "string") { - unreachable("Invalid argument for stringToBytes"); - } - const length = str.length; - const bytes = new Uint8Array(length); - for (let i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xff; - } - return bytes; -} -function string32(value) { - return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); -} -function objectSize(obj) { - return Object.keys(obj).length; -} -function isLittleEndian() { - const buffer8 = new Uint8Array(4); - buffer8[0] = 1; - const view32 = new Uint32Array(buffer8.buffer, 0, 1); - return view32[0] === 1; -} -function isEvalSupported() { - try { - new Function(""); - return true; - } catch { - return false; - } -} -class FeatureTest { - static get isLittleEndian() { - return shadow(this, "isLittleEndian", isLittleEndian()); - } - static get isEvalSupported() { - return shadow(this, "isEvalSupported", isEvalSupported()); - } - static get isOffscreenCanvasSupported() { - return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); - } - static get isImageDecoderSupported() { - return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); - } - static get platform() { - const { - platform, - userAgent - } = navigator; - return shadow(this, "platform", { - isAndroid: userAgent.includes("Android"), - isLinux: platform.includes("Linux"), - isMac: platform.includes("Mac"), - isWindows: platform.includes("Win"), - isFirefox: userAgent.includes("Firefox") - }); - } - static get isCSSRoundSupported() { - return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); - } -} -const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); -class Util { - static makeHexColor(r, g, b) { - return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; - } - static scaleMinMax(transform, minMax) { - let temp; - if (transform[0]) { - if (transform[0] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[0]; - minMax[2] *= transform[0]; - if (transform[3] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[3]; - minMax[3] *= transform[3]; - } else { - temp = minMax[0]; - minMax[0] = minMax[1]; - minMax[1] = temp; - temp = minMax[2]; - minMax[2] = minMax[3]; - minMax[3] = temp; - if (transform[1] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[1]; - minMax[3] *= transform[1]; - if (transform[2] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[2]; - minMax[2] *= transform[2]; - } - minMax[0] += transform[4]; - minMax[1] += transform[5]; - minMax[2] += transform[4]; - minMax[3] += transform[5]; - } - static transform(m1, m2) { - return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; - } - static applyTransform(p, m, pos = 0) { - const p0 = p[pos]; - const p1 = p[pos + 1]; - p[pos] = p0 * m[0] + p1 * m[2] + m[4]; - p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; - } - static applyTransformToBezier(p, transform, pos = 0) { - const m0 = transform[0]; - const m1 = transform[1]; - const m2 = transform[2]; - const m3 = transform[3]; - const m4 = transform[4]; - const m5 = transform[5]; - for (let i = 0; i < 6; i += 2) { - const pI = p[pos + i]; - const pI1 = p[pos + i + 1]; - p[pos + i] = pI * m0 + pI1 * m2 + m4; - p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; - } - } - static applyInverseTransform(p, m) { - const p0 = p[0]; - const p1 = p[1]; - const d = m[0] * m[3] - m[1] * m[2]; - p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - } - static axialAlignedBoundingBox(rect, transform, output) { - const m0 = transform[0]; - const m1 = transform[1]; - const m2 = transform[2]; - const m3 = transform[3]; - const m4 = transform[4]; - const m5 = transform[5]; - const r0 = rect[0]; - const r1 = rect[1]; - const r2 = rect[2]; - const r3 = rect[3]; - let a0 = m0 * r0 + m4; - let a2 = a0; - let a1 = m0 * r2 + m4; - let a3 = a1; - let b0 = m3 * r1 + m5; - let b2 = b0; - let b1 = m3 * r3 + m5; - let b3 = b1; - if (m1 !== 0 || m2 !== 0) { - const m1r0 = m1 * r0; - const m1r2 = m1 * r2; - const m2r1 = m2 * r1; - const m2r3 = m2 * r3; - a0 += m2r1; - a3 += m2r1; - a1 += m2r3; - a2 += m2r3; - b0 += m1r0; - b3 += m1r0; - b1 += m1r2; - b2 += m1r2; - } - output[0] = Math.min(output[0], a0, a1, a2, a3); - output[1] = Math.min(output[1], b0, b1, b2, b3); - output[2] = Math.max(output[2], a0, a1, a2, a3); - output[3] = Math.max(output[3], b0, b1, b2, b3); - } - static inverseTransform(m) { - const d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - } - static singularValueDecompose2dScale(matrix, output) { - const m0 = matrix[0]; - const m1 = matrix[1]; - const m2 = matrix[2]; - const m3 = matrix[3]; - const a = m0 ** 2 + m1 ** 2; - const b = m0 * m2 + m1 * m3; - const c = m2 ** 2 + m3 ** 2; - const first = (a + c) / 2; - const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); - output[0] = Math.sqrt(first + second || 1); - output[1] = Math.sqrt(first - second || 1); - } - static normalizeRect(rect) { - const r = rect.slice(0); - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - } - static intersect(rect1, rect2) { - const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); - const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); - if (xLow > xHigh) { - return null; - } - const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); - const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); - if (yLow > yHigh) { - return null; - } - return [xLow, yLow, xHigh, yHigh]; - } - static pointBoundingBox(x, y, minMax) { - minMax[0] = Math.min(minMax[0], x); - minMax[1] = Math.min(minMax[1], y); - minMax[2] = Math.max(minMax[2], x); - minMax[3] = Math.max(minMax[3], y); - } - static rectBoundingBox(x0, y0, x1, y1, minMax) { - minMax[0] = Math.min(minMax[0], x0, x1); - minMax[1] = Math.min(minMax[1], y0, y1); - minMax[2] = Math.max(minMax[2], x0, x1); - minMax[3] = Math.max(minMax[3], y0, y1); - } - static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { - if (t <= 0 || t >= 1) { - return; - } - const mt = 1 - t; - const tt = t * t; - const ttt = tt * t; - const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; - const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; - minMax[0] = Math.min(minMax[0], x); - minMax[1] = Math.min(minMax[1], y); - minMax[2] = Math.max(minMax[2], x); - minMax[3] = Math.max(minMax[3], y); - } - static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { - if (Math.abs(a) < 1e-12) { - if (Math.abs(b) >= 1e-12) { - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); - } - return; - } - const delta = b ** 2 - 4 * c * a; - if (delta < 0) { - return; - } - const sqrtDelta = Math.sqrt(delta); - const a2 = 2 * a; - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); - } - static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { - minMax[0] = Math.min(minMax[0], x0, x3); - minMax[1] = Math.min(minMax[1], y0, y3); - minMax[2] = Math.max(minMax[2], x0, x3); - minMax[3] = Math.max(minMax[3], y0, y3); - this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); - this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); - } -} -const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; -function stringToPDFString(str, keepEscapeSequence = false) { - if (str[0] >= "\xEF") { - let encoding; - if (str[0] === "\xFE" && str[1] === "\xFF") { - encoding = "utf-16be"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xFF" && str[1] === "\xFE") { - encoding = "utf-16le"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { - encoding = "utf-8"; - } - if (encoding) { - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = stringToBytes(str); - const decoded = decoder.decode(buffer); - if (keepEscapeSequence || !decoded.includes("\x1b")) { - return decoded; - } - return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); - } catch (ex) { - warn(`stringToPDFString: "${ex}".`); - } - } - } - const strBuf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const charCode = str.charCodeAt(i); - if (!keepEscapeSequence && charCode === 0x1b) { - while (++i < ii && str.charCodeAt(i) !== 0x1b) {} - continue; - } - const code = PDFStringTranslateTable[charCode]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - return strBuf.join(""); -} -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} -function isArrayEqual(arr1, arr2) { - if (arr1.length !== arr2.length) { - return false; - } - for (let i = 0, ii = arr1.length; i < ii; i++) { - if (arr1[i] !== arr2[i]) { - return false; - } - } - return true; -} -function getModificationDate(date = new Date()) { - if (!(date instanceof Date)) { - date = new Date(date); - } - const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; - return buffer.join(""); -} -let NormalizeRegex = null; -let NormalizationMap = null; -function normalizeUnicode(str) { - if (!NormalizeRegex) { - NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; - NormalizationMap = new Map([["ſt", "ſt"]]); - } - return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); -} -function getUuid() { - if (typeof crypto.randomUUID === "function") { - return crypto.randomUUID(); - } - const buf = new Uint8Array(32); - crypto.getRandomValues(buf); - return bytesToString(buf); -} -const AnnotationPrefix = "pdfjs_internal_id_"; -function _isValidExplicitDest(validRef, validName, dest) { - if (!Array.isArray(dest) || dest.length < 2) { - return false; - } - const [page, zoom, ...args] = dest; - if (!validRef(page) && !Number.isInteger(page)) { - return false; - } - if (!validName(zoom)) { - return false; - } - const argsLen = args.length; - let allowNull = true; - switch (zoom.name) { - case "XYZ": - if (argsLen < 2 || argsLen > 3) { - return false; - } - break; - case "Fit": - case "FitB": - return argsLen === 0; - case "FitH": - case "FitBH": - case "FitV": - case "FitBV": - if (argsLen > 1) { - return false; - } - break; - case "FitR": - if (argsLen !== 4) { - return false; - } - allowNull = false; - break; - default: - return false; - } - for (const arg of args) { - if (typeof arg === "number" || allowNull && arg === null) { - continue; - } - return false; - } - return true; -} -function MathClamp(v, min, max) { - return Math.min(Math.max(v, min), max); -} -function toHexUtil(arr) { - if (Uint8Array.prototype.toHex) { - return arr.toHex(); - } - return Array.from(arr, num => hexNumbers[num]).join(""); -} -function toBase64Util(arr) { - if (Uint8Array.prototype.toBase64) { - return arr.toBase64(); - } - return btoa(bytesToString(arr)); -} -function fromBase64Util(str) { - if (Uint8Array.fromBase64) { - return Uint8Array.fromBase64(str); - } - return stringToBytes(atob(str)); -} -if (typeof Promise.try !== "function") { - Promise.try = function (fn, ...args) { - return new Promise(resolve => { - resolve(fn(...args)); - }); - }; -} -if (typeof Math.sumPrecise !== "function") { - Math.sumPrecise = function (numbers) { - return numbers.reduce((a, b) => a + b, 0); - }; -} - -;// ./src/core/primitives.js - -const CIRCULAR_REF = Symbol("CIRCULAR_REF"); -const EOF = Symbol("EOF"); -let CmdCache = Object.create(null); -let NameCache = Object.create(null); -let RefCache = Object.create(null); -function clearPrimitiveCaches() { - CmdCache = Object.create(null); - NameCache = Object.create(null); - RefCache = Object.create(null); -} -class Name { - constructor(name) { - this.name = name; - } - static get(name) { - return NameCache[name] ||= new Name(name); - } -} -class Cmd { - constructor(cmd) { - this.cmd = cmd; - } - static get(cmd) { - return CmdCache[cmd] ||= new Cmd(cmd); - } -} -const nonSerializable = function nonSerializableClosure() { - return nonSerializable; -}; -class Dict { - constructor(xref = null) { - this._map = new Map(); - this.xref = xref; - this.objId = null; - this.suppressEncryption = false; - this.__nonSerializable__ = nonSerializable; - } - assignXref(newXref) { - this.xref = newXref; - } - get size() { - return this._map.size; - } - get(key1, key2, key3) { - let value = this._map.get(key1); - if (value === undefined && key2 !== undefined) { - value = this._map.get(key2); - if (value === undefined && key3 !== undefined) { - value = this._map.get(key3); - } - } - if (value instanceof Ref && this.xref) { - return this.xref.fetch(value, this.suppressEncryption); - } - return value; - } - async getAsync(key1, key2, key3) { - let value = this._map.get(key1); - if (value === undefined && key2 !== undefined) { - value = this._map.get(key2); - if (value === undefined && key3 !== undefined) { - value = this._map.get(key3); - } - } - if (value instanceof Ref && this.xref) { - return this.xref.fetchAsync(value, this.suppressEncryption); - } - return value; - } - getArray(key1, key2, key3) { - let value = this._map.get(key1); - if (value === undefined && key2 !== undefined) { - value = this._map.get(key2); - if (value === undefined && key3 !== undefined) { - value = this._map.get(key3); - } - } - if (value instanceof Ref && this.xref) { - value = this.xref.fetch(value, this.suppressEncryption); - } - if (Array.isArray(value)) { - value = value.slice(); - for (let i = 0, ii = value.length; i < ii; i++) { - if (value[i] instanceof Ref && this.xref) { - value[i] = this.xref.fetch(value[i], this.suppressEncryption); - } - } - } - return value; - } - getRaw(key) { - return this._map.get(key); - } - getKeys() { - return [...this._map.keys()]; - } - getRawValues() { - return [...this._map.values()]; - } - set(key, value) { - this._map.set(key, value); - } - setIfNotExists(key, value) { - if (!this.has(key)) { - this.set(key, value); - } - } - setIfNumber(key, value) { - if (typeof value === "number") { - this.set(key, value); - } - } - setIfArray(key, value) { - if (Array.isArray(value) || ArrayBuffer.isView(value)) { - this.set(key, value); - } - } - setIfDefined(key, value) { - if (value !== undefined && value !== null) { - this.set(key, value); - } - } - setIfName(key, value) { - if (typeof value === "string") { - this.set(key, Name.get(value)); - } else if (value instanceof Name) { - this.set(key, value); - } - } - has(key) { - return this._map.has(key); - } - *[Symbol.iterator]() { - for (const [key, value] of this._map) { - yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; - } - } - static get empty() { - const emptyDict = new Dict(null); - emptyDict.set = (key, value) => { - unreachable("Should not call `set` on the empty dictionary."); - }; - return shadow(this, "empty", emptyDict); - } - static merge({ - xref, - dictArray, - mergeSubDicts = false - }) { - const mergedDict = new Dict(xref), - properties = new Map(); - for (const dict of dictArray) { - if (!(dict instanceof Dict)) { - continue; - } - for (const [key, value] of dict._map) { - let property = properties.get(key); - if (property === undefined) { - property = []; - properties.set(key, property); - } else if (!mergeSubDicts || !(value instanceof Dict)) { - continue; - } - property.push(value); - } - } - for (const [name, values] of properties) { - if (values.length === 1 || !(values[0] instanceof Dict)) { - mergedDict._map.set(name, values[0]); - continue; - } - const subDict = new Dict(xref); - for (const dict of values) { - for (const [key, value] of dict._map) { - if (!subDict._map.has(key)) { - subDict._map.set(key, value); - } - } - } - if (subDict.size > 0) { - mergedDict._map.set(name, subDict); - } - } - properties.clear(); - return mergedDict.size > 0 ? mergedDict : Dict.empty; - } - clone() { - const dict = new Dict(this.xref); - for (const key of this.getKeys()) { - dict.set(key, this.getRaw(key)); - } - return dict; - } - delete(key) { - delete this._map[key]; - } -} -class Ref { - constructor(num, gen) { - this.num = num; - this.gen = gen; - } - toString() { - if (this.gen === 0) { - return `${this.num}R`; - } - return `${this.num}R${this.gen}`; - } - static fromString(str) { - const ref = RefCache[str]; - if (ref) { - return ref; - } - const m = /^(\d+)R(\d*)$/.exec(str); - if (!m || m[1] === "0") { - return null; - } - return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2])); - } - static get(num, gen) { - const key = gen === 0 ? `${num}R` : `${num}R${gen}`; - return RefCache[key] ||= new Ref(num, gen); - } -} -class RefSet { - constructor(parent = null) { - this._set = new Set(parent?._set); - } - has(ref) { - return this._set.has(ref.toString()); - } - put(ref) { - this._set.add(ref.toString()); - } - remove(ref) { - this._set.delete(ref.toString()); - } - [Symbol.iterator]() { - return this._set.values(); - } - clear() { - this._set.clear(); - } -} -class RefSetCache { - constructor() { - this._map = new Map(); - } - get size() { - return this._map.size; - } - get(ref) { - return this._map.get(ref.toString()); - } - has(ref) { - return this._map.has(ref.toString()); - } - put(ref, obj) { - this._map.set(ref.toString(), obj); - } - putAlias(ref, aliasRef) { - this._map.set(ref.toString(), this.get(aliasRef)); - } - [Symbol.iterator]() { - return this._map.values(); - } - clear() { - this._map.clear(); - } - *values() { - yield* this._map.values(); - } - *items() { - for (const [ref, value] of this._map) { - yield [Ref.fromString(ref), value]; - } - } -} -function isName(v, name) { - return v instanceof Name && (name === undefined || v.name === name); -} -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} -function isDict(v, type) { - return v instanceof Dict && (type === undefined || isName(v.get("Type"), type)); -} -function isRefsEqual(v1, v2) { - return v1.num === v2.num && v1.gen === v2.gen; -} - -;// ./src/core/base_stream.js - -class BaseStream { - get length() { - unreachable("Abstract getter `length` accessed"); - } - get isEmpty() { - unreachable("Abstract getter `isEmpty` accessed"); - } - get isDataLoaded() { - return shadow(this, "isDataLoaded", true); - } - getByte() { - unreachable("Abstract method `getByte` called"); - } - getBytes(length) { - unreachable("Abstract method `getBytes` called"); - } - async getImageData(length, decoderOptions) { - return this.getBytes(length, decoderOptions); - } - async asyncGetBytes() { - unreachable("Abstract method `asyncGetBytes` called"); - } - get isAsync() { - return false; - } - get isAsyncDecoder() { - return false; - } - get canAsyncDecodeImageFromBuffer() { - return false; - } - async getTransferableImage() { - return null; - } - peekByte() { - const peekedByte = this.getByte(); - if (peekedByte !== -1) { - this.pos--; - } - return peekedByte; - } - peekBytes(length) { - const bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - } - getUint16() { - const b0 = this.getByte(); - const b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - } - getInt32() { - const b0 = this.getByte(); - const b1 = this.getByte(); - const b2 = this.getByte(); - const b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - } - getByteRange(begin, end) { - unreachable("Abstract method `getByteRange` called"); - } - getString(length) { - return bytesToString(this.getBytes(length)); - } - skip(n) { - this.pos += n || 1; - } - reset() { - unreachable("Abstract method `reset` called"); - } - moveStart() { - unreachable("Abstract method `moveStart` called"); - } - makeSubStream(start, length, dict = null) { - unreachable("Abstract method `makeSubStream` called"); - } - getBaseStreams() { - return null; - } -} - -;// ./src/core/core_utils.js - - - -const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; -const MAX_INT_32 = 2 ** 31 - 1; -const MIN_INT_32 = -(2 ** 31); -const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; -const RESOURCES_KEYS_OPERATOR_LIST = ["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]; -const RESOURCES_KEYS_TEXT_CONTENT = ["ExtGState", "Font", "Properties", "XObject"]; -function getLookupTableFactory(initializer) { - let lookup; - return function () { - if (initializer) { - lookup = Object.create(null); - initializer(lookup); - initializer = null; - } - return lookup; - }; -} -class MissingDataException extends BaseException { - constructor(begin, end) { - super(`Missing data [${begin}, ${end})`, "MissingDataException"); - this.begin = begin; - this.end = end; - } -} -class ParserEOFException extends BaseException { - constructor(msg) { - super(msg, "ParserEOFException"); - } -} -class XRefEntryException extends BaseException { - constructor(msg) { - super(msg, "XRefEntryException"); - } -} -class XRefParseException extends BaseException { - constructor(msg) { - super(msg, "XRefParseException"); - } -} -function arrayBuffersToBytes(arr) { - const length = arr.length; - if (length === 0) { - return new Uint8Array(0); - } - if (length === 1) { - return new Uint8Array(arr[0]); - } - let dataLength = 0; - for (let i = 0; i < length; i++) { - dataLength += arr[i].byteLength; - } - const data = new Uint8Array(dataLength); - let pos = 0; - for (let i = 0; i < length; i++) { - const item = new Uint8Array(arr[i]); - data.set(item, pos); - pos += item.byteLength; - } - return data; -} -async function fetchBinaryData(url) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); - } - return new Uint8Array(await response.arrayBuffer()); -} -function getInheritableProperty({ - dict, - key, - getArray = false, - stopWhenFound = true -}) { - let values; - const visited = new RefSet(); - while (dict instanceof Dict && !(dict.objId && visited.has(dict.objId))) { - if (dict.objId) { - visited.put(dict.objId); - } - const value = getArray ? dict.getArray(key) : dict.get(key); - if (value !== undefined) { - if (stopWhenFound) { - return value; - } - (values ||= []).push(value); - } - dict = dict.get("Parent"); - } - return values; -} -function getParentToUpdate(dict, ref, xref) { - const visited = new RefSet(); - const firstDict = dict; - const result = { - dict: null, - ref: null - }; - while (dict instanceof Dict && !visited.has(ref)) { - visited.put(ref); - if (dict.has("T")) { - break; - } - ref = dict.getRaw("Parent"); - if (!(ref instanceof Ref)) { - return result; - } - dict = xref.fetch(ref); - } - if (dict instanceof Dict && dict !== firstDict) { - result.dict = dict; - result.ref = ref; - } - return result; -} -const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; -function toRomanNumerals(number, lowerCase = false) { - assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); - const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10]; - return lowerCase ? roman.toLowerCase() : roman; -} -function log2(x) { - return x > 0 ? Math.ceil(Math.log2(x)) : 0; -} -function readInt8(data, offset) { - return data[offset] << 24 >> 24; -} -function readInt16(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16) >> 16; -} -function readUint16(data, offset) { - return data[offset] << 8 | data[offset + 1]; -} -function readUint32(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; -} -function isWhiteSpace(ch) { - return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; -} -function isBooleanArray(arr, len) { - return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); -} -function isNumberArray(arr, len) { - if (Array.isArray(arr)) { - return (len === null || arr.length === len) && arr.every(x => typeof x === "number"); - } - return ArrayBuffer.isView(arr) && !(arr instanceof BigInt64Array || arr instanceof BigUint64Array) && (len === null || arr.length === len); -} -function lookupMatrix(arr, fallback) { - return isNumberArray(arr, 6) ? arr : fallback; -} -function lookupRect(arr, fallback) { - return isNumberArray(arr, 4) ? arr : fallback; -} -function lookupNormalRect(arr, fallback) { - return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; -} -function parseXFAPath(path) { - const positionPattern = /(.+)\[(\d+)\]$/; - return path.split(".").map(component => { - const m = component.match(positionPattern); - if (m) { - return { - name: m[1], - pos: parseInt(m[2], 10) - }; - } - return { - name: component, - pos: 0 - }; - }); -} -function escapePDFName(str) { - const buffer = []; - let start = 0; - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.charCodeAt(i); - if (char < 0x21 || char > 0x7e || char === 0x23 || char === 0x28 || char === 0x29 || char === 0x3c || char === 0x3e || char === 0x5b || char === 0x5d || char === 0x7b || char === 0x7d || char === 0x2f || char === 0x25) { - if (start < i) { - buffer.push(str.substring(start, i)); - } - buffer.push(`#${char.toString(16)}`); - start = i + 1; - } - } - if (buffer.length === 0) { - return str; - } - if (start < str.length) { - buffer.push(str.substring(start, str.length)); - } - return buffer.join(""); -} -function escapeString(str) { - return str.replaceAll(/([()\\\n\r])/g, match => { - if (match === "\n") { - return "\\n"; - } else if (match === "\r") { - return "\\r"; - } - return `\\${match}`; - }); -} -function _collectJS(entry, xref, list, parents) { - if (!entry) { - return; - } - let parent = null; - if (entry instanceof Ref) { - if (parents.has(entry)) { - return; - } - parent = entry; - parents.put(parent); - entry = xref.fetch(entry); - } - if (Array.isArray(entry)) { - for (const element of entry) { - _collectJS(element, xref, list, parents); - } - } else if (entry instanceof Dict) { - if (isName(entry.get("S"), "JavaScript")) { - const js = entry.get("JS"); - let code; - if (js instanceof BaseStream) { - code = js.getString(); - } else if (typeof js === "string") { - code = js; - } - code &&= stringToPDFString(code, true).replaceAll("\x00", ""); - if (code) { - list.push(code.trim()); - } - } - _collectJS(entry.getRaw("Next"), xref, list, parents); - } - if (parent) { - parents.remove(parent); - } -} -function collectActions(xref, dict, eventType) { - const actions = Object.create(null); - const additionalActionsDicts = getInheritableProperty({ - dict, - key: "AA", - stopWhenFound: false - }); - if (additionalActionsDicts) { - for (let i = additionalActionsDicts.length - 1; i >= 0; i--) { - const additionalActions = additionalActionsDicts[i]; - if (!(additionalActions instanceof Dict)) { - continue; - } - for (const key of additionalActions.getKeys()) { - const action = eventType[key]; - if (!action) { - continue; - } - const actionDict = additionalActions.getRaw(key); - const parents = new RefSet(); - const list = []; - _collectJS(actionDict, xref, list, parents); - if (list.length > 0) { - actions[action] = list; - } - } - } - } - if (dict.has("A")) { - const actionDict = dict.get("A"); - const parents = new RefSet(); - const list = []; - _collectJS(actionDict, xref, list, parents); - if (list.length > 0) { - actions.Action = list; - } - } - return objectSize(actions) > 0 ? actions : null; -} -const XMLEntities = { - 0x3c: "<", - 0x3e: ">", - 0x26: "&", - 0x22: """, - 0x27: "'" -}; -function* codePointIter(str) { - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.codePointAt(i); - if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { - i++; - } - yield char; - } -} -function encodeToXmlString(str) { - const buffer = []; - let start = 0; - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.codePointAt(i); - if (0x20 <= char && char <= 0x7e) { - const entity = XMLEntities[char]; - if (entity) { - if (start < i) { - buffer.push(str.substring(start, i)); - } - buffer.push(entity); - start = i + 1; - } - } else { - if (start < i) { - buffer.push(str.substring(start, i)); - } - buffer.push(`&#x${char.toString(16).toUpperCase()};`); - if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) { - i++; - } - start = i + 1; - } - } - if (buffer.length === 0) { - return str; - } - if (start < str.length) { - buffer.push(str.substring(start, str.length)); - } - return buffer.join(""); -} -function validateFontName(fontFamily, mustWarn = false) { - const m = /^("|').*("|')$/.exec(fontFamily); - if (m && m[1] === m[2]) { - const re = new RegExp(`[^\\\\]${m[1]}`); - if (re.test(fontFamily.slice(1, -1))) { - if (mustWarn) { - warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`); - } - return false; - } - } else { - for (const ident of fontFamily.split(/[ \t]+/)) { - if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { - if (mustWarn) { - warn(`FontFamily contains invalid : ${fontFamily}.`); - } - return false; - } - } - } - return true; -} -function validateCSSFont(cssFontInfo) { - const DEFAULT_CSS_FONT_OBLIQUE = "14"; - const DEFAULT_CSS_FONT_WEIGHT = "400"; - const CSS_FONT_WEIGHT_VALUES = new Set(["100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "normal", "bold", "bolder", "lighter"]); - const { - fontFamily, - fontWeight, - italicAngle - } = cssFontInfo; - if (!validateFontName(fontFamily, true)) { - return false; - } - const weight = fontWeight ? fontWeight.toString() : ""; - cssFontInfo.fontWeight = CSS_FONT_WEIGHT_VALUES.has(weight) ? weight : DEFAULT_CSS_FONT_WEIGHT; - const angle = parseFloat(italicAngle); - cssFontInfo.italicAngle = isNaN(angle) || angle < -90 || angle > 90 ? DEFAULT_CSS_FONT_OBLIQUE : italicAngle.toString(); - return true; -} -function recoverJsURL(str) { - const URL_OPEN_METHODS = ["app.launchURL", "window.open", "xfa.host.gotoURL"]; - const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); - const jsUrl = regex.exec(str); - if (jsUrl?.[2]) { - return { - url: jsUrl[2], - newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" - }; - } - return null; -} -function numberToString(value) { - if (Number.isInteger(value)) { - return value.toString(); - } - const roundedValue = Math.round(value * 100); - if (roundedValue % 100 === 0) { - return (roundedValue / 100).toString(); - } - if (roundedValue % 10 === 0) { - return value.toFixed(1); - } - return value.toFixed(2); -} -function getNewAnnotationsMap(annotationStorage) { - if (!annotationStorage) { - return null; - } - const newAnnotationsByPage = new Map(); - for (const [key, value] of annotationStorage) { - if (!key.startsWith(AnnotationEditorPrefix)) { - continue; - } - let annotations = newAnnotationsByPage.get(value.pageIndex); - if (!annotations) { - annotations = []; - newAnnotationsByPage.set(value.pageIndex, annotations); - } - annotations.push(value); - } - return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; -} -function stringToAsciiOrUTF16BE(str) { - if (str === null || str === undefined) { - return str; - } - return isAscii(str) ? str : stringToUTF16String(str, true); -} -function isAscii(str) { - if (typeof str !== "string") { - return false; - } - return !str || /^[\x00-\x7F]*$/.test(str); -} -function stringToUTF16HexString(str) { - const buf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.charCodeAt(i); - buf.push(hexNumbers[char >> 8 & 0xff], hexNumbers[char & 0xff]); - } - return buf.join(""); -} -function stringToUTF16String(str, bigEndian = false) { - const buf = []; - if (bigEndian) { - buf.push("\xFE\xFF"); - } - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.charCodeAt(i); - buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); - } - return buf.join(""); -} -function getRotationMatrix(rotation, width, height) { - switch (rotation) { - case 90: - return [0, 1, -1, 0, width, 0]; - case 180: - return [-1, 0, 0, -1, width, height]; - case 270: - return [0, -1, 1, 0, 0, height]; - default: - throw new Error("Invalid rotation"); - } -} -function getSizeInBytes(x) { - return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); -} - -;// ./external/qcms/qcms_utils.js -class QCMS { - static #memoryArray = null; - static _memory = null; - static _mustAddAlpha = false; - static _destBuffer = null; - static _destOffset = 0; - static _destLength = 0; - static _cssColor = ""; - static _makeHexColor = null; - static get _memoryArray() { - const array = this.#memoryArray; - if (array?.byteLength) { - return array; - } - return this.#memoryArray = new Uint8Array(this._memory.buffer); - } -} -function copy_result(ptr, len) { - const { - _mustAddAlpha, - _destBuffer, - _destOffset, - _destLength, - _memoryArray - } = QCMS; - if (len === _destLength) { - _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset); - return; - } - if (_mustAddAlpha) { - for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { - _destBuffer[j] = _memoryArray[i]; - _destBuffer[j + 1] = _memoryArray[i + 1]; - _destBuffer[j + 2] = _memoryArray[i + 2]; - _destBuffer[j + 3] = 255; - } - } else { - for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { - _destBuffer[j] = _memoryArray[i]; - _destBuffer[j + 1] = _memoryArray[i + 1]; - _destBuffer[j + 2] = _memoryArray[i + 2]; - } - } -} -function copy_rgb(ptr) { - const { - _destBuffer, - _destOffset, - _memoryArray - } = QCMS; - _destBuffer[_destOffset] = _memoryArray[ptr]; - _destBuffer[_destOffset + 1] = _memoryArray[ptr + 1]; - _destBuffer[_destOffset + 2] = _memoryArray[ptr + 2]; -} -function make_cssRGB(ptr) { - const { - _memoryArray - } = QCMS; - QCMS._cssColor = QCMS._makeHexColor(_memoryArray[ptr], _memoryArray[ptr + 1], _memoryArray[ptr + 2]); -} - -;// ./external/qcms/qcms.js - -let wasm; -const cachedTextDecoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { - ignoreBOM: true, - fatal: true -}) : { - decode: () => { - throw Error('TextDecoder not available'); - } -}; -if (typeof TextDecoder !== 'undefined') { - cachedTextDecoder.decode(); -} -; -let cachedUint8ArrayMemory0 = null; -function getUint8ArrayMemory0() { - if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { - cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8ArrayMemory0; -} -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); -} -let WASM_VECTOR_LEN = 0; -function passArray8ToWasm0(arg, malloc) { - const ptr = malloc(arg.length * 1, 1) >>> 0; - getUint8ArrayMemory0().set(arg, ptr / 1); - WASM_VECTOR_LEN = arg.length; - return ptr; -} -function qcms_convert_array(transformer, src) { - const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - wasm.qcms_convert_array(transformer, ptr0, len0); -} -function qcms_convert_one(transformer, src, css) { - wasm.qcms_convert_one(transformer, src, css); -} -function qcms_convert_three(transformer, src1, src2, src3, css) { - wasm.qcms_convert_three(transformer, src1, src2, src3, css); -} -function qcms_convert_four(transformer, src1, src2, src3, src4, css) { - wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css); -} -function qcms_transformer_from_memory(mem, in_type, intent) { - const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent); - return ret >>> 0; -} -function qcms_drop_transformer(transformer) { - wasm.qcms_drop_transformer(transformer); -} -const DataType = Object.freeze({ - RGB8: 0, - "0": "RGB8", - RGBA8: 1, - "1": "RGBA8", - BGRA8: 2, - "2": "BGRA8", - Gray8: 3, - "3": "Gray8", - GrayA8: 4, - "4": "GrayA8", - CMYK: 5, - "5": "CMYK" -}); -const Intent = Object.freeze({ - Perceptual: 0, - "0": "Perceptual", - RelativeColorimetric: 1, - "1": "RelativeColorimetric", - Saturation: 2, - "2": "Saturation", - AbsoluteColorimetric: 3, - "3": "AbsoluteColorimetric" -}); -async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - } else { - throw e; - } - } - } - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - } else { - const instance = await WebAssembly.instantiate(module, imports); - if (instance instanceof WebAssembly.Instance) { - return { - instance, - module - }; - } else { - return instance; - } - } -} -function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbg_copyresult_b08ee7d273f295dd = function (arg0, arg1) { - copy_result(arg0 >>> 0, arg1 >>> 0); - }; - imports.wbg.__wbg_copyrgb_d60ce17bb05d9b67 = function (arg0) { - copy_rgb(arg0 >>> 0); - }; - imports.wbg.__wbg_makecssRGB_893bf0cd9fdb302d = function (arg0) { - make_cssRGB(arg0 >>> 0); - }; - imports.wbg.__wbindgen_init_externref_table = function () { - const table = wasm.__wbindgen_export_0; - const offset = table.grow(4); - table.set(0, undefined); - table.set(offset + 0, undefined); - table.set(offset + 1, null); - table.set(offset + 2, true); - table.set(offset + 3, false); - }; - imports.wbg.__wbindgen_throw = function (arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - return imports; -} -function __wbg_init_memory(imports, memory) {} -function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedUint8ArrayMemory0 = null; - wasm.__wbindgen_start(); - return wasm; -} -function initSync(module) { - if (wasm !== undefined) return wasm; - if (typeof module !== 'undefined') { - if (Object.getPrototypeOf(module) === Object.prototype) { - ({ - module - } = module); - } else { - console.warn('using deprecated parameters for `initSync()`; pass a single object instead'); - } - } - const imports = __wbg_get_imports(); - __wbg_init_memory(imports); - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - const instance = new WebAssembly.Instance(module, imports); - return __wbg_finalize_init(instance, module); -} -async function __wbg_init(module_or_path) { - if (wasm !== undefined) return wasm; - if (typeof module_or_path !== 'undefined') { - if (Object.getPrototypeOf(module_or_path) === Object.prototype) { - ({ - module_or_path - } = module_or_path); - } else { - console.warn('using deprecated parameters for the initialization function; pass a single object instead'); - } - } - const imports = __wbg_get_imports(); - if (typeof module_or_path === 'string' || typeof Request === 'function' && module_or_path instanceof Request || typeof URL === 'function' && module_or_path instanceof URL) { - module_or_path = fetch(module_or_path); - } - __wbg_init_memory(imports); - const { - instance, - module - } = await __wbg_load(await module_or_path, imports); - return __wbg_finalize_init(instance, module); -} - -/* harmony default export */ const qcms = ((/* unused pure expression or super */ null && (__wbg_init))); -;// ./src/core/colorspace.js - - -function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) { - const COMPONENTS = 3; - alpha01 = alpha01 !== 1 ? 0 : alpha01; - const xRatio = w1 / w2; - const yRatio = h1 / h2; - let newIndex = 0, - oldIndex; - const xScaled = new Uint16Array(w2); - const w1Scanline = w1 * COMPONENTS; - for (let i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; - } - for (let i = 0; i < h2; i++) { - const py = Math.floor(i * yRatio) * w1Scanline; - for (let j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex++]; - dest[newIndex++] = src[oldIndex++]; - dest[newIndex++] = src[oldIndex++]; - newIndex += alpha01; - } - } -} -function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { - const xRatio = w1 / w2; - const yRatio = h1 / h2; - let newIndex = 0; - const xScaled = new Uint16Array(w2); - if (alpha01 === 1) { - for (let i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio); - } - const src32 = new Uint32Array(src.buffer); - const dest32 = new Uint32Array(dest.buffer); - const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; - for (let i = 0; i < h2; i++) { - const buf = src32.subarray(Math.floor(i * yRatio) * w1); - for (let j = 0; j < w2; j++) { - dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; - } - } - } else { - const COMPONENTS = 4; - const w1Scanline = w1 * COMPONENTS; - for (let i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; - } - for (let i = 0; i < h2; i++) { - const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); - for (let j = 0; j < w2; j++) { - const oldIndex = xScaled[j]; - dest[newIndex++] = buf[oldIndex]; - dest[newIndex++] = buf[oldIndex + 1]; - dest[newIndex++] = buf[oldIndex + 2]; - } - } - } -} -function copyRgbaImage(src, dest, alpha01) { - if (alpha01 === 1) { - const src32 = new Uint32Array(src.buffer); - const dest32 = new Uint32Array(dest.buffer); - const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; - for (let i = 0, ii = src32.length; i < ii; i++) { - dest32[i] |= src32[i] & rgbMask; - } - } else { - let j = 0; - for (let i = 0, ii = src.length; i < ii; i += 4) { - dest[j++] = src[i]; - dest[j++] = src[i + 1]; - dest[j++] = src[i + 2]; - } - } -} -class ColorSpace { - static #rgbBuf = new Uint8ClampedArray(3); - constructor(name, numComps) { - this.name = name; - this.numComps = numComps; - } - getRgb(src, srcOffset, output = new Uint8ClampedArray(3)) { - this.getRgbItem(src, srcOffset, output, 0); - return output; - } - getRgbHex(src, srcOffset) { - const buffer = this.getRgb(src, srcOffset, ColorSpace.#rgbBuf); - return Util.makeHexColor(buffer[0], buffer[1], buffer[2]); - } - getRgbItem(src, srcOffset, dest, destOffset) { - unreachable("Should not call ColorSpace.getRgbItem"); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - unreachable("Should not call ColorSpace.getRgbBuffer"); - } - getOutputLength(inputLength, alpha01) { - unreachable("Should not call ColorSpace.getOutputLength"); - } - isPassthrough(bits) { - return false; - } - isDefaultDecode(decodeMap, bpc) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { - const count = originalWidth * originalHeight; - let rgbBuf = null; - const numComponentColors = 1 << bpc; - const needsResizing = originalHeight !== height || originalWidth !== width; - if (this.isPassthrough(bpc)) { - rgbBuf = comps; - } else if (this.numComps === 1 && count > numComponentColors && this.name !== "DeviceGray" && this.name !== "DeviceRGB") { - const allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); - for (let i = 0; i < numComponentColors; i++) { - allColors[i] = i; - } - const colorMap = new Uint8ClampedArray(numComponentColors * 3); - this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); - if (!needsResizing) { - let destPos = 0; - for (let i = 0; i < count; ++i) { - const key = comps[i] * 3; - dest[destPos++] = colorMap[key]; - dest[destPos++] = colorMap[key + 1]; - dest[destPos++] = colorMap[key + 2]; - destPos += alpha01; - } - } else { - rgbBuf = new Uint8Array(count * 3); - let rgbPos = 0; - for (let i = 0; i < count; ++i) { - const key = comps[i] * 3; - rgbBuf[rgbPos++] = colorMap[key]; - rgbBuf[rgbPos++] = colorMap[key + 1]; - rgbBuf[rgbPos++] = colorMap[key + 2]; - } - } - } else if (!needsResizing) { - this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); - } else { - rgbBuf = new Uint8ClampedArray(count * 3); - this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); - } - if (rgbBuf) { - if (needsResizing) { - resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01); - } else { - let destPos = 0, - rgbPos = 0; - for (let i = 0, ii = width * actualHeight; i < ii; i++) { - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - destPos += alpha01; - } - } - } - } - get usesZeroToOneRange() { - return shadow(this, "usesZeroToOneRange", true); - } - static isDefaultDecode(decode, numComps) { - if (!Array.isArray(decode)) { - return true; - } - if (numComps * 2 !== decode.length) { - warn("The decode map is not the correct length"); - return true; - } - for (let i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] !== 0 || decode[i + 1] !== 1) { - return false; - } - } - return true; - } -} -class AlternateCS extends ColorSpace { - constructor(numComps, base, tintFn) { - super("Alternate", numComps); - this.base = base; - this.tintFn = tintFn; - this.tmpBuf = new Float32Array(base.numComps); - } - getRgbItem(src, srcOffset, dest, destOffset) { - const tmpBuf = this.tmpBuf; - this.tintFn(src, srcOffset, tmpBuf, 0); - this.base.getRgbItem(tmpBuf, 0, dest, destOffset); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const tintFn = this.tintFn; - const base = this.base; - const scale = 1 / ((1 << bits) - 1); - const baseNumComps = base.numComps; - const usesZeroToOneRange = base.usesZeroToOneRange; - const isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; - let pos = isPassthrough ? destOffset : 0; - const baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count); - const numComps = this.numComps; - const scaled = new Float32Array(numComps); - const tinted = new Float32Array(baseNumComps); - let i, j; - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - if (usesZeroToOneRange) { - for (j = 0; j < baseNumComps; j++) { - baseBuf[pos++] = tinted[j] * 255; - } - } else { - base.getRgbItem(tinted, 0, baseBuf, pos); - pos += baseNumComps; - } - } - if (!isPassthrough) { - base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); - } - } - getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); - } -} -class PatternCS extends ColorSpace { - constructor(baseCS) { - super("Pattern", null); - this.base = baseCS; - } - isDefaultDecode(decodeMap, bpc) { - unreachable("Should not call PatternCS.isDefaultDecode"); - } -} -class IndexedCS extends ColorSpace { - constructor(base, highVal, lookup) { - super("Indexed", 1); - this.base = base; - this.highVal = highVal; - const length = base.numComps * (highVal + 1); - this.lookup = new Uint8Array(length); - if (lookup instanceof BaseStream) { - const bytes = lookup.getBytes(length); - this.lookup.set(bytes); - } else if (typeof lookup === "string") { - for (let i = 0; i < length; ++i) { - this.lookup[i] = lookup.charCodeAt(i) & 0xff; - } - } else { - throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`); - } - } - getRgbItem(src, srcOffset, dest, destOffset) { - const { - base, - highVal, - lookup - } = this; - const start = MathClamp(Math.round(src[srcOffset]), 0, highVal) * base.numComps; - base.getRgbBuffer(lookup, start, 1, dest, destOffset, 8, 0); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const { - base, - highVal, - lookup - } = this; - const { - numComps - } = base; - const outputDelta = base.getOutputLength(numComps, alpha01); - for (let i = 0; i < count; ++i) { - const lookupPos = MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps; - base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); - destOffset += outputDelta; - } - } - getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); - } - isDefaultDecode(decodeMap, bpc) { - if (!Array.isArray(decodeMap)) { - return true; - } - if (decodeMap.length !== 2) { - warn("Decode map length is not correct"); - return true; - } - if (!Number.isInteger(bpc) || bpc < 1) { - warn("Bits per component is not correct"); - return true; - } - return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; - } -} -class DeviceGrayCS extends ColorSpace { - constructor() { - super("DeviceGray", 1); - } - getRgbItem(src, srcOffset, dest, destOffset) { - const c = src[srcOffset] * 255; - dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const scale = 255 / ((1 << bits) - 1); - let j = srcOffset, - q = destOffset; - for (let i = 0; i < count; ++i) { - const c = scale * src[j++]; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; - q += alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - } -} -class DeviceRgbCS extends ColorSpace { - constructor() { - super("DeviceRGB", 3); - } - getRgbItem(src, srcOffset, dest, destOffset) { - dest[destOffset] = src[srcOffset] * 255; - dest[destOffset + 1] = src[srcOffset + 1] * 255; - dest[destOffset + 2] = src[srcOffset + 2] * 255; - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - if (bits === 8 && alpha01 === 0) { - dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); - return; - } - const scale = 255 / ((1 << bits) - 1); - let j = srcOffset, - q = destOffset; - for (let i = 0; i < count; ++i) { - dest[q++] = scale * src[j++]; - dest[q++] = scale * src[j++]; - dest[q++] = scale * src[j++]; - q += alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01) / 3 | 0; - } - isPassthrough(bits) { - return bits === 8; - } -} -class DeviceRgbaCS extends ColorSpace { - constructor() { - super("DeviceRGBA", 4); - } - getOutputLength(inputLength, _alpha01) { - return inputLength * 4; - } - isPassthrough(bits) { - return bits === 8; - } - fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { - if (originalHeight !== height || originalWidth !== width) { - resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01); - } else { - copyRgbaImage(comps, dest, alpha01); - } - } -} -class DeviceCmykCS extends ColorSpace { - constructor() { - super("DeviceCMYK", 4); - } - #toRgb(src, srcOffset, srcScale, dest, destOffset) { - const c = src[srcOffset] * srcScale; - const m = src[srcOffset + 1] * srcScale; - const y = src[srcOffset + 2] * srcScale; - const k = src[srcOffset + 3] * srcScale; - dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747); - dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578); - dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367); - } - getRgbItem(src, srcOffset, dest, destOffset) { - this.#toRgb(src, srcOffset, 1, dest, destOffset); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const scale = 1 / ((1 << bits) - 1); - for (let i = 0; i < count; i++) { - this.#toRgb(src, srcOffset, scale, dest, destOffset); - srcOffset += 4; - destOffset += 3 + alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength / 4 * (3 + alpha01) | 0; - } -} -class CalGrayCS extends ColorSpace { - constructor(whitePoint, blackPoint, gamma) { - super("CalGray", 1); - if (!whitePoint) { - throw new FormatError("WhitePoint missing - required for color space CalGray"); - } - [this.XW, this.YW, this.ZW] = whitePoint; - [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; - this.G = gamma || 1; - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); - } - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info(`Invalid BlackPoint for ${this.name}, falling back to default.`); - this.XB = this.YB = this.ZB = 0; - } - if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` + `ZB: ${this.ZB}, only default values are supported.`); - } - if (this.G < 1) { - info(`Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`); - this.G = 1; - } - } - #toRgb(src, srcOffset, dest, destOffset, scale) { - const A = src[srcOffset] * scale; - const AG = A ** this.G; - const L = this.YW * AG; - const val = Math.max(295.8 * L ** 0.3333333333333333 - 40.8, 0); - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - getRgbItem(src, srcOffset, dest, destOffset) { - this.#toRgb(src, srcOffset, dest, destOffset, 1); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const scale = 1 / ((1 << bits) - 1); - for (let i = 0; i < count; ++i) { - this.#toRgb(src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - } -} -class CalRGBCS extends ColorSpace { - static #BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]); - static #BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]); - static #SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]); - static #FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - static #tempNormalizeMatrix = new Float32Array(3); - static #tempConvertMatrix1 = new Float32Array(3); - static #tempConvertMatrix2 = new Float32Array(3); - static #DECODE_L_CONSTANT = ((8 + 16) / 116) ** 3 / 8.0; - constructor(whitePoint, blackPoint, gamma, matrix) { - super("CalRGB", 3); - if (!whitePoint) { - throw new FormatError("WhitePoint missing - required for color space CalRGB"); - } - const [XW, YW, ZW] = this.whitePoint = whitePoint; - const [XB, YB, ZB] = this.blackPoint = blackPoint || new Float32Array(3); - [this.GR, this.GG, this.GB] = gamma || new Float32Array([1, 1, 1]); - [this.MXA, this.MYA, this.MZA, this.MXB, this.MYB, this.MZB, this.MXC, this.MYC, this.MZC] = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - if (XW < 0 || ZW < 0 || YW !== 1) { - throw new FormatError(`Invalid WhitePoint components for ${this.name}, no fallback available`); - } - if (XB < 0 || YB < 0 || ZB < 0) { - info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` + "falling back to default."); - this.blackPoint = new Float32Array(3); - } - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` + `${this.name}, falling back to default.`); - this.GR = this.GG = this.GB = 1; - } - } - #matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - #toFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - #toD65(sourceWhitePoint, LMS, result) { - const D65X = 0.95047; - const D65Y = 1; - const D65Z = 1.08883; - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - #sRGBTransferFunction(color) { - if (color <= 0.0031308) { - return MathClamp(12.92 * color, 0, 1); - } - if (color >= 0.99554525) { - return 1; - } - return MathClamp((1 + 0.055) * color ** (1 / 2.4) - 0.055, 0, 1); - } - #decodeL(L) { - if (L < 0) { - return -this.#decodeL(-L); - } - if (L > 8.0) { - return ((L + 16) / 116) ** 3; - } - return L * CalRGBCS.#DECODE_L_CONSTANT; - } - #compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - const zeroDecodeL = this.#decodeL(0); - const X_DST = zeroDecodeL; - const X_SRC = this.#decodeL(sourceBlackPoint[0]); - const Y_DST = zeroDecodeL; - const Y_SRC = this.#decodeL(sourceBlackPoint[1]); - const Z_DST = zeroDecodeL; - const Z_SRC = this.#decodeL(sourceBlackPoint[2]); - const X_Scale = (1 - X_DST) / (1 - X_SRC); - const X_Offset = 1 - X_Scale; - const Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - const Y_Offset = 1 - Y_Scale; - const Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - const Z_Offset = 1 - Z_Scale; - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - #normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - const LMS = result; - this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - const LMS_Flat = CalRGBCS.#tempNormalizeMatrix; - this.#toFlat(sourceWhitePoint, LMS, LMS_Flat); - this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - #normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - const LMS = result; - this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - const LMS_D65 = CalRGBCS.#tempNormalizeMatrix; - this.#toD65(sourceWhitePoint, LMS, LMS_D65); - this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - #toRgb(src, srcOffset, dest, destOffset, scale) { - const A = MathClamp(src[srcOffset] * scale, 0, 1); - const B = MathClamp(src[srcOffset + 1] * scale, 0, 1); - const C = MathClamp(src[srcOffset + 2] * scale, 0, 1); - const AGR = A === 1 ? 1 : A ** this.GR; - const BGG = B === 1 ? 1 : B ** this.GG; - const CGB = C === 1 ? 1 : C ** this.GB; - const X = this.MXA * AGR + this.MXB * BGG + this.MXC * CGB; - const Y = this.MYA * AGR + this.MYB * BGG + this.MYC * CGB; - const Z = this.MZA * AGR + this.MZB * BGG + this.MZC * CGB; - const XYZ = CalRGBCS.#tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - const XYZ_Flat = CalRGBCS.#tempConvertMatrix2; - this.#normalizeWhitePointToFlat(this.whitePoint, XYZ, XYZ_Flat); - const XYZ_Black = CalRGBCS.#tempConvertMatrix1; - this.#compensateBlackPoint(this.blackPoint, XYZ_Flat, XYZ_Black); - const XYZ_D65 = CalRGBCS.#tempConvertMatrix2; - this.#normalizeWhitePointToD65(CalRGBCS.#FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - const SRGB = CalRGBCS.#tempConvertMatrix1; - this.#matrixProduct(CalRGBCS.#SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - dest[destOffset] = this.#sRGBTransferFunction(SRGB[0]) * 255; - dest[destOffset + 1] = this.#sRGBTransferFunction(SRGB[1]) * 255; - dest[destOffset + 2] = this.#sRGBTransferFunction(SRGB[2]) * 255; - } - getRgbItem(src, srcOffset, dest, destOffset) { - this.#toRgb(src, srcOffset, dest, destOffset, 1); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const scale = 1 / ((1 << bits) - 1); - for (let i = 0; i < count; ++i) { - this.#toRgb(src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01) / 3 | 0; - } -} -class LabCS extends ColorSpace { - constructor(whitePoint, blackPoint, range) { - super("Lab", 3); - if (!whitePoint) { - throw new FormatError("WhitePoint missing - required for color space Lab"); - } - [this.XW, this.YW, this.ZW] = whitePoint; - [this.amin, this.amax, this.bmin, this.bmax] = range || [-100, 100, -100, 100]; - [this.XB, this.YB, this.ZB] = blackPoint || [0, 0, 0]; - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - throw new FormatError("Invalid WhitePoint components, no fallback available"); - } - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info("Invalid BlackPoint, falling back to default"); - this.XB = this.YB = this.ZB = 0; - } - if (this.amin > this.amax || this.bmin > this.bmax) { - info("Invalid Range, falling back to defaults"); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - #fn_g(x) { - return x >= 6 / 29 ? x ** 3 : 108 / 841 * (x - 4 / 29); - } - #decode(value, high1, low2, high2) { - return low2 + value * (high2 - low2) / high1; - } - #toRgb(src, srcOffset, maxVal, dest, destOffset) { - let Ls = src[srcOffset]; - let as = src[srcOffset + 1]; - let bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = this.#decode(Ls, maxVal, 0, 100); - as = this.#decode(as, maxVal, this.amin, this.amax); - bs = this.#decode(bs, maxVal, this.bmin, this.bmax); - } - if (as > this.amax) { - as = this.amax; - } else if (as < this.amin) { - as = this.amin; - } - if (bs > this.bmax) { - bs = this.bmax; - } else if (bs < this.bmin) { - bs = this.bmin; - } - const M = (Ls + 16) / 116; - const L = M + as / 500; - const N = M - bs / 200; - const X = this.XW * this.#fn_g(L); - const Y = this.YW * this.#fn_g(M); - const Z = this.ZW * this.#fn_g(N); - let r, g, b; - if (this.ZW < 1) { - r = X * 3.1339 + Y * -1.617 + Z * -0.4906; - g = X * -0.9785 + Y * 1.916 + Z * 0.0333; - b = X * 0.072 + Y * -0.229 + Z * 1.4057; - } else { - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.204 + Z * 1.057; - } - dest[destOffset] = Math.sqrt(r) * 255; - dest[destOffset + 1] = Math.sqrt(g) * 255; - dest[destOffset + 2] = Math.sqrt(b) * 255; - } - getRgbItem(src, srcOffset, dest, destOffset) { - this.#toRgb(src, srcOffset, false, dest, destOffset); - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const maxVal = (1 << bits) - 1; - for (let i = 0; i < count; i++) { - this.#toRgb(src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - } - getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01) / 3 | 0; - } - isDefaultDecode(decodeMap, bpc) { - return true; - } - get usesZeroToOneRange() { - return shadow(this, "usesZeroToOneRange", false); - } -} - -;// ./src/core/icc_colorspace.js - - - - -function fetchSync(url) { - const xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return xhr.response; -} -class IccColorSpace extends ColorSpace { - #transformer; - #convertPixel; - static #useWasm = true; - static #wasmUrl = null; - static #finalizer = new FinalizationRegistry(transformer => { - qcms_drop_transformer(transformer); - }); - constructor(iccProfile, name, numComps) { - if (!IccColorSpace.isUsable) { - throw new Error("No ICC color space support"); - } - super(name, numComps); - let inType; - switch (numComps) { - case 1: - inType = DataType.Gray8; - this.#convertPixel = (src, srcOffset, css) => qcms_convert_one(this.#transformer, src[srcOffset] * 255, css); - break; - case 3: - inType = DataType.RGB8; - this.#convertPixel = (src, srcOffset, css) => qcms_convert_three(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, css); - break; - case 4: - inType = DataType.CMYK; - this.#convertPixel = (src, srcOffset, css) => qcms_convert_four(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, src[srcOffset + 3] * 255, css); - break; - default: - throw new Error(`Unsupported number of components: ${numComps}`); - } - this.#transformer = qcms_transformer_from_memory(iccProfile, inType, Intent.Perceptual); - if (!this.#transformer) { - throw new Error("Failed to create ICC color space"); - } - IccColorSpace.#finalizer.register(this, this.#transformer); - } - getRgbHex(src, srcOffset) { - this.#convertPixel(src, srcOffset, true); - return QCMS._cssColor; - } - getRgbItem(src, srcOffset, dest, destOffset) { - QCMS._destBuffer = dest; - QCMS._destOffset = destOffset; - QCMS._destLength = 3; - this.#convertPixel(src, srcOffset, false); - QCMS._destBuffer = null; - } - getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - src = src.subarray(srcOffset, srcOffset + count * this.numComps); - if (bits !== 8) { - const scale = 255 / ((1 << bits) - 1); - for (let i = 0, ii = src.length; i < ii; i++) { - src[i] *= scale; - } - } - QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer; - QCMS._destBuffer = dest; - QCMS._destOffset = destOffset; - QCMS._destLength = count * (3 + alpha01); - qcms_convert_array(this.#transformer, src); - QCMS._mustAddAlpha = false; - QCMS._destBuffer = null; - } - getOutputLength(inputLength, alpha01) { - return inputLength / this.numComps * (3 + alpha01) | 0; - } - static setOptions({ - useWasm, - useWorkerFetch, - wasmUrl - }) { - if (!useWorkerFetch) { - this.#useWasm = false; - return; - } - this.#useWasm = useWasm; - this.#wasmUrl = wasmUrl; - } - static get isUsable() { - let isUsable = false; - if (this.#useWasm) { - if (this.#wasmUrl) { - try { - this._module = initSync({ - module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`) - }); - isUsable = !!this._module; - QCMS._memory = this._module.memory; - QCMS._makeHexColor = Util.makeHexColor; - } catch (e) { - warn(`ICCBased color space: "${e}".`); - } - } else { - warn("No ICC color space support due to missing `wasmUrl` API option"); - } - } - return shadow(this, "isUsable", isUsable); - } -} -class CmykICCBasedCS extends IccColorSpace { - static #iccUrl; - constructor() { - const iccProfile = new Uint8Array(fetchSync(`${CmykICCBasedCS.#iccUrl}CGATS001Compat-v2-micro.icc`)); - super(iccProfile, "DeviceCMYK", 4); - } - static setOptions({ - iccUrl - }) { - this.#iccUrl = iccUrl; - } - static get isUsable() { - let isUsable = false; - if (IccColorSpace.isUsable) { - if (this.#iccUrl) { - isUsable = true; - } else { - warn("No CMYK ICC profile support due to missing `iccUrl` API option"); - } - } - return shadow(this, "isUsable", isUsable); - } -} - -;// ./src/core/stream.js - - -class Stream extends BaseStream { - constructor(arrayBuffer, start, length, dict) { - super(); - this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); - this.start = start || 0; - this.pos = this.start; - this.end = start + length || this.bytes.length; - this.dict = dict; - } - get length() { - return this.end - this.start; - } - get isEmpty() { - return this.length === 0; - } - getByte() { - if (this.pos >= this.end) { - return -1; - } - return this.bytes[this.pos++]; - } - getBytes(length) { - const bytes = this.bytes; - const pos = this.pos; - const strEnd = this.end; - if (!length) { - return bytes.subarray(pos, strEnd); - } - let end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); - } - getByteRange(begin, end) { - if (begin < 0) { - begin = 0; - } - if (end > this.end) { - end = this.end; - } - return this.bytes.subarray(begin, end); - } - reset() { - this.pos = this.start; - } - moveStart() { - this.start = this.pos; - } - makeSubStream(start, length, dict = null) { - return new Stream(this.bytes.buffer, start, length, dict); - } -} -class StringStream extends Stream { - constructor(str) { - super(stringToBytes(str)); - } -} -class NullStream extends Stream { - constructor() { - super(new Uint8Array(0)); - } -} - -;// ./src/core/chunked_stream.js - - - -class ChunkedStream extends Stream { - constructor(length, chunkSize, manager) { - super(new Uint8Array(length), 0, length, null); - this.chunkSize = chunkSize; - this._loadedChunks = new Set(); - this.numChunks = Math.ceil(length / chunkSize); - this.manager = manager; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; - } - getMissingChunks() { - const chunks = []; - for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - chunks.push(chunk); - } - } - return chunks; - } - get numChunksLoaded() { - return this._loadedChunks.size; - } - get isDataLoaded() { - return this.numChunksLoaded === this.numChunks; - } - onReceiveData(begin, chunk) { - const chunkSize = this.chunkSize; - if (begin % chunkSize !== 0) { - throw new Error(`Bad begin offset: ${begin}`); - } - const end = begin + chunk.byteLength; - if (end % chunkSize !== 0 && end !== this.bytes.length) { - throw new Error(`Bad end offset: ${end}`); - } - this.bytes.set(new Uint8Array(chunk), begin); - const beginChunk = Math.floor(begin / chunkSize); - const endChunk = Math.floor((end - 1) / chunkSize) + 1; - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - this._loadedChunks.add(curChunk); - } - } - onReceiveProgressiveData(data) { - let position = this.progressiveDataLength; - const beginChunk = Math.floor(position / this.chunkSize); - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - this._loadedChunks.add(curChunk); - } - } - ensureByte(pos) { - if (pos < this.progressiveDataLength) { - return; - } - const chunk = Math.floor(pos / this.chunkSize); - if (chunk > this.numChunks) { - return; - } - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - if (!this._loadedChunks.has(chunk)) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - } - ensureRange(begin, end) { - if (begin >= end) { - return; - } - if (end <= this.progressiveDataLength) { - return; - } - const beginChunk = Math.floor(begin / this.chunkSize); - if (beginChunk > this.numChunks) { - return; - } - const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - throw new MissingDataException(begin, end); - } - } - } - nextEmptyChunk(beginChunk) { - const numChunks = this.numChunks; - for (let i = 0; i < numChunks; ++i) { - const chunk = (beginChunk + i) % numChunks; - if (!this._loadedChunks.has(chunk)) { - return chunk; - } - } - return null; - } - hasChunk(chunk) { - return this._loadedChunks.has(chunk); - } - getByte() { - const pos = this.pos; - if (pos >= this.end) { - return -1; - } - if (pos >= this.progressiveDataLength) { - this.ensureByte(pos); - } - return this.bytes[this.pos++]; - } - getBytes(length) { - const bytes = this.bytes; - const pos = this.pos; - const strEnd = this.end; - if (!length) { - if (strEnd > this.progressiveDataLength) { - this.ensureRange(pos, strEnd); - } - return bytes.subarray(pos, strEnd); - } - let end = pos + length; - if (end > strEnd) { - end = strEnd; - } - if (end > this.progressiveDataLength) { - this.ensureRange(pos, end); - } - this.pos = end; - return bytes.subarray(pos, end); - } - getByteRange(begin, end) { - if (begin < 0) { - begin = 0; - } - if (end > this.end) { - end = this.end; - } - if (end > this.progressiveDataLength) { - this.ensureRange(begin, end); - } - return this.bytes.subarray(begin, end); - } - makeSubStream(start, length, dict = null) { - if (length) { - if (start + length > this.progressiveDataLength) { - this.ensureRange(start, start + length); - } - } else if (start >= this.progressiveDataLength) { - this.ensureByte(start); - } - function ChunkedStreamSubstream() {} - ChunkedStreamSubstream.prototype = Object.create(this); - ChunkedStreamSubstream.prototype.getMissingChunks = function () { - const chunkSize = this.chunkSize; - const beginChunk = Math.floor(this.start / chunkSize); - const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; - const missingChunks = []; - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - missingChunks.push(chunk); - } - } - return missingChunks; - }; - Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { - get() { - if (this.numChunksLoaded === this.numChunks) { - return true; - } - return this.getMissingChunks().length === 0; - }, - configurable: true - }); - const subStream = new ChunkedStreamSubstream(); - subStream.pos = subStream.start = start; - subStream.end = start + length || this.end; - subStream.dict = dict; - return subStream; - } - getBaseStreams() { - return [this]; - } -} -class ChunkedStreamManager { - constructor(pdfNetworkStream, args) { - this.length = args.length; - this.chunkSize = args.rangeChunkSize; - this.stream = new ChunkedStream(this.length, this.chunkSize, this); - this.pdfNetworkStream = pdfNetworkStream; - this.disableAutoFetch = args.disableAutoFetch; - this.msgHandler = args.msgHandler; - this.currRequestId = 0; - this._chunksNeededByRequest = new Map(); - this._requestsByChunk = new Map(); - this._promisesByRequest = new Map(); - this.progressiveDataLength = 0; - this.aborted = false; - this._loadedStreamCapability = Promise.withResolvers(); - } - sendRequest(begin, end) { - const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); - if (!rangeReader.isStreamingSupported) { - rangeReader.onProgress = this.onProgress.bind(this); - } - let chunks = [], - loaded = 0; - return new Promise((resolve, reject) => { - const readChunk = ({ - value, - done - }) => { - try { - if (done) { - const chunkData = arrayBuffersToBytes(chunks); - chunks = null; - resolve(chunkData); - return; - } - loaded += value.byteLength; - if (rangeReader.isStreamingSupported) { - this.onProgress({ - loaded - }); - } - chunks.push(value); - rangeReader.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - rangeReader.read().then(readChunk, reject); - }).then(data => { - if (this.aborted) { - return; - } - this.onReceiveData({ - chunk: data, - begin - }); - }); - } - requestAllChunks(noFetch = false) { - if (!noFetch) { - const missingChunks = this.stream.getMissingChunks(); - this._requestChunks(missingChunks); - } - return this._loadedStreamCapability.promise; - } - _requestChunks(chunks) { - const requestId = this.currRequestId++; - const chunksNeeded = new Set(); - this._chunksNeededByRequest.set(requestId, chunksNeeded); - for (const chunk of chunks) { - if (!this.stream.hasChunk(chunk)) { - chunksNeeded.add(chunk); - } - } - if (chunksNeeded.size === 0) { - return Promise.resolve(); - } - const capability = Promise.withResolvers(); - this._promisesByRequest.set(requestId, capability); - const chunksToRequest = []; - for (const chunk of chunksNeeded) { - let requestIds = this._requestsByChunk.get(chunk); - if (!requestIds) { - requestIds = []; - this._requestsByChunk.set(chunk, requestIds); - chunksToRequest.push(chunk); - } - requestIds.push(requestId); - } - if (chunksToRequest.length > 0) { - const groupedChunksToRequest = this.groupChunks(chunksToRequest); - for (const groupedChunk of groupedChunksToRequest) { - const begin = groupedChunk.beginChunk * this.chunkSize; - const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); - this.sendRequest(begin, end).catch(capability.reject); - } - } - return capability.promise.catch(reason => { - if (this.aborted) { - return; - } - throw reason; - }); - } - getStream() { - return this.stream; - } - requestRange(begin, end) { - end = Math.min(end, this.length); - const beginChunk = this.getBeginChunk(begin); - const endChunk = this.getEndChunk(end); - const chunks = []; - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - chunks.push(chunk); - } - return this._requestChunks(chunks); - } - requestRanges(ranges = []) { - const chunksToRequest = []; - for (const range of ranges) { - const beginChunk = this.getBeginChunk(range.begin); - const endChunk = this.getEndChunk(range.end); - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!chunksToRequest.includes(chunk)) { - chunksToRequest.push(chunk); - } - } - } - chunksToRequest.sort((a, b) => a - b); - return this._requestChunks(chunksToRequest); - } - groupChunks(chunks) { - const groupedChunks = []; - let beginChunk = -1; - let prevChunk = -1; - for (let i = 0, ii = chunks.length; i < ii; ++i) { - const chunk = chunks[i]; - if (beginChunk < 0) { - beginChunk = chunk; - } - if (prevChunk >= 0 && prevChunk + 1 !== chunk) { - groupedChunks.push({ - beginChunk, - endChunk: prevChunk + 1 - }); - beginChunk = chunk; - } - if (i + 1 === chunks.length) { - groupedChunks.push({ - beginChunk, - endChunk: chunk + 1 - }); - } - prevChunk = chunk; - } - return groupedChunks; - } - onProgress(args) { - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, - total: this.length - }); - } - onReceiveData(args) { - const chunk = args.chunk; - const isProgressive = args.begin === undefined; - const begin = isProgressive ? this.progressiveDataLength : args.begin; - const end = begin + chunk.byteLength; - const beginChunk = Math.floor(begin / this.chunkSize); - const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; - } else { - this.stream.onReceiveData(begin, chunk); - } - if (this.stream.isDataLoaded) { - this._loadedStreamCapability.resolve(this.stream); - } - const loadedRequests = []; - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - const requestIds = this._requestsByChunk.get(curChunk); - if (!requestIds) { - continue; - } - this._requestsByChunk.delete(curChunk); - for (const requestId of requestIds) { - const chunksNeeded = this._chunksNeededByRequest.get(requestId); - if (chunksNeeded.has(curChunk)) { - chunksNeeded.delete(curChunk); - } - if (chunksNeeded.size > 0) { - continue; - } - loadedRequests.push(requestId); - } - } - if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { - let nextEmptyChunk; - if (this.stream.numChunksLoaded === 1) { - const lastChunk = this.stream.numChunks - 1; - if (!this.stream.hasChunk(lastChunk)) { - nextEmptyChunk = lastChunk; - } - } else { - nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); - } - if (Number.isInteger(nextEmptyChunk)) { - this._requestChunks([nextEmptyChunk]); - } - } - for (const requestId of loadedRequests) { - const capability = this._promisesByRequest.get(requestId); - this._promisesByRequest.delete(requestId); - capability.resolve(); - } - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - } - onError(err) { - this._loadedStreamCapability.reject(err); - } - getBeginChunk(begin) { - return Math.floor(begin / this.chunkSize); - } - getEndChunk(end) { - return Math.floor((end - 1) / this.chunkSize) + 1; - } - abort(reason) { - this.aborted = true; - this.pdfNetworkStream?.cancelAllRequests(reason); - for (const capability of this._promisesByRequest.values()) { - capability.reject(reason); - } - } -} - -;// ./src/shared/image_utils.js - -function convertToRGBA(params) { - switch (params.kind) { - case ImageKind.GRAYSCALE_1BPP: - return convertBlackAndWhiteToRGBA(params); - case ImageKind.RGB_24BPP: - return convertRGBToRGBA(params); - } - return null; -} -function convertBlackAndWhiteToRGBA({ - src, - srcPos = 0, - dest, - width, - height, - nonBlackColor = 0xffffffff, - inverseDecode = false -}) { - const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; - const widthInSource = width >> 3; - const widthRemainder = width & 7; - const srcLength = src.length; - dest = new Uint32Array(dest.buffer); - let destPos = 0; - for (let i = 0; i < height; i++) { - for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { - const elem = srcPos < srcLength ? src[srcPos] : 255; - dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; - } - if (widthRemainder === 0) { - continue; - } - const elem = srcPos < srcLength ? src[srcPos++] : 255; - for (let j = 0; j < widthRemainder; j++) { - dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; - } - } - return { - srcPos, - destPos - }; -} -function convertRGBToRGBA({ - src, - srcPos = 0, - dest, - destPos = 0, - width, - height -}) { - let i = 0; - const len = width * height * 3; - const len32 = len >> 2; - const src32 = new Uint32Array(src.buffer, srcPos, len32); - if (FeatureTest.isLittleEndian) { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff000000; - dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; - dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; - dest[destPos + 3] = s3 >>> 8 | 0xff000000; - } - for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { - dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; - } - } else { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff; - dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; - dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; - dest[destPos + 3] = s3 << 8 | 0xff; - } - for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { - dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; - } - } - return { - srcPos: srcPos + len, - destPos - }; -} -function grayToRGBA(src, dest) { - if (FeatureTest.isLittleEndian) { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x10101 | 0xff000000; - } - } else { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x1010100 | 0x000000ff; - } - } -} - -;// ./src/core/image_resizer.js - - - -const MIN_IMAGE_DIM = 2048; -const MAX_IMAGE_DIM = 65537; -const MAX_ERROR = 128; -class ImageResizer { - static #goodSquareLength = MIN_IMAGE_DIM; - static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; - constructor(imgData, isMask) { - this._imgData = imgData; - this._isMask = isMask; - } - static get canUseImageDecoder() { - return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); - } - static needsToBeResized(width, height) { - if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { - return false; - } - const { - MAX_DIM - } = this; - if (width > MAX_DIM || height > MAX_DIM) { - return true; - } - const area = width * height; - if (this._hasMaxArea) { - return area > this.MAX_AREA; - } - if (area < this.#goodSquareLength ** 2) { - return false; - } - if (this._areGoodDims(width, height)) { - this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height))); - return false; - } - this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0); - const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2; - return area > maxArea; - } - static getReducePowerForJPX(width, height, componentsCount) { - const area = width * height; - const maxJPXArea = 2 ** 30 / (componentsCount * 4); - if (!this.needsToBeResized(width, height)) { - if (area > maxJPXArea) { - return Math.ceil(Math.log2(area / maxJPXArea)); - } - return 0; - } - const { - MAX_DIM, - MAX_AREA - } = this; - const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(area / Math.min(maxJPXArea, MAX_AREA))); - return Math.ceil(Math.log2(minFactor)); - } - static get MAX_DIM() { - return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); - } - static get MAX_AREA() { - this._hasMaxArea = true; - return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); - } - static set MAX_AREA(area) { - if (area >= 0) { - this._hasMaxArea = true; - shadow(this, "MAX_AREA", area); - } - } - static setOptions({ - canvasMaxAreaInBytes = -1, - isImageDecoderSupported = false - }) { - if (!this._hasMaxArea) { - this.MAX_AREA = canvasMaxAreaInBytes >> 2; - } - this.#isImageDecoderSupported = isImageDecoderSupported; - } - static _areGoodDims(width, height) { - try { - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d"); - ctx.fillRect(0, 0, 1, 1); - const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; - canvas.width = canvas.height = 1; - return opacity !== 0; - } catch { - return false; - } - } - static _guessMax(start, end, tolerance, defaultHeight) { - while (start + tolerance + 1 < end) { - const middle = Math.floor((start + end) / 2); - const height = defaultHeight || middle; - if (this._areGoodDims(middle, height)) { - start = middle; - } else { - end = middle; - } - } - return start; - } - static async createImage(imgData, isMask = false) { - return new ImageResizer(imgData, isMask)._createImage(); - } - async _createImage() { - const { - _imgData: imgData - } = this; - const { - width, - height - } = imgData; - if (width * height * 4 > MAX_INT_32) { - const result = this.#rescaleImageData(); - if (result) { - return result; - } - } - const data = this._encodeBMP(); - let decoder, imagePromise; - if (await ImageResizer.canUseImageDecoder) { - decoder = new ImageDecoder({ - data, - type: "image/bmp", - preferAnimation: false, - transfer: [data.buffer] - }); - imagePromise = decoder.decode().catch(reason => { - warn(`BMP image decoding failed: ${reason}`); - return createImageBitmap(new Blob([this._encodeBMP().buffer], { - type: "image/bmp" - })); - }).finally(() => { - decoder.close(); - }); - } else { - imagePromise = createImageBitmap(new Blob([data.buffer], { - type: "image/bmp" - })); - } - const { - MAX_AREA, - MAX_DIM - } = ImageResizer; - const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); - const firstFactor = Math.max(minFactor, 2); - const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; - const N = Math.floor(Math.log2(factor)); - const steps = new Array(N + 2).fill(2); - steps[0] = firstFactor; - steps.splice(-1, 1, factor / (1 << N)); - let newWidth = width; - let newHeight = height; - const result = await imagePromise; - let bitmap = result.image || result; - for (const step of steps) { - const prevWidth = newWidth; - const prevHeight = newHeight; - newWidth = Math.floor(newWidth / step) - 1; - newHeight = Math.floor(newHeight / step) - 1; - const canvas = new OffscreenCanvas(newWidth, newHeight); - const ctx = canvas.getContext("2d"); - ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); - bitmap.close(); - bitmap = canvas.transferToImageBitmap(); - } - imgData.data = null; - imgData.bitmap = bitmap; - imgData.width = newWidth; - imgData.height = newHeight; - return imgData; - } - #rescaleImageData() { - const { - _imgData: imgData - } = this; - const { - data, - width, - height, - kind - } = imgData; - const rgbaSize = width * height * 4; - const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); - const newWidth = width >> K; - const newHeight = height >> K; - let rgbaData; - let maxHeight = height; - try { - rgbaData = new Uint8Array(rgbaSize); - } catch { - let n = Math.floor(Math.log2(rgbaSize + 1)); - while (true) { - try { - rgbaData = new Uint8Array(2 ** n - 1); - break; - } catch { - n -= 1; - } - } - maxHeight = Math.floor((2 ** n - 1) / (width * 4)); - const newSize = width * maxHeight * 4; - if (newSize < rgbaData.length) { - rgbaData = new Uint8Array(newSize); - } - } - const src32 = new Uint32Array(rgbaData.buffer); - const dest32 = new Uint32Array(newWidth * newHeight); - let srcPos = 0; - let newIndex = 0; - const step = Math.ceil(height / maxHeight); - const remainder = height % maxHeight === 0 ? height : height % maxHeight; - for (let k = 0; k < step; k++) { - const h = k < step - 1 ? maxHeight : remainder; - ({ - srcPos - } = convertToRGBA({ - kind, - src: data, - dest: src32, - width, - height: h, - inverseDecode: this._isMask, - srcPos - })); - for (let i = 0, ii = h >> K; i < ii; i++) { - const buf = src32.subarray((i << K) * width); - for (let j = 0; j < newWidth; j++) { - dest32[newIndex++] = buf[j << K]; - } - } - } - if (ImageResizer.needsToBeResized(newWidth, newHeight)) { - imgData.data = dest32; - imgData.width = newWidth; - imgData.height = newHeight; - imgData.kind = ImageKind.RGBA_32BPP; - return null; - } - const canvas = new OffscreenCanvas(newWidth, newHeight); - const ctx = canvas.getContext("2d", { - willReadFrequently: true - }); - ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); - imgData.data = null; - imgData.bitmap = canvas.transferToImageBitmap(); - imgData.width = newWidth; - imgData.height = newHeight; - return imgData; - } - _encodeBMP() { - const { - width, - height, - kind - } = this._imgData; - let data = this._imgData.data; - let bitPerPixel; - let colorTable = new Uint8Array(0); - let maskTable = colorTable; - let compression = 0; - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - { - bitPerPixel = 1; - colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); - const rowLen = width + 7 >> 3; - const rowSize = rowLen + 3 & -4; - if (rowLen !== rowSize) { - const newData = new Uint8Array(rowSize * height); - let k = 0; - for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { - newData.set(data.subarray(i, i + rowLen), k); - } - data = newData; - } - break; - } - case ImageKind.RGB_24BPP: - { - bitPerPixel = 24; - if (width & 3) { - const rowLen = 3 * width; - const rowSize = rowLen + 3 & -4; - const extraLen = rowSize - rowLen; - const newData = new Uint8Array(rowSize * height); - let k = 0; - for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { - const row = data.subarray(i, i + rowLen); - for (let j = 0; j < rowLen; j += 3) { - newData[k++] = row[j + 2]; - newData[k++] = row[j + 1]; - newData[k++] = row[j]; - } - k += extraLen; - } - data = newData; - } else { - for (let i = 0, ii = data.length; i < ii; i += 3) { - const tmp = data[i]; - data[i] = data[i + 2]; - data[i + 2] = tmp; - } - } - break; - } - case ImageKind.RGBA_32BPP: - bitPerPixel = 32; - compression = 3; - maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); - const view = new DataView(maskTable.buffer); - if (FeatureTest.isLittleEndian) { - view.setUint32(0, 0x000000ff, true); - view.setUint32(4, 0x0000ff00, true); - view.setUint32(8, 0x00ff0000, true); - view.setUint32(12, 0xff000000, true); - } else { - view.setUint32(0, 0xff000000, true); - view.setUint32(4, 0x00ff0000, true); - view.setUint32(8, 0x0000ff00, true); - view.setUint32(12, 0x000000ff, true); - } - break; - default: - throw new Error("invalid format"); - } - let i = 0; - const headerLength = 40 + maskTable.length; - const fileLength = 14 + headerLength + colorTable.length + data.length; - const bmpData = new Uint8Array(fileLength); - const view = new DataView(bmpData.buffer); - view.setUint16(i, 0x4d42, true); - i += 2; - view.setUint32(i, fileLength, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - view.setUint32(i, 14 + headerLength + colorTable.length, true); - i += 4; - view.setUint32(i, headerLength, true); - i += 4; - view.setInt32(i, width, true); - i += 4; - view.setInt32(i, -height, true); - i += 4; - view.setUint16(i, 1, true); - i += 2; - view.setUint16(i, bitPerPixel, true); - i += 2; - view.setUint32(i, compression, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - view.setInt32(i, 0, true); - i += 4; - view.setInt32(i, 0, true); - i += 4; - view.setUint32(i, colorTable.length / 4, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - bmpData.set(maskTable, i); - i += maskTable.length; - bmpData.set(colorTable, i); - i += colorTable.length; - bmpData.set(data, i); - return bmpData; - } -} - -;// ./src/core/decode_stream.js - - -const emptyBuffer = new Uint8Array(0); -class DecodeStream extends BaseStream { - constructor(maybeMinBufferLength) { - super(); - this._rawMinBufferLength = maybeMinBufferLength || 0; - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; - if (maybeMinBufferLength) { - while (this.minBufferLength < maybeMinBufferLength) { - this.minBufferLength *= 2; - } - } - } - get isEmpty() { - while (!this.eof && this.bufferLength === 0) { - this.readBlock(); - } - return this.bufferLength === 0; - } - ensureBuffer(requested) { - const buffer = this.buffer; - if (requested <= buffer.byteLength) { - return buffer; - } - let size = this.minBufferLength; - while (size < requested) { - size *= 2; - } - const buffer2 = new Uint8Array(size); - buffer2.set(buffer); - return this.buffer = buffer2; - } - getByte() { - const pos = this.pos; - while (this.bufferLength <= pos) { - if (this.eof) { - return -1; - } - this.readBlock(); - } - return this.buffer[this.pos++]; - } - getBytes(length, decoderOptions = null) { - const pos = this.pos; - let end; - if (length) { - this.ensureBuffer(pos + length); - end = pos + length; - while (!this.eof && this.bufferLength < end) { - this.readBlock(decoderOptions); - } - const bufEnd = this.bufferLength; - if (end > bufEnd) { - end = bufEnd; - } - } else { - while (!this.eof) { - this.readBlock(decoderOptions); - } - end = this.bufferLength; - } - this.pos = end; - return this.buffer.subarray(pos, end); - } - async getImageData(length, decoderOptions) { - if (!this.canAsyncDecodeImageFromBuffer) { - if (this.isAsyncDecoder) { - return this.decodeImage(null, decoderOptions); - } - return this.getBytes(length, decoderOptions); - } - const data = await this.stream.asyncGetBytes(); - return this.decodeImage(data, decoderOptions); - } - reset() { - this.pos = 0; - } - makeSubStream(start, length, dict = null) { - if (length === undefined) { - while (!this.eof) { - this.readBlock(); - } - } else { - const end = start + length; - while (this.bufferLength <= end && !this.eof) { - this.readBlock(); - } - } - return new Stream(this.buffer, start, length, dict); - } - getBaseStreams() { - return this.str ? this.str.getBaseStreams() : null; - } -} -class StreamsSequenceStream extends DecodeStream { - constructor(streams, onError = null) { - streams = streams.filter(s => s instanceof BaseStream); - let maybeLength = 0; - for (const stream of streams) { - maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; - } - super(maybeLength); - this.streams = streams; - this._onError = onError; - } - readBlock() { - const streams = this.streams; - if (streams.length === 0) { - this.eof = true; - return; - } - const stream = streams.shift(); - let chunk; - try { - chunk = stream.getBytes(); - } catch (reason) { - if (this._onError) { - this._onError(reason, stream.dict?.objId); - return; - } - throw reason; - } - const bufferLength = this.bufferLength; - const newLength = bufferLength + chunk.length; - const buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - } - getBaseStreams() { - const baseStreamsBuf = []; - for (const stream of this.streams) { - const baseStreams = stream.getBaseStreams(); - if (baseStreams) { - baseStreamsBuf.push(...baseStreams); - } - } - return baseStreamsBuf.length > 0 ? baseStreamsBuf : null; - } -} - -;// ./src/core/colorspace_utils.js - - - - - -class ColorSpaceUtils { - static parse({ - cs, - xref, - resources = null, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache, - asyncIfNotCached = false - }) { - const options = { - xref, - resources, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }; - let csName, csRef, parsedCS; - if (cs instanceof Ref) { - csRef = cs; - const cachedCS = globalColorSpaceCache.getByRef(csRef) || localColorSpaceCache.getByRef(csRef); - if (cachedCS) { - return cachedCS; - } - cs = xref.fetch(cs); - } - if (cs instanceof Name) { - csName = cs.name; - const cachedCS = localColorSpaceCache.getByName(csName); - if (cachedCS) { - return cachedCS; - } - } - try { - parsedCS = this.#parse(cs, options); - } catch (ex) { - if (asyncIfNotCached && !(ex instanceof MissingDataException)) { - return Promise.reject(ex); - } - throw ex; - } - if (csName || csRef) { - localColorSpaceCache.set(csName, csRef, parsedCS); - if (csRef) { - globalColorSpaceCache.set(null, csRef, parsedCS); - } - } - return asyncIfNotCached ? Promise.resolve(parsedCS) : parsedCS; - } - static #subParse(cs, options) { - const { - globalColorSpaceCache - } = options; - let csRef; - if (cs instanceof Ref) { - csRef = cs; - const cachedCS = globalColorSpaceCache.getByRef(csRef); - if (cachedCS) { - return cachedCS; - } - } - const parsedCS = this.#parse(cs, options); - if (csRef) { - globalColorSpaceCache.set(null, csRef, parsedCS); - } - return parsedCS; - } - static #parse(cs, options) { - const { - xref, - resources, - pdfFunctionFactory, - globalColorSpaceCache - } = options; - cs = xref.fetchIfRef(cs); - if (cs instanceof Name) { - switch (cs.name) { - case "G": - case "DeviceGray": - return this.gray; - case "RGB": - case "DeviceRGB": - return this.rgb; - case "DeviceRGBA": - return this.rgba; - case "CMYK": - case "DeviceCMYK": - return this.cmyk; - case "Pattern": - return new PatternCS(null); - default: - if (resources instanceof Dict) { - const colorSpaces = resources.get("ColorSpace"); - if (colorSpaces instanceof Dict) { - const resourcesCS = colorSpaces.get(cs.name); - if (resourcesCS) { - if (resourcesCS instanceof Name) { - return this.#parse(resourcesCS, options); - } - cs = resourcesCS; - break; - } - } - } - warn(`Unrecognized ColorSpace: ${cs.name}`); - return this.gray; - } - } - if (Array.isArray(cs)) { - const mode = xref.fetchIfRef(cs[0]).name; - let params, numComps, baseCS, whitePoint, blackPoint, gamma; - switch (mode) { - case "G": - case "DeviceGray": - return this.gray; - case "RGB": - case "DeviceRGB": - return this.rgb; - case "CMYK": - case "DeviceCMYK": - return this.cmyk; - case "CalGray": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - gamma = params.get("Gamma"); - return new CalGrayCS(whitePoint, blackPoint, gamma); - case "CalRGB": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - gamma = params.getArray("Gamma"); - const matrix = params.getArray("Matrix"); - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case "ICCBased": - const isRef = cs[1] instanceof Ref; - if (isRef) { - const cachedCS = globalColorSpaceCache.getByRef(cs[1]); - if (cachedCS) { - return cachedCS; - } - } - const stream = xref.fetchIfRef(cs[1]); - const dict = stream.dict; - numComps = dict.get("N"); - if (IccColorSpace.isUsable) { - try { - const iccCS = new IccColorSpace(stream.getBytes(), "ICCBased", numComps); - if (isRef) { - globalColorSpaceCache.set(null, cs[1], iccCS); - } - return iccCS; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`ICCBased color space (${cs[1]}): "${ex}".`); - } - } - const altRaw = dict.getRaw("Alternate"); - if (altRaw) { - const altCS = this.#subParse(altRaw, options); - if (altCS.numComps === numComps) { - return altCS; - } - warn("ICCBased color space: Ignoring incorrect /Alternate entry."); - } - if (numComps === 1) { - return this.gray; - } else if (numComps === 3) { - return this.rgb; - } else if (numComps === 4) { - return this.cmyk; - } - break; - case "Pattern": - baseCS = cs[1] || null; - if (baseCS) { - baseCS = this.#subParse(baseCS, options); - } - return new PatternCS(baseCS); - case "I": - case "Indexed": - baseCS = this.#subParse(cs[1], options); - const hiVal = MathClamp(xref.fetchIfRef(cs[2]), 0, 255); - const lookup = xref.fetchIfRef(cs[3]); - return new IndexedCS(baseCS, hiVal, lookup); - case "Separation": - case "DeviceN": - const name = xref.fetchIfRef(cs[1]); - numComps = Array.isArray(name) ? name.length : 1; - baseCS = this.#subParse(cs[2], options); - const tintFn = pdfFunctionFactory.create(cs[3]); - return new AlternateCS(numComps, baseCS, tintFn); - case "Lab": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - const range = params.getArray("Range"); - return new LabCS(whitePoint, blackPoint, range); - default: - warn(`Unimplemented ColorSpace object: ${mode}`); - return this.gray; - } - } - warn(`Unrecognized ColorSpace object: ${cs}`); - return this.gray; - } - static get gray() { - return shadow(this, "gray", new DeviceGrayCS()); - } - static get rgb() { - return shadow(this, "rgb", new DeviceRgbCS()); - } - static get rgba() { - return shadow(this, "rgba", new DeviceRgbaCS()); - } - static get cmyk() { - if (CmykICCBasedCS.isUsable) { - try { - return shadow(this, "cmyk", new CmykICCBasedCS()); - } catch { - warn("CMYK fallback: DeviceCMYK"); - } - } - return shadow(this, "cmyk", new DeviceCmykCS()); - } -} - -;// ./src/core/jpg.js - - - - - -class JpegError extends BaseException { - constructor(msg) { - super(msg, "JpegError"); - } -} -class DNLMarkerError extends BaseException { - constructor(message, scanLines) { - super(message, "DNLMarkerError"); - this.scanLines = scanLines; - } -} -class EOIMarkerError extends BaseException { - constructor(msg) { - super(msg, "EOIMarkerError"); - } -} -const dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]); -const dctCos1 = 4017; -const dctSin1 = 799; -const dctCos3 = 3406; -const dctSin3 = 2276; -const dctCos6 = 1567; -const dctSin6 = 3784; -const dctSqrt2 = 5793; -const dctSqrt1d2 = 2896; -function buildHuffmanTable(codeLengths, values) { - let k = 0, - i, - j, - length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - const code = [{ - children: [], - index: 0 - }]; - let p = code[0], - q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = { - children: [], - index: 0 - }); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - code.push(q = { - children: [], - index: 0 - }); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; -} -function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); -} -function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { - const mcusPerLine = frame.mcusPerLine; - const progressive = frame.progressive; - const startOffset = offset; - let bitsData = 0, - bitsCount = 0; - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return bitsData >> bitsCount & 1; - } - bitsData = data[offset++]; - if (bitsData === 0xff) { - const nextByte = data[offset++]; - if (nextByte) { - if (nextByte === 0xdc && parseDNLMarker) { - offset += 2; - const scanLines = readUint16(data, offset); - offset += 2; - if (scanLines > 0 && scanLines !== frame.scanLines) { - throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); - } - } else if (nextByte === 0xd9) { - if (parseDNLMarker) { - const maybeScanLines = blockRow * (frame.precision === 8 ? 8 : 0); - if (maybeScanLines > 0 && Math.round(frame.scanLines / maybeScanLines) >= 5) { - throw new DNLMarkerError("Found EOI marker (0xFFD9) while parsing scan data, " + "possibly caused by incorrect `scanLines` parameter", maybeScanLines); - } - } - throw new EOIMarkerError("Found EOI marker (0xFFD9) while parsing scan data"); - } - throw new JpegError(`unexpected marker ${(bitsData << 8 | nextByte).toString(16)}`); - } - } - bitsCount = 7; - return bitsData >>> 7; - } - function decodeHuffman(tree) { - let node = tree; - while (true) { - node = node[readBit()]; - switch (typeof node) { - case "number": - return node; - case "object": - continue; - } - throw new JpegError("invalid huffman sequence"); - } - } - function receive(length) { - let n = 0; - while (length > 0) { - n = n << 1 | readBit(); - length--; - } - return n; - } - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - const n = receive(length); - if (n >= 1 << length - 1) { - return n; - } - return n + (-1 << length) + 1; - } - function decodeBaseline(component, blockOffset) { - const t = decodeHuffman(component.huffmanTableDC); - const diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[blockOffset] = component.pred += diff; - let k = 1; - while (k < 64) { - const rs = decodeHuffman(component.huffmanTableAC); - const s = rs & 15, - r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - const z = dctZigZag[k]; - component.blockData[blockOffset + z] = receiveAndExtend(s); - k++; - } - } - function decodeDCFirst(component, blockOffset) { - const t = decodeHuffman(component.huffmanTableDC); - const diff = t === 0 ? 0 : receiveAndExtend(t) << successive; - component.blockData[blockOffset] = component.pred += diff; - } - function decodeDCSuccessive(component, blockOffset) { - component.blockData[blockOffset] |= readBit() << successive; - } - let eobrun = 0; - function decodeACFirst(component, blockOffset) { - if (eobrun > 0) { - eobrun--; - return; - } - let k = spectralStart; - const e = spectralEnd; - while (k <= e) { - const rs = decodeHuffman(component.huffmanTableAC); - const s = rs & 15, - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - const z = dctZigZag[k]; - component.blockData[blockOffset + z] = receiveAndExtend(s) * (1 << successive); - k++; - } - } - let successiveACState = 0, - successiveACNextValue; - function decodeACSuccessive(component, blockOffset) { - let k = spectralStart; - const e = spectralEnd; - let r = 0; - let s; - let rs; - while (k <= e) { - const offsetZ = blockOffset + dctZigZag[k]; - const sign = component.blockData[offsetZ] < 0 ? -1 : 1; - switch (successiveACState) { - case 0: - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - throw new JpegError("invalid ACn encoding"); - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - case 1: - case 2: - if (component.blockData[offsetZ]) { - component.blockData[offsetZ] += sign * (readBit() << successive); - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - case 3: - if (component.blockData[offsetZ]) { - component.blockData[offsetZ] += sign * (readBit() << successive); - } else { - component.blockData[offsetZ] = successiveACNextValue << successive; - successiveACState = 0; - } - break; - case 4: - if (component.blockData[offsetZ]) { - component.blockData[offsetZ] += sign * (readBit() << successive); - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - let blockRow = 0; - function decodeMcu(component, decode, mcu, row, col) { - const mcuRow = mcu / mcusPerLine | 0; - const mcuCol = mcu % mcusPerLine; - blockRow = mcuRow * component.v + row; - const blockCol = mcuCol * component.h + col; - const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, blockOffset); - } - function decodeBlock(component, decode, mcu) { - blockRow = mcu / component.blocksPerLine | 0; - const blockCol = mcu % component.blocksPerLine; - const blockOffset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, blockOffset); - } - const componentsLength = components.length; - let component, i, j, k, n; - let decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - let mcu = 0, - fileMarker; - const mcuExpected = componentsLength === 1 ? components[0].blocksPerLine * components[0].blocksPerColumn : mcusPerLine * frame.mcusPerColumn; - let h, v; - while (mcu <= mcuExpected) { - const mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected; - if (mcuToRead > 0) { - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < mcuToRead; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < mcuToRead; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - } - bitsCount = 0; - fileMarker = findNextFileMarker(data, offset); - if (!fileMarker) { - break; - } - if (fileMarker.invalid) { - const partialMsg = mcuToRead > 0 ? "unexpected" : "excessive"; - warn(`decodeScan - ${partialMsg} MCU data, current marker is: ${fileMarker.invalid}`); - offset = fileMarker.offset; - } - if (fileMarker.marker >= 0xffd0 && fileMarker.marker <= 0xffd7) { - offset += 2; - } else { - break; - } - } - return offset - startOffset; -} -function quantizeAndInverse(component, blockBufferOffset, p) { - const qt = component.quantizationTable, - blockData = component.blockData; - let v0, v1, v2, v3, v4, v5, v6, v7; - let p0, p1, p2, p3, p4, p5, p6, p7; - let t; - if (!qt) { - throw new JpegError("missing required Quantization Table."); - } - for (let row = 0; row < 64; row += 8) { - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - p0 *= qt[row]; - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = dctSqrt2 * p0 + 512 >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - v0 = dctSqrt2 * p0 + 128 >> 8; - v1 = dctSqrt2 * p4 + 128 >> 8; - v2 = p2; - v3 = p6; - v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; - v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - v0 = v0 + v1 + 1 >> 1; - v1 = v0 - v1; - t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; - v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; - v3 = t; - v4 = v4 + v6 + 1 >> 1; - v6 = v4 - v6; - v7 = v7 + v5 + 1 >> 1; - v5 = v7 - v5; - v0 = v0 + v3 + 1 >> 1; - v3 = v0 - v3; - v1 = v1 + v2 + 1 >> 1; - v2 = v1 - v2; - t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; - v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; - v7 = t; - t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; - v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; - v6 = t; - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - for (let col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = dctSqrt2 * p0 + 8192 >> 14; - if (t < -2040) { - t = 0; - } else if (t >= 2024) { - t = 255; - } else { - t = t + 2056 >> 4; - } - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - v0 = dctSqrt2 * p0 + 2048 >> 12; - v1 = dctSqrt2 * p4 + 2048 >> 12; - v2 = p2; - v3 = p6; - v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; - v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; - v5 = p3; - v6 = p5; - v0 = (v0 + v1 + 1 >> 1) + 4112; - v1 = v0 - v1; - t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; - v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; - v3 = t; - v4 = v4 + v6 + 1 >> 1; - v6 = v4 - v6; - v7 = v7 + v5 + 1 >> 1; - v5 = v7 - v5; - v0 = v0 + v3 + 1 >> 1; - v3 = v0 - v3; - v1 = v1 + v2 + 1 >> 1; - v2 = v1 - v2; - t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; - v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; - v7 = t; - t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; - v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; - v6 = t; - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - if (p0 < 16) { - p0 = 0; - } else if (p0 >= 4080) { - p0 = 255; - } else { - p0 >>= 4; - } - if (p1 < 16) { - p1 = 0; - } else if (p1 >= 4080) { - p1 = 255; - } else { - p1 >>= 4; - } - if (p2 < 16) { - p2 = 0; - } else if (p2 >= 4080) { - p2 = 255; - } else { - p2 >>= 4; - } - if (p3 < 16) { - p3 = 0; - } else if (p3 >= 4080) { - p3 = 255; - } else { - p3 >>= 4; - } - if (p4 < 16) { - p4 = 0; - } else if (p4 >= 4080) { - p4 = 255; - } else { - p4 >>= 4; - } - if (p5 < 16) { - p5 = 0; - } else if (p5 >= 4080) { - p5 = 255; - } else { - p5 >>= 4; - } - if (p6 < 16) { - p6 = 0; - } else if (p6 >= 4080) { - p6 = 255; - } else { - p6 >>= 4; - } - if (p7 < 16) { - p7 = 0; - } else if (p7 >= 4080) { - p7 = 255; - } else { - p7 >>= 4; - } - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } -} -function buildComponentData(frame, component) { - const blocksPerLine = component.blocksPerLine; - const blocksPerColumn = component.blocksPerColumn; - const computationBuffer = new Int16Array(64); - for (let blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (let blockCol = 0; blockCol < blocksPerLine; blockCol++) { - const offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; -} -function findNextFileMarker(data, currentPos, startPos = currentPos) { - const maxPos = data.length - 1; - let newPos = startPos < currentPos ? startPos : currentPos; - if (currentPos >= maxPos) { - return null; - } - const currentMarker = readUint16(data, currentPos); - if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { - return { - invalid: null, - marker: currentMarker, - offset: currentPos - }; - } - let newMarker = readUint16(data, newPos); - while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { - if (++newPos >= maxPos) { - return null; - } - newMarker = readUint16(data, newPos); - } - return { - invalid: currentMarker.toString(16), - marker: newMarker, - offset: newPos - }; -} -function prepareComponents(frame) { - const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (const component of frame.components) { - const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); - const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); - const blocksPerLineForMcu = mcusPerLine * component.h; - const blocksPerColumnForMcu = mcusPerColumn * component.v; - const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; -} -function readDataBlock(data, offset) { - const length = readUint16(data, offset); - offset += 2; - let endOffset = offset + length - 2; - const fileMarker = findNextFileMarker(data, endOffset, offset); - if (fileMarker?.invalid) { - warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); - endOffset = fileMarker.offset; - } - const array = data.subarray(offset, endOffset); - return { - appData: array, - oldOffset: offset, - newOffset: offset + array.length - }; -} -function skipData(data, offset) { - const length = readUint16(data, offset); - offset += 2; - const endOffset = offset + length - 2; - const fileMarker = findNextFileMarker(data, endOffset, offset); - if (fileMarker?.invalid) { - return fileMarker.offset; - } - return endOffset; -} -class JpegImage { - constructor({ - decodeTransform = null, - colorTransform = -1 - } = {}) { - this._decodeTransform = decodeTransform; - this._colorTransform = colorTransform; - } - static canUseImageDecoder(data, colorTransform = -1) { - let exifOffsets = null; - let offset = 0; - let numComponents = null; - let fileMarker = readUint16(data, offset); - offset += 2; - if (fileMarker !== 0xffd8) { - throw new JpegError("SOI not found"); - } - fileMarker = readUint16(data, offset); - offset += 2; - markerLoop: while (fileMarker !== 0xffd9) { - switch (fileMarker) { - case 0xffe1: - const { - appData, - oldOffset, - newOffset - } = readDataBlock(data, offset); - offset = newOffset; - if (appData[0] === 0x45 && appData[1] === 0x78 && appData[2] === 0x69 && appData[3] === 0x66 && appData[4] === 0 && appData[5] === 0) { - if (exifOffsets) { - throw new JpegError("Duplicate EXIF-blocks found."); - } - exifOffsets = { - exifStart: oldOffset + 6, - exifEnd: newOffset - }; - } - fileMarker = readUint16(data, offset); - offset += 2; - continue; - case 0xffc0: - case 0xffc1: - case 0xffc2: - numComponents = data[offset + (2 + 1 + 2 + 2)]; - break markerLoop; - case 0xffff: - if (data[offset] !== 0xff) { - offset--; - } - break; - } - offset = skipData(data, offset); - fileMarker = readUint16(data, offset); - offset += 2; - } - if (numComponents === 4) { - return null; - } - if (numComponents === 3 && colorTransform === 0) { - return null; - } - return exifOffsets || {}; - } - parse(data, { - dnlScanLines = null - } = {}) { - let offset = 0; - let jfif = null; - let adobe = null; - let frame, resetInterval; - let numSOSMarkers = 0; - const quantizationTables = []; - const huffmanTablesAC = [], - huffmanTablesDC = []; - let fileMarker = readUint16(data, offset); - offset += 2; - if (fileMarker !== 0xffd8) { - throw new JpegError("SOI not found"); - } - fileMarker = readUint16(data, offset); - offset += 2; - markerLoop: while (fileMarker !== 0xffd9) { - let i, j, l; - switch (fileMarker) { - case 0xffe0: - case 0xffe1: - case 0xffe2: - case 0xffe3: - case 0xffe4: - case 0xffe5: - case 0xffe6: - case 0xffe7: - case 0xffe8: - case 0xffe9: - case 0xffea: - case 0xffeb: - case 0xffec: - case 0xffed: - case 0xffee: - case 0xffef: - case 0xfffe: - const { - appData, - newOffset - } = readDataBlock(data, offset); - offset = newOffset; - if (fileMarker === 0xffe0) { - if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { - jfif = { - version: { - major: appData[5], - minor: appData[6] - }, - densityUnits: appData[7], - xDensity: appData[8] << 8 | appData[9], - yDensity: appData[10] << 8 | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) - }; - } - } - if (fileMarker === 0xffee) { - if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65) { - adobe = { - version: appData[5] << 8 | appData[6], - flags0: appData[7] << 8 | appData[8], - flags1: appData[9] << 8 | appData[10], - transformCode: appData[11] - }; - } - } - break; - case 0xffdb: - const quantizationTablesLength = readUint16(data, offset); - offset += 2; - const quantizationTablesEnd = quantizationTablesLength + offset - 2; - let z; - while (offset < quantizationTablesEnd) { - const quantizationTableSpec = data[offset++]; - const tableData = new Uint16Array(64); - if (quantizationTableSpec >> 4 === 0) { - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if (quantizationTableSpec >> 4 === 1) { - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(data, offset); - offset += 2; - } - } else { - throw new JpegError("DQT - invalid table spec"); - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - case 0xffc0: - case 0xffc1: - case 0xffc2: - if (frame) { - throw new JpegError("Only single frame JPEGs supported"); - } - offset += 2; - frame = {}; - frame.extended = fileMarker === 0xffc1; - frame.progressive = fileMarker === 0xffc2; - frame.precision = data[offset++]; - const sofScanLines = readUint16(data, offset); - offset += 2; - frame.scanLines = dnlScanLines || sofScanLines; - frame.samplesPerLine = readUint16(data, offset); - offset += 2; - frame.components = []; - frame.componentIds = {}; - const componentsCount = data[offset++]; - let maxH = 0, - maxV = 0; - for (i = 0; i < componentsCount; i++) { - const componentId = data[offset]; - const h = data[offset + 1] >> 4; - const v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - const qId = data[offset + 2]; - l = frame.components.push({ - h, - v, - quantizationId: qId, - quantizationTable: null - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - case 0xffc4: - const huffmanLength = readUint16(data, offset); - offset += 2; - for (i = 2; i < huffmanLength;) { - const huffmanTableSpec = data[offset++]; - const codeLengths = new Uint8Array(16); - let codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += codeLengths[j] = data[offset]; - } - const huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); - } - break; - case 0xffdd: - offset += 2; - resetInterval = readUint16(data, offset); - offset += 2; - break; - case 0xffda: - const parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines; - offset += 2; - const selectorsCount = data[offset++], - components = []; - for (i = 0; i < selectorsCount; i++) { - const index = data[offset++]; - const componentIndex = frame.componentIds[index]; - const component = frame.components[componentIndex]; - component.index = index; - const tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - const spectralStart = data[offset++], - spectralEnd = data[offset++], - successiveApproximation = data[offset++]; - try { - const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); - offset += processed; - } catch (ex) { - if (ex instanceof DNLMarkerError) { - warn(`${ex.message} -- attempting to re-parse the JPEG image.`); - return this.parse(data, { - dnlScanLines: ex.scanLines - }); - } else if (ex instanceof EOIMarkerError) { - warn(`${ex.message} -- ignoring the rest of the image data.`); - break markerLoop; - } - throw ex; - } - break; - case 0xffdc: - offset += 4; - break; - case 0xffff: - if (data[offset] !== 0xff) { - offset--; - } - break; - default: - const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); - if (nextFileMarker?.invalid) { - warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); - offset = nextFileMarker.offset; - break; - } - if (!nextFileMarker || offset >= data.length - 1) { - warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); - break markerLoop; - } - throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); - } - fileMarker = readUint16(data, offset); - offset += 2; - } - if (!frame) { - throw new JpegError("JpegImage.parse - no frame data found."); - } - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (const component of frame.components) { - const quantizationTable = quantizationTables[component.quantizationId]; - if (quantizationTable) { - component.quantizationTable = quantizationTable; - } - this.components.push({ - index: component.index, - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - return undefined; - } - _getLinearizedBlockData(width, height, isSourcePDF = false) { - const scaleX = this.width / width, - scaleY = this.height / height; - let component, componentScaleX, componentScaleY, blocksPerScanline; - let x, y, i, j, k; - let index; - let offset = 0; - let output; - const numComponents = this.components.length; - const dataLength = width * height * numComponents; - const data = new Uint8ClampedArray(dataLength); - const xScaleBlockOffset = new Uint32Array(width); - const mask3LSB = 0xfffffff8; - let lastComponentScaleX; - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = component.blocksPerLine + 1 << 3; - if (componentScaleX !== lastComponentScaleX) { - for (x = 0; x < width; x++) { - j = 0 | x * componentScaleX; - xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; - } - lastComponentScaleX = componentScaleX; - } - for (y = 0; y < height; y++) { - j = 0 | y * componentScaleY; - index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - let transform = this._decodeTransform; - if (!isSourcePDF && numComponents === 4 && !transform) { - transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); - } - if (transform) { - for (i = 0; i < dataLength;) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; - } - } - } - return data; - } - get _isColorConversionNeeded() { - if (this.adobe) { - return !!this.adobe.transformCode; - } - if (this.numComponents === 3) { - if (this._colorTransform === 0) { - return false; - } else if (this.components[0].index === 0x52 && this.components[1].index === 0x47 && this.components[2].index === 0x42) { - return false; - } - return true; - } - if (this._colorTransform === 1) { - return true; - } - return false; - } - _convertYccToRgb(data) { - let Y, Cb, Cr; - for (let i = 0, length = data.length; i < length; i += 3) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i] = Y - 179.456 + 1.402 * Cr; - data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; - data[i + 2] = Y - 226.816 + 1.772 * Cb; - } - return data; - } - _convertYccToRgba(data, out) { - for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { - const Y = data[i]; - const Cb = data[i + 1]; - const Cr = data[i + 2]; - out[j] = Y - 179.456 + 1.402 * Cr; - out[j + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr; - out[j + 2] = Y - 226.816 + 1.772 * Cb; - out[j + 3] = 255; - } - return out; - } - _convertYcckToRgb(data) { - this._convertYcckToCmyk(data); - return this._convertCmykToRgb(data); - } - _convertYcckToRgba(data) { - this._convertYcckToCmyk(data); - return this._convertCmykToRgba(data); - } - _convertYcckToCmyk(data) { - let Y, Cb, Cr; - for (let i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i] = 434.456 - Y - 1.402 * Cr; - data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr; - data[i + 2] = 481.816 - Y - 1.772 * Cb; - } - return data; - } - _convertCmykToRgb(data) { - const count = data.length / 4; - ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, count, data, 0, 8, 0); - return data.subarray(0, count * 3); - } - _convertCmykToRgba(data) { - ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, data.length / 4, data, 0, 8, 1); - if (ColorSpaceUtils.cmyk instanceof DeviceCmykCS) { - for (let i = 3, ii = data.length; i < ii; i += 4) { - data[i] = 255; - } - } - return data; - } - getData({ - width, - height, - forceRGBA = false, - forceRGB = false, - isSourcePDF = false - }) { - if (this.numComponents > 4) { - throw new JpegError("Unsupported color mode"); - } - const data = this._getLinearizedBlockData(width, height, isSourcePDF); - if (this.numComponents === 1 && (forceRGBA || forceRGB)) { - const len = data.length * (forceRGBA ? 4 : 3); - const rgbaData = new Uint8ClampedArray(len); - let offset = 0; - if (forceRGBA) { - grayToRGBA(data, new Uint32Array(rgbaData.buffer)); - } else { - for (const grayColor of data) { - rgbaData[offset++] = grayColor; - rgbaData[offset++] = grayColor; - rgbaData[offset++] = grayColor; - } - } - return rgbaData; - } else if (this.numComponents === 3 && this._isColorConversionNeeded) { - if (forceRGBA) { - const rgbaData = new Uint8ClampedArray(data.length / 3 * 4); - return this._convertYccToRgba(data, rgbaData); - } - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded) { - if (forceRGBA) { - return this._convertYcckToRgba(data); - } - if (forceRGB) { - return this._convertYcckToRgb(data); - } - return this._convertYcckToCmyk(data); - } else if (forceRGBA) { - return this._convertCmykToRgba(data); - } else if (forceRGB) { - return this._convertCmykToRgb(data); - } - } - return data; - } -} - -;// ./src/core/jpeg_stream.js - - - - -class JpegStream extends DecodeStream { - static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; - constructor(stream, maybeLength, params) { - super(maybeLength); - this.stream = stream; - this.dict = stream.dict; - this.maybeLength = maybeLength; - this.params = params; - } - static get canUseImageDecoder() { - return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false)); - } - static setOptions({ - isImageDecoderSupported = false - }) { - this.#isImageDecoderSupported = isImageDecoderSupported; - } - get bytes() { - return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); - } - ensureBuffer(requested) {} - readBlock() { - this.decodeImage(); - } - get jpegOptions() { - const jpegOptions = { - decodeTransform: undefined, - colorTransform: undefined - }; - const decodeArr = this.dict.getArray("D", "Decode"); - if ((this.forceRGBA || this.forceRGB) && Array.isArray(decodeArr)) { - const bitsPerComponent = this.dict.get("BPC", "BitsPerComponent") || 8; - const decodeArrLength = decodeArr.length; - const transform = new Int32Array(decodeArrLength); - let transformNeeded = false; - const maxValue = (1 << bitsPerComponent) - 1; - for (let i = 0; i < decodeArrLength; i += 2) { - transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; - transform[i + 1] = decodeArr[i] * maxValue | 0; - if (transform[i] !== 256 || transform[i + 1] !== 0) { - transformNeeded = true; - } - } - if (transformNeeded) { - jpegOptions.decodeTransform = transform; - } - } - if (this.params instanceof Dict) { - const colorTransform = this.params.get("ColorTransform"); - if (Number.isInteger(colorTransform)) { - jpegOptions.colorTransform = colorTransform; - } - } - return shadow(this, "jpegOptions", jpegOptions); - } - #skipUselessBytes(data) { - for (let i = 0, ii = data.length - 1; i < ii; i++) { - if (data[i] === 0xff && data[i + 1] === 0xd8) { - if (i > 0) { - data = data.subarray(i); - } - break; - } - } - return data; - } - decodeImage(bytes) { - if (this.eof) { - return this.buffer; - } - bytes = this.#skipUselessBytes(bytes || this.bytes); - const jpegImage = new JpegImage(this.jpegOptions); - jpegImage.parse(bytes); - const data = jpegImage.getData({ - width: this.drawWidth, - height: this.drawHeight, - forceRGBA: this.forceRGBA, - forceRGB: this.forceRGB, - isSourcePDF: true - }); - this.buffer = data; - this.bufferLength = data.length; - this.eof = true; - return this.buffer; - } - get canAsyncDecodeImageFromBuffer() { - return this.stream.isAsync; - } - async getTransferableImage() { - if (!(await JpegStream.canUseImageDecoder)) { - return null; - } - const jpegOptions = this.jpegOptions; - if (jpegOptions.decodeTransform) { - return null; - } - let decoder; - try { - const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; - if (!bytes) { - return null; - } - let data = this.#skipUselessBytes(bytes); - const useImageDecoder = JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform); - if (!useImageDecoder) { - return null; - } - if (useImageDecoder.exifStart) { - data = data.slice(); - data.fill(0x00, useImageDecoder.exifStart, useImageDecoder.exifEnd); - } - decoder = new ImageDecoder({ - data, - type: "image/jpeg", - preferAnimation: false - }); - return (await decoder.decode()).image; - } catch (reason) { - warn(`getTransferableImage - failed: "${reason}".`); - return null; - } finally { - decoder?.close(); - } - } -} - -;// ./external/openjpeg/openjpeg.js -var OpenJPEG = (() => { - return async function (moduleArg = {}) { - var moduleRtn; - var Module = moduleArg; - var readyPromiseResolve, readyPromiseReject; - var readyPromise = new Promise((resolve, reject) => { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var ENVIRONMENT_IS_WEB = true; - var ENVIRONMENT_IS_WORKER = false; - var arguments_ = []; - var thisProgram = "./this.program"; - var quit_ = (status, toThrow) => { - throw toThrow; - }; - var _scriptName = import.meta.url; - var scriptDirectory = ""; - var readAsync, readBinary; - if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - try { - scriptDirectory = new URL(".", _scriptName).href; - } catch {} - readAsync = async url => { - var response = await fetch(url, { - credentials: "same-origin" - }); - if (response.ok) { - return response.arrayBuffer(); - } - throw new Error(response.status + " : " + response.url); - }; - } else {} - var out = console.log.bind(console); - var err = console.error.bind(console); - var wasmBinary; - var wasmMemory; - var ABORT = false; - var EXITSTATUS; - var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAP64, HEAPU64, HEAPF64; - var runtimeInitialized = false; - function updateMemoryViews() { - var b = wasmMemory.buffer; - HEAP8 = new Int8Array(b); - HEAP16 = new Int16Array(b); - HEAPU8 = new Uint8Array(b); - HEAPU16 = new Uint16Array(b); - HEAP32 = new Int32Array(b); - HEAPU32 = new Uint32Array(b); - HEAPF32 = new Float32Array(b); - HEAPF64 = new Float64Array(b); - HEAP64 = new BigInt64Array(b); - HEAPU64 = new BigUint64Array(b); - } - function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(onPreRuns); - } - function initRuntime() { - runtimeInitialized = true; - wasmExports["t"](); - } - function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(onPostRuns); - } - var runDependencies = 0; - var dependenciesFulfilled = null; - function addRunDependency(id) { - runDependencies++; - Module["monitorRunDependencies"]?.(runDependencies); - } - function removeRunDependency(id) { - runDependencies--; - Module["monitorRunDependencies"]?.(runDependencies); - if (runDependencies == 0) { - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - function abort(what) { - Module["onAbort"]?.(what); - what = "Aborted(" + what + ")"; - err(what); - ABORT = true; - what += ". Build with -sASSERTIONS for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - var wasmBinaryFile; - function getWasmImports() { - return { - a: wasmImports - }; - } - async function createWasm() { - function receiveInstance(instance, module) { - wasmExports = instance.exports; - wasmMemory = wasmExports["s"]; - updateMemoryViews(); - removeRunDependency("wasm-instantiate"); - return wasmExports; - } - addRunDependency("wasm-instantiate"); - var info = getWasmImports(); - return new Promise((resolve, reject) => { - Module["instantiateWasm"](info, (mod, inst) => { - resolve(receiveInstance(mod, inst)); - }); - }); - } - class ExitStatus { - name = "ExitStatus"; - constructor(status) { - this.message = `Program terminated with exit(${status})`; - this.status = status; - } - } - var callRuntimeCallbacks = callbacks => { - while (callbacks.length > 0) { - callbacks.shift()(Module); - } - }; - var onPostRuns = []; - var addOnPostRun = cb => onPostRuns.push(cb); - var onPreRuns = []; - var addOnPreRun = cb => onPreRuns.push(cb); - var noExitRuntime = true; - var __abort_js = () => abort(""); - var runtimeKeepaliveCounter = 0; - var __emscripten_runtime_keepalive_clear = () => { - noExitRuntime = false; - runtimeKeepaliveCounter = 0; - }; - var timers = {}; - var handleException = e => { - if (e instanceof ExitStatus || e == "unwind") { - return EXITSTATUS; - } - quit_(1, e); - }; - var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; - var _proc_exit = code => { - EXITSTATUS = code; - if (!keepRuntimeAlive()) { - Module["onExit"]?.(code); - ABORT = true; - } - quit_(code, new ExitStatus(code)); - }; - var exitJS = (status, implicit) => { - EXITSTATUS = status; - _proc_exit(status); - }; - var _exit = exitJS; - var maybeExit = () => { - if (!keepRuntimeAlive()) { - try { - _exit(EXITSTATUS); - } catch (e) { - handleException(e); - } - } - }; - var callUserCallback = func => { - if (ABORT) { - return; - } - try { - func(); - maybeExit(); - } catch (e) { - handleException(e); - } - }; - var _emscripten_get_now = () => performance.now(); - var __setitimer_js = (which, timeout_ms) => { - if (timers[which]) { - clearTimeout(timers[which].id); - delete timers[which]; - } - if (!timeout_ms) return 0; - var id = setTimeout(() => { - delete timers[which]; - callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); - }, timeout_ms); - timers[which] = { - id, - timeout_ms - }; - return 0; - }; - function _copy_pixels_1(compG_ptr, nb_pixels) { - compG_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - imageData.set(compG); - } - function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { - compR_ptr >>= 2; - compG_ptr >>= 2; - compB_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); - const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); - for (let i = 0; i < nb_pixels; i++) { - imageData[3 * i] = compR[i]; - imageData[3 * i + 1] = compG[i]; - imageData[3 * i + 2] = compB[i]; - } - } - function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { - compR_ptr >>= 2; - compG_ptr >>= 2; - compB_ptr >>= 2; - compA_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); - const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); - const compA = HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); - for (let i = 0; i < nb_pixels; i++) { - imageData[4 * i] = compR[i]; - imageData[4 * i + 1] = compG[i]; - imageData[4 * i + 2] = compB[i]; - imageData[4 * i + 3] = compA[i]; - } - } - var getHeapMax = () => 2147483648; - var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; - var growMemory = size => { - var b = wasmMemory.buffer; - var pages = (size - b.byteLength + 65535) / 65536 | 0; - try { - wasmMemory.grow(pages); - updateMemoryViews(); - return 1; - } catch (e) {} - }; - var _emscripten_resize_heap = requestedSize => { - var oldSize = HEAPU8.length; - requestedSize >>>= 0; - var maxHeapSize = getHeapMax(); - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + .2 / cutDown); - overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); - var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = growMemory(newSize); - if (replacement) { - return true; - } - } - return false; - }; - var ENV = {}; - var getExecutableName = () => thisProgram || "./this.program"; - var getEnvStrings = () => { - if (!getEnvStrings.strings) { - var lang = (typeof navigator == "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; - var env = { - USER: "web_user", - LOGNAME: "web_user", - PATH: "/", - PWD: "/", - HOME: "/home/web_user", - LANG: lang, - _: getExecutableName() - }; - for (var x in ENV) { - if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; - } - var strings = []; - for (var x in env) { - strings.push(`${x}=${env[x]}`); - } - getEnvStrings.strings = strings; - } - return getEnvStrings.strings; - }; - var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { - if (!(maxBytesToWrite > 0)) return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | u1 & 1023; - } - if (u <= 127) { - if (outIdx >= endIdx) break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) break; - heap[outIdx++] = 192 | u >> 6; - heap[outIdx++] = 128 | u & 63; - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) break; - heap[outIdx++] = 224 | u >> 12; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } else { - if (outIdx + 3 >= endIdx) break; - heap[outIdx++] = 240 | u >> 18; - heap[outIdx++] = 128 | u >> 12 & 63; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } - } - heap[outIdx] = 0; - return outIdx - startIdx; - }; - var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - var _environ_get = (__environ, environ_buf) => { - var bufSize = 0; - var envp = 0; - for (var string of getEnvStrings()) { - var ptr = environ_buf + bufSize; - HEAPU32[__environ + envp >> 2] = ptr; - bufSize += stringToUTF8(string, ptr, Infinity) + 1; - envp += 4; - } - return 0; - }; - var lengthBytesUTF8 = str => { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var c = str.charCodeAt(i); - if (c <= 127) { - len++; - } else if (c <= 2047) { - len += 2; - } else if (c >= 55296 && c <= 57343) { - len += 4; - ++i; - } else { - len += 3; - } - } - return len; - }; - var _environ_sizes_get = (penviron_count, penviron_buf_size) => { - var strings = getEnvStrings(); - HEAPU32[penviron_count >> 2] = strings.length; - var bufSize = 0; - for (var string of strings) { - bufSize += lengthBytesUTF8(string) + 1; - } - HEAPU32[penviron_buf_size >> 2] = bufSize; - return 0; - }; - var _fd_close = fd => 52; - var INT53_MAX = 9007199254740992; - var INT53_MIN = -9007199254740992; - var bigintToI53Checked = num => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num); - function _fd_seek(fd, offset, whence, newOffset) { - offset = bigintToI53Checked(offset); - return 70; - } - var printCharBuffers = [null, [], []]; - var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : undefined; - var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; - if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { - return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); - } - var str = ""; - while (idx < endPtr) { - var u0 = heapOrArray[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heapOrArray[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heapOrArray[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); - } - } - return str; - }; - var printChar = (stream, curr) => { - var buffer = printCharBuffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); - buffer.length = 0; - } else { - buffer.push(curr); - } - }; - var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - var _fd_write = (fd, iov, iovcnt, pnum) => { - var num = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAPU32[iov >> 2]; - var len = HEAPU32[iov + 4 >> 2]; - iov += 8; - for (var j = 0; j < len; j++) { - printChar(fd, HEAPU8[ptr + j]); - } - num += len; - } - HEAPU32[pnum >> 2] = num; - return 0; - }; - function _gray_to_rgba(compG_ptr, nb_pixels) { - compG_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - for (let i = 0; i < nb_pixels; i++) { - imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; - imageData[4 * i + 3] = 255; - } - } - function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { - compG_ptr >>= 2; - compA_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - const compA = HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); - for (let i = 0; i < nb_pixels; i++) { - imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; - imageData[4 * i + 3] = compA[i]; - } - } - function _jsPrintWarning(message_ptr) { - const message = UTF8ToString(message_ptr); - (Module.warn || console.warn)(`OpenJPEG: ${message}`); - } - function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { - compR_ptr >>= 2; - compG_ptr >>= 2; - compB_ptr >>= 2; - const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); - const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); - const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); - const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); - for (let i = 0; i < nb_pixels; i++) { - imageData[4 * i] = compR[i]; - imageData[4 * i + 1] = compG[i]; - imageData[4 * i + 2] = compB[i]; - imageData[4 * i + 3] = 255; - } - } - function _storeErrorMessage(message_ptr) { - const message = UTF8ToString(message_ptr); - if (!Module.errorMessages) { - Module.errorMessages = message; - } else { - Module.errorMessages += "\n" + message; - } - } - var writeArrayToMemory = (array, buffer) => { - HEAP8.set(array, buffer); - }; - if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; - if (Module["print"]) out = Module["print"]; - if (Module["printErr"]) err = Module["printErr"]; - if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; - if (Module["arguments"]) arguments_ = Module["arguments"]; - if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; - Module["writeArrayToMemory"] = writeArrayToMemory; - var wasmImports = { - l: __abort_js, - k: __emscripten_runtime_keepalive_clear, - m: __setitimer_js, - g: _copy_pixels_1, - f: _copy_pixels_3, - e: _copy_pixels_4, - n: _emscripten_resize_heap, - p: _environ_get, - q: _environ_sizes_get, - b: _fd_close, - o: _fd_seek, - c: _fd_write, - r: _gray_to_rgba, - i: _graya_to_rgba, - d: _jsPrintWarning, - j: _proc_exit, - h: _rgb_to_rgba, - a: _storeErrorMessage - }; - var wasmExports = await createWasm(); - var ___wasm_call_ctors = wasmExports["t"]; - var _malloc = Module["_malloc"] = wasmExports["u"]; - var _free = Module["_free"] = wasmExports["v"]; - var _jp2_decode = Module["_jp2_decode"] = wasmExports["w"]; - var __emscripten_timeout = wasmExports["x"]; - function run() { - if (runDependencies > 0) { - dependenciesFulfilled = run; - return; - } - preRun(); - if (runDependencies > 0) { - dependenciesFulfilled = run; - return; - } - function doRun() { - Module["calledRun"] = true; - if (ABORT) return; - initRuntime(); - readyPromiseResolve(Module); - Module["onRuntimeInitialized"]?.(); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(() => { - setTimeout(() => Module["setStatus"](""), 1); - doRun(); - }, 1); - } else { - doRun(); - } - } - function preInit() { - if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; - while (Module["preInit"].length > 0) { - Module["preInit"].shift()(); - } - } - } - preInit(); - run(); - moduleRtn = readyPromise; - return moduleRtn; - }; -})(); -/* harmony default export */ const openjpeg = (OpenJPEG); -;// ./src/core/jpx.js - - - - -class JpxError extends BaseException { - constructor(msg) { - super(msg, "JpxError"); - } -} -class JpxImage { - static #buffer = null; - static #handler = null; - static #modulePromise = null; - static #useWasm = true; - static #useWorkerFetch = true; - static #wasmUrl = null; - static setOptions({ - handler, - useWasm, - useWorkerFetch, - wasmUrl - }) { - this.#useWasm = useWasm; - this.#useWorkerFetch = useWorkerFetch; - this.#wasmUrl = wasmUrl; - if (!useWorkerFetch) { - this.#handler = handler; - } - } - static async #getJsModule(fallbackCallback) { - const path = `${this.#wasmUrl}openjpeg_nowasm_fallback.js`; - let instance = null; - try { - const mod = await import( - /*webpackIgnore: true*/ - /*@vite-ignore*/ - path); - instance = mod.default(); - } catch (e) { - warn(`JpxImage#getJsModule: ${e}`); - } - fallbackCallback(instance); - } - static async #instantiateWasm(fallbackCallback, imports, successCallback) { - const filename = "openjpeg.wasm"; - try { - if (!this.#buffer) { - if (this.#useWorkerFetch) { - this.#buffer = await fetchBinaryData(`${this.#wasmUrl}${filename}`); - } else { - this.#buffer = await this.#handler.sendWithPromise("FetchBinaryData", { - type: "wasmFactory", - filename - }); - } - } - const results = await WebAssembly.instantiate(this.#buffer, imports); - return successCallback(results.instance); - } catch (reason) { - warn(`JpxImage#instantiateWasm: ${reason}`); - this.#getJsModule(fallbackCallback); - return null; - } finally { - this.#handler = null; - } - } - static async decode(bytes, { - numComponents = 4, - isIndexedColormap = false, - smaskInData = false, - reducePower = 0 - } = {}) { - if (!this.#modulePromise) { - const { - promise, - resolve - } = Promise.withResolvers(); - const promises = [promise]; - if (!this.#useWasm) { - this.#getJsModule(resolve); - } else { - promises.push(openjpeg({ - warn: warn, - instantiateWasm: this.#instantiateWasm.bind(this, resolve) - })); - } - this.#modulePromise = Promise.race(promises); - } - const module = await this.#modulePromise; - if (!module) { - throw new JpxError("OpenJPEG failed to initialize"); - } - let ptr; - try { - const size = bytes.length; - ptr = module._malloc(size); - module.writeArrayToMemory(bytes, ptr); - const ret = module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData, reducePower); - if (ret) { - const { - errorMessages - } = module; - if (errorMessages) { - delete module.errorMessages; - throw new JpxError(errorMessages); - } - throw new JpxError("Unknown error"); - } - const { - imageData - } = module; - module.imageData = null; - return imageData; - } finally { - if (ptr) { - module._free(ptr); - } - } - } - static cleanup() { - this.#modulePromise = null; - } - static parseImageProperties(stream) { - let newByte = stream.getByte(); - while (newByte >= 0) { - const oldByte = newByte; - newByte = stream.getByte(); - const code = oldByte << 8 | newByte; - if (code === 0xff51) { - stream.skip(4); - const Xsiz = stream.getInt32() >>> 0; - const Ysiz = stream.getInt32() >>> 0; - const XOsiz = stream.getInt32() >>> 0; - const YOsiz = stream.getInt32() >>> 0; - stream.skip(16); - const Csiz = stream.getUint16(); - return { - width: Xsiz - XOsiz, - height: Ysiz - YOsiz, - bitsPerComponent: 8, - componentsCount: Csiz - }; - } - } - throw new JpxError("No size marker found in JPX stream"); - } -} - -;// ./src/core/operator_list.js - -function addState(parentState, pattern, checkFn, iterateFn, processFn) { - let state = parentState; - for (let i = 0, ii = pattern.length - 1; i < ii; i++) { - const item = pattern[i]; - state = state[item] ||= []; - } - state[pattern.at(-1)] = { - checkFn, - iterateFn, - processFn - }; -} -const InitialState = []; -addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { - const fnArray = context.fnArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - return fnArray[i] === OPS.transform; - case 2: - return fnArray[i] === OPS.paintInlineImageXObject; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); -}, function foundInlineImageGroup(context, i) { - const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - const MAX_WIDTH = 1000; - const IMAGE_PADDING = 1; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIIXO = curr - 1; - const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i - (i - iFirstSave) % 4; - } - let maxX = 0; - const map = []; - let maxLineHeight = 0; - let currentX = IMAGE_PADDING, - currentY = IMAGE_PADDING; - for (let q = 0; q < count; q++) { - const transform = argsArray[iFirstTransform + (q << 2)]; - const img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform, - x: currentX, - y: currentY, - w: img.width, - h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - const imgData = new Uint8Array(imgWidth * imgHeight * 4); - const imgRowSize = imgWidth << 2; - for (let q = 0; q < count; q++) { - const data = argsArray[iFirstPIIXO + (q << 2)][0].data; - const rowSize = map[q].w << 2; - let dataOffset = 0; - let offset = map[q].x + map[q].y * imgWidth << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (let k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - const img = { - width: imgWidth, - height: imgHeight - }; - if (context.isOffscreenCanvasSupported) { - const canvas = new OffscreenCanvas(imgWidth, imgHeight); - const ctx = canvas.getContext("2d"); - ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); - img.bitmap = canvas.transferToImageBitmap(); - img.data = null; - } else { - img.kind = ImageKind.RGBA_32BPP; - img.data = imgData; - } - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [img, map]); - return iFirstSave + 1; -}); -addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { - const fnArray = context.fnArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - return fnArray[i] === OPS.transform; - case 2: - return fnArray[i] === OPS.paintImageMaskXObject; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); -}, function foundImageMaskGroup(context, i) { - const MIN_IMAGES_IN_MASKS_BLOCK = 10; - const MAX_IMAGES_IN_MASKS_BLOCK = 100; - const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIMXO = curr - 1; - let count = Math.floor((i - iFirstSave) / 4); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i - (i - iFirstSave) % 4; - } - let isSameImage = false; - let iTransform, transformArgs; - const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - const firstTransformArg0 = argsArray[iFirstTransform][0], - firstTransformArg1 = argsArray[iFirstTransform][1], - firstTransformArg2 = argsArray[iFirstTransform][2], - firstTransformArg3 = argsArray[iFirstTransform][3]; - if (firstTransformArg1 === firstTransformArg2) { - isSameImage = true; - iTransform = iFirstTransform + 4; - let iPIMXO = iFirstPIMXO + 4; - for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; - } - } - } - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - const positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (let q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[q << 1] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - const images = []; - for (let q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ - data: maskParams.data, - width: maskParams.width, - height: maskParams.height, - interpolate: maskParams.interpolate, - count: maskParams.count, - transform: transformArgs - }); - } - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - return iFirstSave + 1; -}); -addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { - const argsArray = context.argsArray; - const iFirstTransform = context.iCurr - 2; - return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; -}, function iterateImageGroup(context, i) { - const fnArray = context.fnArray, - argsArray = context.argsArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - if (fnArray[i] !== OPS.transform) { - return false; - } - const iFirstTransform = context.iCurr - 2; - const firstTransformArg0 = argsArray[iFirstTransform][0]; - const firstTransformArg3 = argsArray[iFirstTransform][3]; - if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { - return false; - } - return true; - case 2: - if (fnArray[i] !== OPS.paintImageXObject) { - return false; - } - const iFirstPIXO = context.iCurr - 1; - const firstPIXOArg0 = argsArray[iFirstPIXO][0]; - if (argsArray[i][0] !== firstPIXOArg0) { - return false; - } - return true; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateImageGroup - invalid pos: ${pos}`); -}, function (context, i) { - const MIN_IMAGES_IN_BLOCK = 3; - const MAX_IMAGES_IN_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIXO = curr - 1; - const firstPIXOArg0 = argsArray[iFirstPIXO][0]; - const firstTransformArg0 = argsArray[iFirstTransform][0]; - const firstTransformArg3 = argsArray[iFirstTransform][3]; - const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i - (i - iFirstSave) % 4; - } - const positions = new Float32Array(count * 2); - let iTransform = iFirstTransform; - for (let q = 0; q < count; q++, iTransform += 4) { - const transformArgs = argsArray[iTransform]; - positions[q << 1] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - return iFirstSave + 1; -}); -addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { - const fnArray = context.fnArray, - argsArray = context.argsArray; - const iFirstSave = context.iCurr - 4; - const pos = (i - iFirstSave) % 5; - switch (pos) { - case 0: - return fnArray[i] === OPS.beginText; - case 1: - return fnArray[i] === OPS.setFont; - case 2: - return fnArray[i] === OPS.setTextMatrix; - case 3: - if (fnArray[i] !== OPS.showText) { - return false; - } - const iFirstSetFont = context.iCurr - 3; - const firstSetFontArg0 = argsArray[iFirstSetFont][0]; - const firstSetFontArg1 = argsArray[iFirstSetFont][1]; - if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { - return false; - } - return true; - case 4: - return fnArray[i] === OPS.endText; - } - throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); -}, function (context, i) { - const MIN_CHARS_IN_BLOCK = 3; - const MAX_CHARS_IN_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstBeginText = curr - 4; - const iFirstSetFont = curr - 3; - const iFirstSetTextMatrix = curr - 2; - const iFirstShowText = curr - 1; - const iFirstEndText = curr; - const firstSetFontArg0 = argsArray[iFirstSetFont][0]; - const firstSetFontArg1 = argsArray[iFirstSetFont][1]; - let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i - (i - iFirstBeginText) % 5; - } - let iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - let iEndText = iFirst + 4; - for (let q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - return iEndText + 1; -}); -addState(InitialState, [OPS.save, OPS.transform, OPS.constructPath, OPS.restore], context => { - const argsArray = context.argsArray; - const iFirstConstructPath = context.iCurr - 1; - const op = argsArray[iFirstConstructPath][0]; - if (op !== OPS.stroke && op !== OPS.closeStroke && op !== OPS.fillStroke && op !== OPS.eoFillStroke && op !== OPS.closeFillStroke && op !== OPS.closeEOFillStroke) { - return true; - } - const iFirstTransform = context.iCurr - 2; - const transform = argsArray[iFirstTransform]; - return transform[0] === 1 && transform[1] === 0 && transform[2] === 0 && transform[3] === 1; -}, () => false, (context, i) => { - const { - fnArray, - argsArray - } = context; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstConstructPath = curr - 1; - const args = argsArray[iFirstConstructPath]; - const transform = argsArray[iFirstTransform]; - const [, [buffer], minMax] = args; - if (minMax) { - Util.scaleMinMax(transform, minMax); - for (let k = 0, kk = buffer.length; k < kk;) { - switch (buffer[k++]) { - case DrawOPS.moveTo: - case DrawOPS.lineTo: - Util.applyTransform(buffer, transform, k); - k += 2; - break; - case DrawOPS.curveTo: - Util.applyTransformToBezier(buffer, transform, k); - k += 6; - break; - } - } - } - fnArray.splice(iFirstSave, 4, OPS.constructPath); - argsArray.splice(iFirstSave, 4, args); - return iFirstSave + 1; -}); -class NullOptimizer { - constructor(queue) { - this.queue = queue; - } - _optimize() {} - push(fn, args) { - this.queue.fnArray.push(fn); - this.queue.argsArray.push(args); - this._optimize(); - } - flush() {} - reset() {} -} -class QueueOptimizer extends NullOptimizer { - constructor(queue) { - super(queue); - this.state = null; - this.context = { - iCurr: 0, - fnArray: queue.fnArray, - argsArray: queue.argsArray, - isOffscreenCanvasSupported: OperatorList.isOffscreenCanvasSupported - }; - this.match = null; - this.lastProcessed = 0; - } - _optimize() { - const fnArray = this.queue.fnArray; - let i = this.lastProcessed, - ii = fnArray.length; - let state = this.state; - let match = this.match; - if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { - this.lastProcessed = ii; - return; - } - const context = this.context; - while (i < ii) { - if (match) { - const iterate = (0, match.iterateFn)(context, i); - if (iterate) { - i++; - continue; - } - i = (0, match.processFn)(context, i + 1); - ii = fnArray.length; - match = null; - state = null; - if (i >= ii) { - break; - } - } - state = (state || InitialState)[fnArray[i]]; - if (!state || Array.isArray(state)) { - i++; - continue; - } - context.iCurr = i; - i++; - if (state.checkFn && !(0, state.checkFn)(context)) { - state = null; - continue; - } - match = state; - state = null; - } - this.state = state; - this.match = match; - this.lastProcessed = i; - } - flush() { - while (this.match) { - const length = this.queue.fnArray.length; - this.lastProcessed = (0, this.match.processFn)(this.context, length); - this.match = null; - this.state = null; - this._optimize(); - } - } - reset() { - this.state = null; - this.match = null; - this.lastProcessed = 0; - } -} -class OperatorList { - static CHUNK_SIZE = 1000; - static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; - static isOffscreenCanvasSupported = false; - constructor(intent = 0, streamSink) { - this._streamSink = streamSink; - this.fnArray = []; - this.argsArray = []; - this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); - this.dependencies = new Set(); - this._totalLength = 0; - this.weight = 0; - this._resolved = streamSink ? null : Promise.resolve(); - } - static setOptions({ - isOffscreenCanvasSupported - }) { - this.isOffscreenCanvasSupported = isOffscreenCanvasSupported; - } - get length() { - return this.argsArray.length; - } - get ready() { - return this._resolved || this._streamSink.ready; - } - get totalLength() { - return this._totalLength + this.length; - } - addOp(fn, args) { - this.optimizer.push(fn, args); - this.weight++; - if (this._streamSink) { - if (this.weight >= OperatorList.CHUNK_SIZE) { - this.flush(); - } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { - this.flush(); - } - } - } - addImageOps(fn, args, optionalContent, hasMask = false) { - if (hasMask) { - this.addOp(OPS.save); - this.addOp(OPS.setGState, [[["SMask", false]]]); - } - if (optionalContent !== undefined) { - this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); - } - this.addOp(fn, args); - if (optionalContent !== undefined) { - this.addOp(OPS.endMarkedContent, []); - } - if (hasMask) { - this.addOp(OPS.restore); - } - } - addDependency(dependency) { - if (this.dependencies.has(dependency)) { - return; - } - this.dependencies.add(dependency); - this.addOp(OPS.dependency, [dependency]); - } - addDependencies(dependencies) { - for (const dependency of dependencies) { - this.addDependency(dependency); - } - } - addOpList(opList) { - if (!(opList instanceof OperatorList)) { - warn('addOpList - ignoring invalid "opList" parameter.'); - return; - } - for (const dependency of opList.dependencies) { - this.dependencies.add(dependency); - } - for (let i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - } - getIR() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - } - get _transfers() { - const transfers = []; - const { - fnArray, - argsArray, - length - } = this; - for (let i = 0; i < length; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - { - const { - bitmap, - data - } = argsArray[i][0]; - if (bitmap || data?.buffer) { - transfers.push(bitmap || data.buffer); - } - break; - } - case OPS.constructPath: - { - const [, [data], minMax] = argsArray[i]; - if (data) { - transfers.push(data.buffer, minMax.buffer); - } - break; - } - case OPS.paintFormXObjectBegin: - const [matrix, bbox] = argsArray[i]; - if (matrix) { - transfers.push(matrix.buffer); - } - if (bbox) { - transfers.push(bbox.buffer); - } - break; - case OPS.setTextMatrix: - transfers.push(argsArray[i][0].buffer); - break; - } - } - return transfers; - } - flush(lastChunk = false, separateAnnots = null) { - this.optimizer.flush(); - const length = this.length; - this._totalLength += length; - this._streamSink.enqueue({ - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk, - separateAnnots, - length - }, 1, this._transfers); - this.dependencies.clear(); - this.fnArray.length = 0; - this.argsArray.length = 0; - this.weight = 0; - this.optimizer.reset(); - } -} - -;// ./src/core/binary_cmap.js - -function hexToInt(a, size) { - let n = 0; - for (let i = 0; i <= size; i++) { - n = n << 8 | a[i]; - } - return n >>> 0; -} -function hexToStr(a, size) { - if (size === 1) { - return String.fromCharCode(a[0], a[1]); - } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); - } - return String.fromCharCode(...a.subarray(0, size + 1)); -} -function addHex(a, b, size) { - let c = 0; - for (let i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; - } -} -function incHex(a, size) { - let c = 1; - for (let i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; - } -} -const MAX_NUM_SIZE = 16; -const MAX_ENCODED_NUM_SIZE = 19; -class BinaryCMapStream { - constructor(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); - } - readByte() { - if (this.pos >= this.end) { - return -1; - } - return this.buffer[this.pos++]; - } - readNumber() { - let n = 0; - let last; - do { - const b = this.readByte(); - if (b < 0) { - throw new FormatError("unexpected EOF in bcmap"); - } - last = !(b & 0x80); - n = n << 7 | b & 0x7f; - } while (!last); - return n; - } - readSigned() { - const n = this.readNumber(); - return n & 1 ? ~(n >>> 1) : n >>> 1; - } - readHex(num, size) { - num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); - this.pos += size + 1; - } - readHexNumber(num, size) { - let last; - const stack = this.tmpBuf; - let sp = 0; - do { - const b = this.readByte(); - if (b < 0) { - throw new FormatError("unexpected EOF in bcmap"); - } - last = !(b & 0x80); - stack[sp++] = b & 0x7f; - } while (!last); - let i = size, - buffer = 0, - bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer |= stack[--sp] << bufferSize; - bufferSize += 7; - } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; - } - } - readHexSigned(num, size) { - this.readHexNumber(num, size); - const sign = num[size] & 1 ? 255 : 0; - let c = 0; - for (let i = 0; i <= size; i++) { - c = (c & 1) << 8 | num[i]; - num[i] = c >> 1 ^ sign; - } - } - readString() { - const len = this.readNumber(), - buf = new Array(len); - for (let i = 0; i < len; i++) { - buf[i] = this.readNumber(); - } - return String.fromCharCode(...buf); - } -} -class BinaryCMapReader { - async process(data, cMap, extend) { - const stream = new BinaryCMapStream(data); - const header = stream.readByte(); - cMap.vertical = !!(header & 1); - let useCMap = null; - const start = new Uint8Array(MAX_NUM_SIZE); - const end = new Uint8Array(MAX_NUM_SIZE); - const char = new Uint8Array(MAX_NUM_SIZE); - const charCode = new Uint8Array(MAX_NUM_SIZE); - const tmp = new Uint8Array(MAX_NUM_SIZE); - let code; - let b; - while ((b = stream.readByte()) >= 0) { - const type = b >> 5; - if (type === 7) { - switch (b & 0x1f) { - case 0: - stream.readString(); - break; - case 1: - useCMap = stream.readString(); - break; - } - continue; - } - const sequence = !!(b & 0x10); - const dataSize = b & 15; - if (dataSize + 1 > MAX_NUM_SIZE) { - throw new Error("BinaryCMapReader.process: Invalid dataSize."); - } - const ucs2DataSize = 1; - const subitemsCount = stream.readNumber(); - switch (type) { - case 0: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); - } - break; - case 1: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - stream.readNumber(); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - stream.readNumber(); - } - break; - case 2: - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (let i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } - break; - case 3: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); - } - break; - case 4: - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); - } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); - } - break; - case 5: - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); - } - break; - default: - throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); - } - } - if (useCMap) { - return extend(useCMap); - } - return cMap; - } -} - -;// ./src/core/ascii_85_stream.js - - -class Ascii85Stream extends DecodeStream { - constructor(str, maybeLength) { - if (maybeLength) { - maybeLength *= 0.8; - } - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - } - readBlock() { - const TILDA_CHAR = 0x7e; - const Z_LOWER_CHAR = 0x7a; - const EOF = -1; - const str = this.str; - let c = str.getByte(); - while (isWhiteSpace(c)) { - c = str.getByte(); - } - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - const bufferLength = this.bufferLength; - let buffer, i; - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - const input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (isWhiteSpace(c)) { - c = str.getByte(); - } - input[i] = c; - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - let t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xff; - t >>= 8; - } - } - } -} - -;// ./src/core/ascii_hex_stream.js - -class AsciiHexStream extends DecodeStream { - constructor(str, maybeLength) { - if (maybeLength) { - maybeLength *= 0.5; - } - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.firstDigit = -1; - } - readBlock() { - const UPSTREAM_BLOCK_SIZE = 8000; - const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - const maxDecodeLength = bytes.length + 1 >> 1; - const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - let bufferLength = this.bufferLength; - let firstDigit = this.firstDigit; - for (const ch of bytes) { - let digit; - if (ch >= 0x30 && ch <= 0x39) { - digit = ch & 0x0f; - } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { - digit = (ch & 0x0f) + 9; - } else if (ch === 0x3e) { - this.eof = true; - break; - } else { - continue; - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = firstDigit << 4 | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - buffer[bufferLength++] = firstDigit << 4; - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - } -} - -;// ./src/core/ccitt.js - -const ccittEOL = -2; -const ccittEOF = -1; -const twoDimPass = 0; -const twoDimHoriz = 1; -const twoDimVert0 = 2; -const twoDimVertR1 = 3; -const twoDimVertL1 = 4; -const twoDimVertR2 = 5; -const twoDimVertL2 = 6; -const twoDimVertR3 = 7; -const twoDimVertL3 = 8; -const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; -const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; -const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; -const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; -const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; -const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; -class CCITTFaxDecoder { - constructor(source, options = {}) { - if (typeof source?.next !== "function") { - throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); - } - this.source = source; - this.eof = false; - this.encoding = options.K || 0; - this.eoline = options.EndOfLine || false; - this.byteAlign = options.EncodedByteAlign || false; - this.columns = options.Columns || 1728; - this.rows = options.Rows || 0; - this.eoblock = options.EndOfBlock ?? true; - this.black = options.BlackIs1 || false; - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - this.codingLine[0] = this.columns; - this.codingPos = 0; - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - this.rowsDone = false; - let code1; - while ((code1 = this._lookBits(12)) === 0) { - this._eatBits(1); - } - if (code1 === 1) { - this._eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this._lookBits(1); - this._eatBits(1); - } - } - readNextChar() { - if (this.eof) { - return -1; - } - const refLine = this.refLine; - const codingLine = this.codingLine; - const columns = this.columns; - let refPos, blackPixels, bits, i; - if (this.outputBits === 0) { - if (this.rowsDone) { - this.eof = true; - } - if (this.eof) { - return -1; - } - this.err = false; - let code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = this._getTwoDimCode(); - switch (code1) { - case twoDimPass: - this._addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += code3 = this._getBlackCode(); - } while (code3 >= 64); - do { - code2 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - do { - code2 += code3 = this._getBlackCode(); - } while (code3 >= 64); - } - this._addPixels(codingLine[this.codingPos] + code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this._addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this._addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this._addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this._addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this._addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this._addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this._addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case ccittEOF: - this._addPixels(columns, 0); - this.eof = true; - break; - default: - info("bad 2d code"); - this._addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += code3 = this._getBlackCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - } - this._addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - let gotEOL = false; - if (this.byteAlign) { - this.inputBits &= ~7; - } - if (!this.eoblock && this.row === this.rows - 1) { - this.rowsDone = true; - } else { - code1 = this._lookBits(12); - if (this.eoline) { - while (code1 !== ccittEOF && code1 !== 1) { - this._eatBits(1); - code1 = this._lookBits(12); - } - } else { - while (code1 === 0) { - this._eatBits(1); - code1 = this._lookBits(12); - } - } - if (code1 === 1) { - this._eatBits(12); - gotEOL = true; - } else if (code1 === ccittEOF) { - this.eof = true; - } - } - if (!this.eof && this.encoding > 0 && !this.rowsDone) { - this.nextLine2D = !this._lookBits(1); - this._eatBits(1); - } - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this._lookBits(12); - if (code1 === 1) { - this._eatBits(12); - if (this.encoding > 0) { - this._lookBits(1); - this._eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this._lookBits(12); - if (code1 !== 1) { - info("bad rtc code: " + code1); - } - this._eatBits(12); - if (this.encoding > 0) { - this._lookBits(1); - this._eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this._lookBits(13); - if (code1 === ccittEOF) { - this.eof = true; - return -1; - } - if (code1 >> 1 === 1) { - break; - } - this._eatBits(1); - } - this._eatBits(12); - if (this.encoding > 0) { - this._eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1]; - this.row++; - } - let c; - if (this.outputBits >= 8) { - c = this.codingPos & 1 ? 0 : 0xff; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; - } - } else { - bits = 8; - c = 0; - do { - if (typeof this.outputBits !== "number") { - throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); - } - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xff >> 8 - bits; - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xff >> 8 - this.outputBits; - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xff; - } - return c; - } - _addPixels(a1, blackPixels) { - const codingLine = this.codingLine; - let codingPos = this.codingPos; - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info("row is wrong length"); - this.err = true; - a1 = this.columns; - } - if (codingPos & 1 ^ blackPixels) { - ++codingPos; - } - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - } - _addPixelsNeg(a1, blackPixels) { - const codingLine = this.codingLine; - let codingPos = this.codingPos; - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info("row is wrong length"); - this.err = true; - a1 = this.columns; - } - if (codingPos & 1 ^ blackPixels) { - ++codingPos; - } - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info("invalid code"); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - } - _findTableCode(start, end, table, limit) { - const limitValue = limit || 0; - for (let i = start; i <= end; ++i) { - let code = this._lookBits(i); - if (code === ccittEOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - const p = table[code - limitValue]; - if (p[0] === i) { - this._eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - } - _getTwoDimCode() { - let code = 0; - let p; - if (this.eoblock) { - code = this._lookBits(7); - p = twoDimTable[code]; - if (p?.[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - const result = this._findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info("Bad two dim code"); - return ccittEOF; - } - _getWhiteCode() { - let code = 0; - let p; - if (this.eoblock) { - code = this._lookBits(12); - if (code === ccittEOF) { - return 1; - } - p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; - if (p[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - let result = this._findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info("bad white code"); - this._eatBits(1); - return 1; - } - _getBlackCode() { - let code, p; - if (this.eoblock) { - code = this._lookBits(13); - if (code === ccittEOF) { - return 1; - } - if (code >> 7 === 0) { - p = blackTable1[code]; - } else if (code >> 9 === 0 && code >> 7 !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - if (p[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - let result = this._findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info("bad black code"); - this._eatBits(1); - return 1; - } - _lookBits(n) { - let c; - while (this.inputBits < n) { - if ((c = this.source.next()) === -1) { - if (this.inputBits === 0) { - return ccittEOF; - } - return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; - } - this.inputBuf = this.inputBuf << 8 | c; - this.inputBits += 8; - } - return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; - } - _eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - } -} - -;// ./src/core/ccitt_stream.js - - - -class CCITTFaxStream extends DecodeStream { - constructor(str, maybeLength, params) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - if (!(params instanceof Dict)) { - params = Dict.empty; - } - const source = { - next() { - return str.getByte(); - } - }; - this.ccittFaxDecoder = new CCITTFaxDecoder(source, { - K: params.get("K"), - EndOfLine: params.get("EndOfLine"), - EncodedByteAlign: params.get("EncodedByteAlign"), - Columns: params.get("Columns"), - Rows: params.get("Rows"), - EndOfBlock: params.get("EndOfBlock"), - BlackIs1: params.get("BlackIs1") - }); - } - readBlock() { - while (!this.eof) { - const c = this.ccittFaxDecoder.readNextChar(); - if (c === -1) { - this.eof = true; - return; - } - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - } -} - -;// ./src/core/flate_stream.js - - - -const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); -const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); -const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); -const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; -const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; -class FlateStream extends DecodeStream { - constructor(str, maybeLength) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - const cmf = str.getByte(); - const flg = str.getByte(); - if (cmf === -1 || flg === -1) { - throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); - } - if ((cmf & 0x0f) !== 0x08) { - throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); - } - if (((cmf << 8) + flg) % 31 !== 0) { - throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); - } - if (flg & 0x20) { - throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); - } - this.codeSize = 0; - this.codeBuf = 0; - } - async getImageData(length, _decoderOptions) { - const data = await this.asyncGetBytes(); - if (!data) { - return this.getBytes(length); - } - if (data.length <= length) { - return data; - } - return data.subarray(0, length); - } - async asyncGetBytes() { - this.str.reset(); - const bytes = this.str.getBytes(); - try { - const { - readable, - writable - } = new DecompressionStream("deflate"); - const writer = writable.getWriter(); - await writer.ready; - writer.write(bytes).then(async () => { - await writer.ready; - await writer.close(); - }).catch(() => {}); - const chunks = []; - let totalLength = 0; - for await (const chunk of readable) { - chunks.push(chunk); - totalLength += chunk.byteLength; - } - const data = new Uint8Array(totalLength); - let offset = 0; - for (const chunk of chunks) { - data.set(chunk, offset); - offset += chunk.byteLength; - } - return data; - } catch { - this.str = new Stream(bytes, 2, bytes.length, this.str.dict); - this.reset(); - return null; - } - } - get isAsync() { - return true; - } - getBits(bits) { - const str = this.str; - let codeSize = this.codeSize; - let codeBuf = this.codeBuf; - let b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - throw new FormatError("Bad encoding in flate stream"); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & (1 << bits) - 1; - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - return b; - } - getCode(table) { - const str = this.str; - const codes = table[0]; - const maxLen = table[1]; - let codeSize = this.codeSize; - let codeBuf = this.codeBuf; - let b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - break; - } - codeBuf |= b << codeSize; - codeSize += 8; - } - const code = codes[codeBuf & (1 << maxLen) - 1]; - const codeLen = code >> 16; - const codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - throw new FormatError("Bad encoding in flate stream"); - } - this.codeBuf = codeBuf >> codeLen; - this.codeSize = codeSize - codeLen; - return codeVal; - } - generateHuffmanTable(lengths) { - const n = lengths.length; - let maxLen = 0; - let i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - const size = 1 << maxLen; - const codes = new Int32Array(size); - for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { - for (let val = 0; val < n; ++val) { - if (lengths[val] === len) { - let code2 = 0; - let t = code; - for (i = 0; i < len; ++i) { - code2 = code2 << 1 | t & 1; - t >>= 1; - } - for (i = code2; i < size; i += skip) { - codes[i] = len << 16 | val; - } - ++code; - } - } - } - return [codes, maxLen]; - } - #endsStreamOnError(err) { - info(err); - this.eof = true; - } - readBlock() { - let buffer, hdr, len; - const str = this.str; - try { - hdr = this.getBits(3); - } catch (ex) { - this.#endsStreamOnError(ex.message); - return; - } - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - if (hdr === 0) { - let b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - let blockLen = b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - blockLen |= b << 8; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - let check = b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - check |= b << 8; - if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { - throw new FormatError("Bad uncompressed block length in flate stream"); - } - this.codeBuf = 0; - this.codeSize = 0; - const bufferLength = this.bufferLength, - end = bufferLength + blockLen; - buffer = this.ensureBuffer(end); - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - const block = str.getBytes(blockLen); - buffer.set(block, bufferLength); - if (block.length < blockLen) { - this.eof = true; - } - } - return; - } - let litCodeTable; - let distCodeTable; - if (hdr === 1) { - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { - const numLitCodes = this.getBits(5) + 257; - const numDistCodes = this.getBits(5) + 1; - const numCodeLenCodes = this.getBits(4) + 4; - const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - let i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - len = 0; - i = 0; - const codes = numLitCodes + numDistCodes; - const codeLengths = new Uint8Array(codes); - let bitsLength, bitsOffset, what; - while (i < codes) { - const code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; - bitsOffset = 3; - what = len; - } else if (code === 17) { - bitsLength = 3; - bitsOffset = 3; - what = len = 0; - } else if (code === 18) { - bitsLength = 7; - bitsOffset = 11; - what = len = 0; - } else { - codeLengths[i++] = len = code; - continue; - } - let repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } - } - litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - throw new FormatError("Unknown block type in flate stream"); - } - buffer = this.buffer; - let limit = buffer ? buffer.length : 0; - let pos = this.bufferLength; - while (true) { - let code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - let code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - const dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (let k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; - } - } - } -} - -;// ./src/core/arithmetic_decoder.js -const QeTable = [{ - qe: 0x5601, - nmps: 1, - nlps: 1, - switchFlag: 1 -}, { - qe: 0x3401, - nmps: 2, - nlps: 6, - switchFlag: 0 -}, { - qe: 0x1801, - nmps: 3, - nlps: 9, - switchFlag: 0 -}, { - qe: 0x0ac1, - nmps: 4, - nlps: 12, - switchFlag: 0 -}, { - qe: 0x0521, - nmps: 5, - nlps: 29, - switchFlag: 0 -}, { - qe: 0x0221, - nmps: 38, - nlps: 33, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 7, - nlps: 6, - switchFlag: 1 -}, { - qe: 0x5401, - nmps: 8, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x4801, - nmps: 9, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x3801, - nmps: 10, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x3001, - nmps: 11, - nlps: 17, - switchFlag: 0 -}, { - qe: 0x2401, - nmps: 12, - nlps: 18, - switchFlag: 0 -}, { - qe: 0x1c01, - nmps: 13, - nlps: 20, - switchFlag: 0 -}, { - qe: 0x1601, - nmps: 29, - nlps: 21, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 15, - nlps: 14, - switchFlag: 1 -}, { - qe: 0x5401, - nmps: 16, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x5101, - nmps: 17, - nlps: 15, - switchFlag: 0 -}, { - qe: 0x4801, - nmps: 18, - nlps: 16, - switchFlag: 0 -}, { - qe: 0x3801, - nmps: 19, - nlps: 17, - switchFlag: 0 -}, { - qe: 0x3401, - nmps: 20, - nlps: 18, - switchFlag: 0 -}, { - qe: 0x3001, - nmps: 21, - nlps: 19, - switchFlag: 0 -}, { - qe: 0x2801, - nmps: 22, - nlps: 19, - switchFlag: 0 -}, { - qe: 0x2401, - nmps: 23, - nlps: 20, - switchFlag: 0 -}, { - qe: 0x2201, - nmps: 24, - nlps: 21, - switchFlag: 0 -}, { - qe: 0x1c01, - nmps: 25, - nlps: 22, - switchFlag: 0 -}, { - qe: 0x1801, - nmps: 26, - nlps: 23, - switchFlag: 0 -}, { - qe: 0x1601, - nmps: 27, - nlps: 24, - switchFlag: 0 -}, { - qe: 0x1401, - nmps: 28, - nlps: 25, - switchFlag: 0 -}, { - qe: 0x1201, - nmps: 29, - nlps: 26, - switchFlag: 0 -}, { - qe: 0x1101, - nmps: 30, - nlps: 27, - switchFlag: 0 -}, { - qe: 0x0ac1, - nmps: 31, - nlps: 28, - switchFlag: 0 -}, { - qe: 0x09c1, - nmps: 32, - nlps: 29, - switchFlag: 0 -}, { - qe: 0x08a1, - nmps: 33, - nlps: 30, - switchFlag: 0 -}, { - qe: 0x0521, - nmps: 34, - nlps: 31, - switchFlag: 0 -}, { - qe: 0x0441, - nmps: 35, - nlps: 32, - switchFlag: 0 -}, { - qe: 0x02a1, - nmps: 36, - nlps: 33, - switchFlag: 0 -}, { - qe: 0x0221, - nmps: 37, - nlps: 34, - switchFlag: 0 -}, { - qe: 0x0141, - nmps: 38, - nlps: 35, - switchFlag: 0 -}, { - qe: 0x0111, - nmps: 39, - nlps: 36, - switchFlag: 0 -}, { - qe: 0x0085, - nmps: 40, - nlps: 37, - switchFlag: 0 -}, { - qe: 0x0049, - nmps: 41, - nlps: 38, - switchFlag: 0 -}, { - qe: 0x0025, - nmps: 42, - nlps: 39, - switchFlag: 0 -}, { - qe: 0x0015, - nmps: 43, - nlps: 40, - switchFlag: 0 -}, { - qe: 0x0009, - nmps: 44, - nlps: 41, - switchFlag: 0 -}, { - qe: 0x0005, - nmps: 45, - nlps: 42, - switchFlag: 0 -}, { - qe: 0x0001, - nmps: 45, - nlps: 43, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 46, - nlps: 46, - switchFlag: 0 -}]; -class ArithmeticDecoder { - constructor(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - this.chigh = data[start]; - this.clow = 0; - this.byteIn(); - this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; - this.clow = this.clow << 7 & 0xffff; - this.ct -= 7; - this.a = 0x8000; - } - byteIn() { - const data = this.data; - let bp = this.bp; - if (data[bp] === 0xff) { - if (data[bp + 1] > 0x8f) { - this.clow += 0xff00; - this.ct = 8; - } else { - bp++; - this.clow += data[bp] << 9; - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xffff) { - this.chigh += this.clow >> 16; - this.clow &= 0xffff; - } - } - readBit(contexts, pos) { - let cx_index = contexts[pos] >> 1, - cx_mps = contexts[pos] & 1; - const qeTableIcx = QeTable[cx_index]; - const qeIcx = qeTableIcx.qe; - let d; - let a = this.a - qeIcx; - if (this.chigh < qeIcx) { - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - do { - if (this.ct === 0) { - this.byteIn(); - } - a <<= 1; - this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; - this.clow = this.clow << 1 & 0xffff; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } -} - -;// ./src/core/jbig2.js - - - - -class Jbig2Error extends BaseException { - constructor(msg) { - super(msg, "Jbig2Error"); - } -} -class ContextCache { - getContexts(id) { - if (id in this) { - return this[id]; - } - return this[id] = new Int8Array(1 << 16); - } -} -class DecodingContext { - constructor(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - get decoder() { - const decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, "decoder", decoder); - } - get contextCache() { - const cache = new ContextCache(); - return shadow(this, "contextCache", cache); - } -} -function decodeInteger(contextCache, procedure, decoder) { - const contexts = contextCache.getContexts(procedure); - let prev = 1; - function readBits(length) { - let v = 0; - for (let i = 0; i < length; i++) { - const bit = decoder.readBit(contexts, prev); - prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; - v = v << 1 | bit; - } - return v >>> 0; - } - const sign = readBits(1); - const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); - let signedValue; - if (sign === 0) { - signedValue = value; - } else if (value > 0) { - signedValue = -value; - } - if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { - return signedValue; - } - return null; -} -function decodeIAID(contextCache, decoder, codeLength) { - const contexts = contextCache.getContexts("IAID"); - let prev = 1; - for (let i = 0; i < codeLength; i++) { - const bit = decoder.readBit(contexts, prev); - prev = prev << 1 | bit; - } - if (codeLength < 31) { - return prev & (1 << codeLength) - 1; - } - return prev & 0x7fffffff; -} -const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"]; -const CodingTemplates = [[{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: 2, - y: -1 -}, { - x: -4, - y: 0 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: 2, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: 2, - y: -1 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -3, - y: -1 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: -4, - y: 0 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}]]; -const RefinementTemplates = [{ - coding: [{ - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }], - reference: [{ - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: -1, - y: 1 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - }] -}, { - coding: [{ - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }], - reference: [{ - x: 0, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - }] -}]; -const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; -const RefinementReusedContexts = [0x0020, 0x0008]; -function decodeBitmapTemplate0(width, height, decodingContext) { - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GB"); - const bitmap = []; - let contextLabel, i, j, pixel, row, row1, row2; - const OLD_PIXEL_MASK = 0x7bf7; - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = i < 1 ? row : bitmap[i - 1]; - row2 = i < 2 ? row : bitmap[i - 2]; - contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - return bitmap; -} -function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { - if (mmr) { - const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); - return decodeMMRBitmap(input, width, height, false); - } - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - const useskip = !!skip; - const template = CodingTemplates[templateIndex].concat(at); - template.sort((a, b) => a.y - b.y || a.x - b.x); - const templateLength = template.length; - const templateX = new Int8Array(templateLength); - const templateY = new Int8Array(templateLength); - const changingTemplateEntries = []; - let reuseMask = 0, - minX = 0, - maxX = 0, - minY = 0; - let c, k; - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << templateLength - 1 - k; - } else { - changingTemplateEntries.push(k); - } - } - const changingEntriesLength = changingTemplateEntries.length; - const changingTemplateX = new Int8Array(changingEntriesLength); - const changingTemplateY = new Int8Array(changingEntriesLength); - const changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << templateLength - 1 - k; - } - const sbb_left = -minX; - const sbb_top = -minY; - const sbb_right = width - maxX; - const pseudoPixelContext = ReusedContexts[templateIndex]; - let row = new Uint8Array(width); - const bitmap = []; - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GB"); - let ltp = 0, - j, - i0, - j0, - contextLabel = 0, - bit, - shift; - for (let i = 0; i < height; i++) { - if (prediction) { - const sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - contextLabel = contextLabel << 1 & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - const pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; -} -function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { - let codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - const codingTemplateLength = codingTemplate.length; - const codingTemplateX = new Int32Array(codingTemplateLength); - const codingTemplateY = new Int32Array(codingTemplateLength); - let k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - let referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - const referenceTemplateLength = referenceTemplate.length; - const referenceTemplateX = new Int32Array(referenceTemplateLength); - const referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - const referenceWidth = referenceBitmap[0].length; - const referenceHeight = referenceBitmap.length; - const pseudoPixelContext = RefinementReusedContexts[templateIndex]; - const bitmap = []; - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GR"); - let ltp = 0; - for (let i = 0; i < height; i++) { - if (prediction) { - const sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - throw new Jbig2Error("prediction is not supported"); - } - } - const row = new Uint8Array(width); - bitmap.push(row); - for (let j = 0; j < width; j++) { - let i0, j0; - let contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] - offsetY; - j0 = j + referenceTemplateX[k] - offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; - } - } - const pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; -} -function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { - if (huffman && refinement) { - throw new Jbig2Error("symbol refinement with Huffman is not supported"); - } - const newSymbols = []; - let currentHeight = 0; - let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - const decoder = decodingContext.decoder; - const contextCache = decodingContext.contextCache; - let tableB1, symbolWidths; - if (huffman) { - tableB1 = getStandardTable(1); - symbolWidths = []; - symbolCodeLength = Math.max(symbolCodeLength, 1); - } - while (newSymbols.length < numberOfNewSymbols) { - const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); - currentHeight += deltaHeight; - let currentWidth = 0, - totalWidth = 0; - const firstSymbol = huffman ? symbolWidths.length : 0; - while (true) { - const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); - if (deltaWidth === null) { - break; - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - let bitmap; - if (refinement) { - const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); - } else { - const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - const rdx = decodeInteger(contextCache, "IARDX", decoder); - const rdy = decodeInteger(contextCache, "IARDY", decoder); - const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; - bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); - } - newSymbols.push(bitmap); - } else if (huffman) { - symbolWidths.push(currentWidth); - } else { - bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); - newSymbols.push(bitmap); - } - } - if (huffman && !refinement) { - const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); - huffmanInput.byteAlign(); - let collectiveBitmap; - if (bitmapSize === 0) { - collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); - } else { - const originalEnd = huffmanInput.end; - const bitmapEnd = huffmanInput.position + bitmapSize; - huffmanInput.end = bitmapEnd; - collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); - huffmanInput.end = originalEnd; - huffmanInput.position = bitmapEnd; - } - const numberOfSymbolsDecoded = symbolWidths.length; - if (firstSymbol === numberOfSymbolsDecoded - 1) { - newSymbols.push(collectiveBitmap); - } else { - let i, - y, - xMin = 0, - xMax, - bitmapWidth, - symbolBitmap; - for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { - bitmapWidth = symbolWidths[i]; - xMax = xMin + bitmapWidth; - symbolBitmap = []; - for (y = 0; y < currentHeight; y++) { - symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); - } - newSymbols.push(symbolBitmap); - xMin = xMax; - } - } - } - } - const exportedSymbols = [], - flags = []; - let currentFlag = false, - i, - ii; - const totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (let j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; -} -function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { - if (huffman && refinement) { - throw new Jbig2Error("refinement with Huffman is not supported"); - } - const bitmap = []; - let i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - row.fill(defaultPixelValue); - } - bitmap.push(row); - } - const decoder = decodingContext.decoder; - const contextCache = decodingContext.contextCache; - let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); - let firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); - stripT += deltaT; - const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); - firstS += deltaFirstS; - let currentS = firstS; - do { - let currentT = 0; - if (stripSize > 1) { - currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); - } - const t = stripSize * stripT + currentT; - const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); - const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); - let symbolBitmap = inputSymbols[symbolId]; - let symbolWidth = symbolBitmap[0].length; - let symbolHeight = symbolBitmap.length; - if (applyRefinement) { - const rdw = decodeInteger(contextCache, "IARDW", decoder); - const rdh = decodeInteger(contextCache, "IARDH", decoder); - const rdx = decodeInteger(contextCache, "IARDX", decoder); - const rdy = decodeInteger(contextCache, "IARDY", decoder); - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); - } - let increment = 0; - if (!transposed) { - if (referenceCorner > 1) { - currentS += symbolWidth - 1; - } else { - increment = symbolWidth - 1; - } - } else if (!(referenceCorner & 1)) { - currentS += symbolHeight - 1; - } else { - increment = symbolHeight - 1; - } - const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); - const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); - let s2, t2, symbolRow; - if (transposed) { - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - const maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - case 2: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - } - i++; - const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); - if (deltaS === null) { - break; - } - currentS += increment + deltaS + dsOffset; - } while (true); - } - return bitmap; -} -function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { - const at = []; - if (!mmr) { - at.push({ - x: -patternWidth, - y: 0 - }); - if (template === 0) { - at.push({ - x: -3, - y: -1 - }, { - x: 2, - y: -2 - }, { - x: -2, - y: -2 - }); - } - } - const collectiveWidth = (maxPatternIndex + 1) * patternWidth; - const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); - const patterns = []; - for (let i = 0; i <= maxPatternIndex; i++) { - const patternBitmap = []; - const xMin = patternWidth * i; - const xMax = xMin + patternWidth; - for (let y = 0; y < patternHeight; y++) { - patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); - } - patterns.push(patternBitmap); - } - return patterns; -} -function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { - const skip = null; - if (enableSkip) { - throw new Jbig2Error("skip is not supported"); - } - if (combinationOperator !== 0) { - throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); - } - const regionBitmap = []; - let i, j, row; - for (i = 0; i < regionHeight; i++) { - row = new Uint8Array(regionWidth); - if (defaultPixelValue) { - row.fill(defaultPixelValue); - } - regionBitmap.push(row); - } - const numberOfPatterns = patterns.length; - const pattern0 = patterns[0]; - const patternWidth = pattern0[0].length, - patternHeight = pattern0.length; - const bitsPerValue = log2(numberOfPatterns); - const at = []; - if (!mmr) { - at.push({ - x: template <= 1 ? 3 : 2, - y: -1 - }); - if (template === 0) { - at.push({ - x: -3, - y: -1 - }, { - x: 2, - y: -2 - }, { - x: -2, - y: -2 - }); - } - } - const grayScaleBitPlanes = []; - let mmrInput, bitmap; - if (mmr) { - mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); - } - for (i = bitsPerValue - 1; i >= 0; i--) { - if (mmr) { - bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); - } else { - bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); - } - grayScaleBitPlanes[i] = bitmap; - } - let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; - for (mg = 0; mg < gridHeight; mg++) { - for (ng = 0; ng < gridWidth; ng++) { - bit = 0; - patternIndex = 0; - for (j = bitsPerValue - 1; j >= 0; j--) { - bit ^= grayScaleBitPlanes[j][mg][ng]; - patternIndex |= bit << j; - } - patternBitmap = patterns[patternIndex]; - x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; - y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; - if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { - for (i = 0; i < patternHeight; i++) { - regionRow = regionBitmap[y + i]; - patternRow = patternBitmap[i]; - for (j = 0; j < patternWidth; j++) { - regionRow[x + j] |= patternRow[j]; - } - } - } else { - let regionX, regionY; - for (i = 0; i < patternHeight; i++) { - regionY = y + i; - if (regionY < 0 || regionY >= regionHeight) { - continue; - } - regionRow = regionBitmap[regionY]; - patternRow = patternBitmap[i]; - for (j = 0; j < patternWidth; j++) { - regionX = x + j; - if (regionX >= 0 && regionX < regionWidth) { - regionRow[regionX] |= patternRow[j]; - } - } - } - } - } - } - return regionBitmap; -} -function readSegmentHeader(data, start) { - const segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - const flags = data[start + 4]; - const segmentType = flags & 0x3f; - if (!SegmentTypes[segmentType]) { - throw new Jbig2Error("invalid segment type: " + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - const pageAssociationFieldSize = !!(flags & 0x40); - const referredFlags = data[start + 5]; - let referredToCount = referredFlags >> 5 & 7; - const retainBits = [referredFlags & 31]; - let position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1fffffff; - position += 3; - let bytes = referredToCount + 7 >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - throw new Jbig2Error("invalid referred-to flags"); - } - segmentHeader.retainBits = retainBits; - let referredToSegmentNumberSize = 4; - if (segmentHeader.number <= 256) { - referredToSegmentNumberSize = 1; - } else if (segmentHeader.number <= 65536) { - referredToSegmentNumberSize = 2; - } - const referredTo = []; - let i, ii; - for (i = 0; i < referredToCount; i++) { - let number; - if (referredToSegmentNumberSize === 1) { - number = data[position]; - } else if (referredToSegmentNumberSize === 2) { - number = readUint16(data, position); - } else { - number = readUint32(data, position); - } - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - if (segmentHeader.length === 0xffffffff) { - if (segmentType === 38) { - const genericRegionInfo = readRegionSegmentInformation(data, position); - const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; - const genericRegionMmr = !!(genericRegionSegmentFlags & 1); - const searchPatternLength = 6; - const searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xff; - searchPattern[1] = 0xac; - } - searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; - searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; - searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; - searchPattern[5] = genericRegionInfo.height & 0xff; - for (i = position, ii = data.length; i < ii; i++) { - let j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xffffffff) { - throw new Jbig2Error("segment end was not found"); - } - } else { - throw new Jbig2Error("invalid unknown segment length"); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; -} -function readSegments(header, data, start, end) { - const segments = []; - let position = start; - while (position < end) { - const segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - const segment = { - header: segmentHeader, - data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; - } - } - if (header.randomAccess) { - for (let i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; -} -function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; -} -const RegionSegmentInformationFieldLength = 17; -function processSegment(segment, visitor) { - const header = segment.header; - const data = segment.data, - end = segment.end; - let position = segment.start; - let args, at, i, atLength; - switch (header.type) { - case 0: - const dictionary = {}; - const dictionaryFlags = readUint16(data, position); - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; - dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; - dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; - dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = dictionaryFlags >> 10 & 3; - dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, data, position, end]; - break; - case 6: - case 7: - const textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; - textRegion.stripSize = 1 << textRegion.logStripSize; - textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; - textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; - textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; - textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; - if (textRegion.huffman) { - const textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = textRegionHuffmanFlags & 3; - textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; - textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; - textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; - textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; - textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; - textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; - textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - args = [textRegion, header.referredTo, data, position, end]; - break; - case 16: - const patternDictionary = {}; - const patternDictionaryFlags = data[position++]; - patternDictionary.mmr = !!(patternDictionaryFlags & 1); - patternDictionary.template = patternDictionaryFlags >> 1 & 3; - patternDictionary.patternWidth = data[position++]; - patternDictionary.patternHeight = data[position++]; - patternDictionary.maxPatternIndex = readUint32(data, position); - position += 4; - args = [patternDictionary, header.number, data, position, end]; - break; - case 22: - case 23: - const halftoneRegion = {}; - halftoneRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const halftoneRegionFlags = data[position++]; - halftoneRegion.mmr = !!(halftoneRegionFlags & 1); - halftoneRegion.template = halftoneRegionFlags >> 1 & 3; - halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); - halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; - halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; - halftoneRegion.gridWidth = readUint32(data, position); - position += 4; - halftoneRegion.gridHeight = readUint32(data, position); - position += 4; - halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; - position += 4; - halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; - position += 4; - halftoneRegion.gridVectorX = readUint16(data, position); - position += 2; - halftoneRegion.gridVectorY = readUint16(data, position); - position += 2; - args = [halftoneRegion, header.referredTo, data, position, end]; - break; - case 38: - case 39: - const genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = genericRegionSegmentFlags >> 1 & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: - const pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xffffffff) { - delete pageInfo.height; - } - const pageSegmentFlags = data[position + 16]; - readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; - pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: - break; - case 50: - break; - case 51: - break; - case 53: - args = [header.number, data, position, end]; - break; - case 62: - break; - default: - throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); - } - const callbackName = "on" + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } -} -function processSegments(segments, visitor) { - for (let i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } -} -function parseJbig2Chunks(chunks) { - const visitor = new SimpleSegmentVisitor(); - for (let i = 0, ii = chunks.length; i < ii; i++) { - const chunk = chunks[i]; - const segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; -} -class SimpleSegmentVisitor { - onPageInformation(info) { - this.currentPageInfo = info; - const rowSize = info.width + 7 >> 3; - const buffer = new Uint8ClampedArray(rowSize * info.height); - if (info.defaultPixelValue) { - buffer.fill(0xff); - } - this.buffer = buffer; - } - drawBitmap(regionInfo, bitmap) { - const pageInfo = this.currentPageInfo; - const width = regionInfo.width, - height = regionInfo.height; - const rowSize = pageInfo.width + 7 >> 3; - const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; - const buffer = this.buffer; - const mask0 = 128 >> (regionInfo.x & 7); - let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - let i, j, mask, offset; - switch (combinationOperator) { - case 0: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - case 2: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - onImmediateGenericRegion(region, data, start, end) { - const regionInfo = region.info; - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion(...arguments); - } - onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { - let huffmanTables, huffmanInput; - if (dictionary.huffman) { - huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); - huffmanInput = new Reader(data, start, end); - } - let symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - const inputSymbols = []; - for (const referredSegment of referredSegments) { - const referredSymbols = symbols[referredSegment]; - if (referredSymbols) { - inputSymbols.push(...referredSymbols); - } - } - const decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); - } - onImmediateTextRegion(region, referredSegments, data, start, end) { - const regionInfo = region.info; - let huffmanTables, huffmanInput; - const symbols = this.symbols; - const inputSymbols = []; - for (const referredSegment of referredSegments) { - const referredSymbols = symbols[referredSegment]; - if (referredSymbols) { - inputSymbols.push(...referredSymbols); - } - } - const symbolCodeLength = log2(inputSymbols.length); - if (region.huffman) { - huffmanInput = new Reader(data, start, end); - huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); - } - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessTextRegion() { - this.onImmediateTextRegion(...arguments); - } - onPatternDictionary(dictionary, currentSegment, data, start, end) { - let patterns = this.patterns; - if (!patterns) { - this.patterns = patterns = {}; - } - const decodingContext = new DecodingContext(data, start, end); - patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); - } - onImmediateHalftoneRegion(region, referredSegments, data, start, end) { - const patterns = this.patterns[referredSegments[0]]; - const regionInfo = region.info; - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessHalftoneRegion() { - this.onImmediateHalftoneRegion(...arguments); - } - onTables(currentSegment, data, start, end) { - let customTables = this.customTables; - if (!customTables) { - this.customTables = customTables = {}; - } - customTables[currentSegment] = decodeTablesSegment(data, start, end); - } -} -class HuffmanLine { - constructor(lineData) { - if (lineData.length === 2) { - this.isOOB = true; - this.rangeLow = 0; - this.prefixLength = lineData[0]; - this.rangeLength = 0; - this.prefixCode = lineData[1]; - this.isLowerRange = false; - } else { - this.isOOB = false; - this.rangeLow = lineData[0]; - this.prefixLength = lineData[1]; - this.rangeLength = lineData[2]; - this.prefixCode = lineData[3]; - this.isLowerRange = lineData[4] === "lower"; - } - } -} -class HuffmanTreeNode { - constructor(line) { - this.children = []; - if (line) { - this.isLeaf = true; - this.rangeLength = line.rangeLength; - this.rangeLow = line.rangeLow; - this.isLowerRange = line.isLowerRange; - this.isOOB = line.isOOB; - } else { - this.isLeaf = false; - } - } - buildTree(line, shift) { - const bit = line.prefixCode >> shift & 1; - if (shift <= 0) { - this.children[bit] = new HuffmanTreeNode(line); - } else { - let node = this.children[bit]; - if (!node) { - this.children[bit] = node = new HuffmanTreeNode(null); - } - node.buildTree(line, shift - 1); - } - } - decodeNode(reader) { - if (this.isLeaf) { - if (this.isOOB) { - return null; - } - const htOffset = reader.readBits(this.rangeLength); - return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); - } - const node = this.children[reader.readBit()]; - if (!node) { - throw new Jbig2Error("invalid Huffman data"); - } - return node.decodeNode(reader); - } -} -class HuffmanTable { - constructor(lines, prefixCodesDone) { - if (!prefixCodesDone) { - this.assignPrefixCodes(lines); - } - this.rootNode = new HuffmanTreeNode(null); - for (let i = 0, ii = lines.length; i < ii; i++) { - const line = lines[i]; - if (line.prefixLength > 0) { - this.rootNode.buildTree(line, line.prefixLength - 1); - } - } - } - decode(reader) { - return this.rootNode.decodeNode(reader); - } - assignPrefixCodes(lines) { - const linesLength = lines.length; - let prefixLengthMax = 0; - for (let i = 0; i < linesLength; i++) { - prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); - } - const histogram = new Uint32Array(prefixLengthMax + 1); - for (let i = 0; i < linesLength; i++) { - histogram[lines[i].prefixLength]++; - } - let currentLength = 1, - firstCode = 0, - currentCode, - currentTemp, - line; - histogram[0] = 0; - while (currentLength <= prefixLengthMax) { - firstCode = firstCode + histogram[currentLength - 1] << 1; - currentCode = firstCode; - currentTemp = 0; - while (currentTemp < linesLength) { - line = lines[currentTemp]; - if (line.prefixLength === currentLength) { - line.prefixCode = currentCode; - currentCode++; - } - currentTemp++; - } - currentLength++; - } - } -} -function decodeTablesSegment(data, start, end) { - const flags = data[start]; - const lowestValue = readUint32(data, start + 1) & 0xffffffff; - const highestValue = readUint32(data, start + 5) & 0xffffffff; - const reader = new Reader(data, start + 9, end); - const prefixSizeBits = (flags >> 1 & 7) + 1; - const rangeSizeBits = (flags >> 4 & 7) + 1; - const lines = []; - let prefixLength, - rangeLength, - currentRangeLow = lowestValue; - do { - prefixLength = reader.readBits(prefixSizeBits); - rangeLength = reader.readBits(rangeSizeBits); - lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); - currentRangeLow += 1 << rangeLength; - } while (currentRangeLow < highestValue); - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); - if (flags & 1) { - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([prefixLength, 0])); - } - return new HuffmanTable(lines, false); -} -const standardTablesCache = {}; -function getStandardTable(number) { - let table = standardTablesCache[number]; - if (table) { - return table; - } - let lines; - switch (number) { - case 1: - lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; - break; - case 2: - lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]]; - break; - case 3: - lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]]; - break; - case 4: - lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]]; - break; - case 5: - lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]]; - break; - case 6: - lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]]; - break; - case 7: - lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]]; - break; - case 8: - lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]]; - break; - case 9: - lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]]; - break; - case 10: - lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]]; - break; - case 11: - lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; - break; - case 12: - lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]]; - break; - case 13: - lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; - break; - case 14: - lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; - break; - case 15: - lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]]; - break; - default: - throw new Jbig2Error(`standard table B.${number} does not exist`); - } - for (let i = 0, ii = lines.length; i < ii; i++) { - lines[i] = new HuffmanLine(lines[i]); - } - table = new HuffmanTable(lines, true); - standardTablesCache[number] = table; - return table; -} -class Reader { - constructor(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - this.position = start; - this.shift = -1; - this.currentByte = 0; - } - readBit() { - if (this.shift < 0) { - if (this.position >= this.end) { - throw new Jbig2Error("end of data while reading bit"); - } - this.currentByte = this.data[this.position++]; - this.shift = 7; - } - const bit = this.currentByte >> this.shift & 1; - this.shift--; - return bit; - } - readBits(numBits) { - let result = 0, - i; - for (i = numBits - 1; i >= 0; i--) { - result |= this.readBit() << i; - } - return result; - } - byteAlign() { - this.shift = -1; - } - next() { - if (this.position >= this.end) { - return -1; - } - return this.data[this.position++]; - } -} -function getCustomHuffmanTable(index, referredTo, customTables) { - let currentIndex = 0; - for (let i = 0, ii = referredTo.length; i < ii; i++) { - const table = customTables[referredTo[i]]; - if (table) { - if (index === currentIndex) { - return table; - } - currentIndex++; - } - } - throw new Jbig2Error("can't find custom Huffman table"); -} -function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { - const codes = []; - for (let i = 0; i <= 34; i++) { - const codeLength = reader.readBits(4); - codes.push(new HuffmanLine([i, codeLength, 0, 0])); - } - const runCodesTable = new HuffmanTable(codes, false); - codes.length = 0; - for (let i = 0; i < numberOfSymbols;) { - const codeLength = runCodesTable.decode(reader); - if (codeLength >= 32) { - let repeatedLength, numberOfRepeats, j; - switch (codeLength) { - case 32: - if (i === 0) { - throw new Jbig2Error("no previous value in symbol ID table"); - } - numberOfRepeats = reader.readBits(2) + 3; - repeatedLength = codes[i - 1].prefixLength; - break; - case 33: - numberOfRepeats = reader.readBits(3) + 3; - repeatedLength = 0; - break; - case 34: - numberOfRepeats = reader.readBits(7) + 11; - repeatedLength = 0; - break; - default: - throw new Jbig2Error("invalid code length in symbol ID table"); - } - for (j = 0; j < numberOfRepeats; j++) { - codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); - i++; - } - } else { - codes.push(new HuffmanLine([i, codeLength, 0, 0])); - i++; - } - } - reader.byteAlign(); - const symbolIDTable = new HuffmanTable(codes, false); - let customIndex = 0, - tableFirstS, - tableDeltaS, - tableDeltaT; - switch (textRegion.huffmanFS) { - case 0: - case 1: - tableFirstS = getStandardTable(textRegion.huffmanFS + 6); - break; - case 3: - tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman FS selector"); - } - switch (textRegion.huffmanDS) { - case 0: - case 1: - case 2: - tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); - break; - case 3: - tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DS selector"); - } - switch (textRegion.huffmanDT) { - case 0: - case 1: - case 2: - tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); - break; - case 3: - tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DT selector"); - } - if (textRegion.refinement) { - throw new Jbig2Error("refinement with Huffman is not supported"); - } - return { - symbolIDTable, - tableFirstS, - tableDeltaS, - tableDeltaT - }; -} -function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { - let customIndex = 0, - tableDeltaHeight, - tableDeltaWidth; - switch (dictionary.huffmanDHSelector) { - case 0: - case 1: - tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); - break; - case 3: - tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DH selector"); - } - switch (dictionary.huffmanDWSelector) { - case 0: - case 1: - tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); - break; - case 3: - tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DW selector"); - } - let tableBitmapSize, tableAggregateInstances; - if (dictionary.bitmapSizeSelector) { - tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - } else { - tableBitmapSize = getStandardTable(1); - } - if (dictionary.aggregationInstancesSelector) { - tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); - } else { - tableAggregateInstances = getStandardTable(1); - } - return { - tableDeltaHeight, - tableDeltaWidth, - tableBitmapSize, - tableAggregateInstances - }; -} -function readUncompressedBitmap(reader, width, height) { - const bitmap = []; - for (let y = 0; y < height; y++) { - const row = new Uint8Array(width); - bitmap.push(row); - for (let x = 0; x < width; x++) { - row[x] = reader.readBit(); - } - reader.byteAlign(); - } - return bitmap; -} -function decodeMMRBitmap(input, width, height, endOfBlock) { - const params = { - K: -1, - Columns: width, - Rows: height, - BlackIs1: true, - EndOfBlock: endOfBlock - }; - const decoder = new CCITTFaxDecoder(input, params); - const bitmap = []; - let currentByte, - eof = false; - for (let y = 0; y < height; y++) { - const row = new Uint8Array(width); - bitmap.push(row); - let shift = -1; - for (let x = 0; x < width; x++) { - if (shift < 0) { - currentByte = decoder.readNextChar(); - if (currentByte === -1) { - currentByte = 0; - eof = true; - } - shift = 7; - } - row[x] = currentByte >> shift & 1; - shift--; - } - } - if (endOfBlock && !eof) { - const lookForEOFLimit = 5; - for (let i = 0; i < lookForEOFLimit; i++) { - if (decoder.readNextChar() === -1) { - break; - } - } - } - return bitmap; -} -class Jbig2Image { - parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - parse(data) { - throw new Error("Not implemented: Jbig2Image.parse"); - } -} - -;// ./src/core/jbig2_stream.js - - - - - -class Jbig2Stream extends DecodeStream { - constructor(stream, maybeLength, params) { - super(maybeLength); - this.stream = stream; - this.dict = stream.dict; - this.maybeLength = maybeLength; - this.params = params; - } - get bytes() { - return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); - } - ensureBuffer(requested) {} - readBlock() { - this.decodeImage(); - } - decodeImage(bytes) { - if (this.eof) { - return this.buffer; - } - bytes ||= this.bytes; - const jbig2Image = new Jbig2Image(); - const chunks = []; - if (this.params instanceof Dict) { - const globalsStream = this.params.get("JBIG2Globals"); - if (globalsStream instanceof BaseStream) { - const globals = globalsStream.getBytes(); - chunks.push({ - data: globals, - start: 0, - end: globals.length - }); - } - } - chunks.push({ - data: bytes, - start: 0, - end: bytes.length - }); - const data = jbig2Image.parseChunks(chunks); - const dataLength = data.length; - for (let i = 0; i < dataLength; i++) { - data[i] ^= 0xff; - } - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; - return this.buffer; - } - get canAsyncDecodeImageFromBuffer() { - return this.stream.isAsync; - } -} - -;// ./src/core/jpx_stream.js - - - -class JpxStream extends DecodeStream { - constructor(stream, maybeLength, params) { - super(maybeLength); - this.stream = stream; - this.dict = stream.dict; - this.maybeLength = maybeLength; - this.params = params; - } - get bytes() { - return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); - } - ensureBuffer(requested) {} - readBlock(decoderOptions) { - unreachable("JpxStream.readBlock"); - } - get isAsyncDecoder() { - return true; - } - async decodeImage(bytes, decoderOptions) { - if (this.eof) { - return this.buffer; - } - bytes ||= this.bytes; - this.buffer = await JpxImage.decode(bytes, decoderOptions); - this.bufferLength = this.buffer.length; - this.eof = true; - return this.buffer; - } - get canAsyncDecodeImageFromBuffer() { - return this.stream.isAsync; - } -} - -;// ./src/core/lzw_stream.js - -class LZWStream extends DecodeStream { - constructor(str, maybeLength, earlyChange) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.cachedData = 0; - this.bitsCached = 0; - const maxLzwDictionarySize = 4096; - const lzwState = { - earlyChange, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(maxLzwDictionarySize), - dictionaryLengths: new Uint16Array(maxLzwDictionarySize), - dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), - currentSequence: new Uint8Array(maxLzwDictionarySize), - currentSequenceLength: 0 - }; - for (let i = 0; i < 256; ++i) { - lzwState.dictionaryValues[i] = i; - lzwState.dictionaryLengths[i] = 1; - } - this.lzwState = lzwState; - } - readBits(n) { - let bitsCached = this.bitsCached; - let cachedData = this.cachedData; - while (bitsCached < n) { - const c = this.str.getByte(); - if (c === -1) { - this.eof = true; - return null; - } - cachedData = cachedData << 8 | c; - bitsCached += 8; - } - this.bitsCached = bitsCached -= n; - this.cachedData = cachedData; - this.lastCode = null; - return cachedData >>> bitsCached & (1 << n) - 1; - } - readBlock() { - const blockSize = 512, - decodedSizeDelta = blockSize; - let estimatedDecodedSize = blockSize * 2; - let i, j, q; - const lzwState = this.lzwState; - if (!lzwState) { - return; - } - const earlyChange = lzwState.earlyChange; - let nextCode = lzwState.nextCode; - const dictionaryValues = lzwState.dictionaryValues; - const dictionaryLengths = lzwState.dictionaryLengths; - const dictionaryPrevCodes = lzwState.dictionaryPrevCodes; - let codeLength = lzwState.codeLength; - let prevCode = lzwState.prevCode; - const currentSequence = lzwState.currentSequence; - let currentSequenceLength = lzwState.currentSequenceLength; - let decodedLength = 0; - let currentBufferLength = this.bufferLength; - let buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - for (i = 0; i < blockSize; i++) { - const code = this.readBits(codeLength); - const hasPrev = currentSequenceLength > 0; - if (code < 256) { - currentSequence[0] = code; - currentSequenceLength = 1; - } else if (code >= 258) { - if (code < nextCode) { - currentSequenceLength = dictionaryLengths[code]; - for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { - currentSequence[j] = dictionaryValues[q]; - q = dictionaryPrevCodes[q]; - } - } else { - currentSequence[currentSequenceLength++] = currentSequence[0]; - } - } else if (code === 256) { - codeLength = 9; - nextCode = 258; - currentSequenceLength = 0; - continue; - } else { - this.eof = true; - delete this.lzwState; - break; - } - if (hasPrev) { - dictionaryPrevCodes[nextCode] = prevCode; - dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; - dictionaryValues[nextCode] = currentSequence[0]; - nextCode++; - codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; - } - prevCode = code; - decodedLength += currentSequenceLength; - if (estimatedDecodedSize < decodedLength) { - do { - estimatedDecodedSize += decodedSizeDelta; - } while (estimatedDecodedSize < decodedLength); - buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - } - for (j = 0; j < currentSequenceLength; j++) { - buffer[currentBufferLength++] = currentSequence[j]; - } - } - lzwState.nextCode = nextCode; - lzwState.codeLength = codeLength; - lzwState.prevCode = prevCode; - lzwState.currentSequenceLength = currentSequenceLength; - this.bufferLength = currentBufferLength; - } -} - -;// ./src/core/predictor_stream.js - - - -class PredictorStream extends DecodeStream { - constructor(str, maybeLength, params) { - super(maybeLength); - if (!(params instanceof Dict)) { - return str; - } - const predictor = this.predictor = params.get("Predictor") || 1; - if (predictor <= 1) { - return str; - } - if (predictor !== 2 && (predictor < 10 || predictor > 15)) { - throw new FormatError(`Unsupported predictor: ${predictor}`); - } - this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; - this.str = str; - this.dict = str.dict; - const colors = this.colors = params.get("Colors") || 1; - const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; - const columns = this.columns = params.get("Columns") || 1; - this.pixBytes = colors * bits + 7 >> 3; - this.rowBytes = columns * colors * bits + 7 >> 3; - return this; - } - readBlockTiff() { - const rowBytes = this.rowBytes; - const bufferLength = this.bufferLength; - const buffer = this.ensureBuffer(bufferLength + rowBytes); - const bits = this.bits; - const colors = this.colors; - const rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - let inbuf = 0, - outbuf = 0; - let inbits = 0, - outbits = 0; - let pos = bufferLength; - let i; - if (bits === 1 && colors === 1) { - for (i = 0; i < rowBytes; ++i) { - let c = rawBytes[i] ^ inbuf; - c ^= c >> 1; - c ^= c >> 2; - c ^= c >> 4; - inbuf = (c & 1) << 7; - buffer[pos++] = c; - } - } else if (bits === 8) { - for (i = 0; i < colors; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[pos] = buffer[pos - colors] + rawBytes[i]; - pos++; - } - } else if (bits === 16) { - const bytesPerPixel = colors * 2; - for (i = 0; i < bytesPerPixel; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; i += 2) { - const sum = ((rawBytes[i] & 0xff) << 8) + (rawBytes[i + 1] & 0xff) + ((buffer[pos - bytesPerPixel] & 0xff) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xff); - buffer[pos++] = sum >> 8 & 0xff; - buffer[pos++] = sum & 0xff; - } - } else { - const compArray = new Uint8Array(colors + 1); - const bitMask = (1 << bits) - 1; - let j = 0, - k = bufferLength; - const columns = this.columns; - for (i = 0; i < columns; ++i) { - for (let kk = 0; kk < colors; ++kk) { - if (inbits < bits) { - inbuf = inbuf << 8 | rawBytes[j++] & 0xff; - inbits += 8; - } - compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; - inbits -= bits; - outbuf = outbuf << bits | compArray[kk]; - outbits += bits; - if (outbits >= 8) { - buffer[k++] = outbuf >> outbits - 8 & 0xff; - outbits -= 8; - } - } - } - if (outbits > 0) { - buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); - } - } - this.bufferLength += rowBytes; - } - readBlockPng() { - const rowBytes = this.rowBytes; - const pixBytes = this.pixBytes; - const predictor = this.str.getByte(); - const rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - const bufferLength = this.bufferLength; - const buffer = this.ensureBuffer(bufferLength + rowBytes); - let prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); - if (prevRow.length === 0) { - prevRow = new Uint8Array(rowBytes); - } - let i, - j = bufferLength, - up, - c; - switch (predictor) { - case 0: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - break; - case 1: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xff; - j++; - } - break; - case 2: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = prevRow[i] + rawBytes[i] & 0xff; - } - break; - case 3: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xff; - j++; - } - break; - case 4: - for (i = 0; i < pixBytes; ++i) { - up = prevRow[i]; - c = rawBytes[i]; - buffer[j++] = up + c; - } - for (; i < rowBytes; ++i) { - up = prevRow[i]; - const upLeft = prevRow[i - pixBytes]; - const left = buffer[j - pixBytes]; - const p = left + up - upLeft; - let pa = p - left; - if (pa < 0) { - pa = -pa; - } - let pb = p - up; - if (pb < 0) { - pb = -pb; - } - let pc = p - upLeft; - if (pc < 0) { - pc = -pc; - } - c = rawBytes[i]; - if (pa <= pb && pa <= pc) { - buffer[j++] = left + c; - } else if (pb <= pc) { - buffer[j++] = up + c; - } else { - buffer[j++] = upLeft + c; - } - } - break; - default: - throw new FormatError(`Unsupported predictor: ${predictor}`); - } - this.bufferLength += rowBytes; - } -} - -;// ./src/core/run_length_stream.js - -class RunLengthStream extends DecodeStream { - constructor(str, maybeLength) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - } - readBlock() { - const repeatHeader = this.str.getBytes(2); - if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { - this.eof = true; - return; - } - let buffer; - let bufferLength = this.bufferLength; - let n = repeatHeader[0]; - if (n < 128) { - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer[bufferLength++] = repeatHeader[1]; - if (n > 0) { - const source = this.str.getBytes(n); - buffer.set(source, bufferLength); - bufferLength += n; - } - } else { - n = 257 - n; - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer.fill(repeatHeader[1], bufferLength, bufferLength + n); - bufferLength += n; - } - this.bufferLength = bufferLength; - } -} - -;// ./src/core/parser.js - - - - - - - - - - - - - - -const MAX_LENGTH_TO_CACHE = 1000; -function getInlineImageCacheKey(bytes) { - const strBuf = [], - ii = bytes.length; - let i = 0; - while (i < ii - 1) { - strBuf.push(bytes[i++] << 8 | bytes[i++]); - } - if (i < ii) { - strBuf.push(bytes[i]); - } - return ii + "_" + String.fromCharCode.apply(null, strBuf); -} -class Parser { - constructor({ - lexer, - xref, - allowStreams = false, - recoveryMode = false - }) { - this.lexer = lexer; - this.xref = xref; - this.allowStreams = allowStreams; - this.recoveryMode = recoveryMode; - this.imageCache = Object.create(null); - this._imageId = 0; - this.refill(); - } - refill() { - this.buf1 = this.lexer.getObj(); - this.buf2 = this.lexer.getObj(); - } - shift() { - if (this.buf2 instanceof Cmd && this.buf2.cmd === "ID") { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - } - tryShift() { - try { - this.shift(); - return true; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - return false; - } - } - getObj(cipherTransform = null) { - const buf1 = this.buf1; - this.shift(); - if (buf1 instanceof Cmd) { - switch (buf1.cmd) { - case "BI": - return this.makeInlineImage(cipherTransform); - case "[": - const array = []; - while (!isCmd(this.buf1, "]") && this.buf1 !== EOF) { - array.push(this.getObj(cipherTransform)); - } - if (this.buf1 === EOF) { - if (this.recoveryMode) { - return array; - } - throw new ParserEOFException("End of file inside array."); - } - this.shift(); - return array; - case "<<": - const dict = new Dict(this.xref); - while (!isCmd(this.buf1, ">>") && this.buf1 !== EOF) { - if (!(this.buf1 instanceof Name)) { - info("Malformed dictionary: key must be a name object"); - this.shift(); - continue; - } - const key = this.buf1.name; - this.shift(); - if (this.buf1 === EOF) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - if (this.buf1 === EOF) { - if (this.recoveryMode) { - return dict; - } - throw new ParserEOFException("End of file inside dictionary."); - } - if (isCmd(this.buf2, "stream")) { - return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; - } - this.shift(); - return dict; - default: - return buf1; - } - } - if (Number.isInteger(buf1)) { - if (Number.isInteger(this.buf1) && isCmd(this.buf2, "R")) { - const ref = Ref.get(buf1, this.buf1); - this.shift(); - this.shift(); - return ref; - } - return buf1; - } - if (typeof buf1 === "string") { - if (cipherTransform) { - return cipherTransform.decryptString(buf1); - } - return buf1; - } - return buf1; - } - findDefaultInlineStreamEnd(stream) { - const E = 0x45, - I = 0x49, - SPACE = 0x20, - LF = 0xa, - CR = 0xd, - NUL = 0x0; - const { - knownCommands - } = this.lexer, - startPos = stream.pos, - n = 15; - let state = 0, - ch, - maybeEIPos; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = ch === E ? 1 : 0; - } else if (state === 1) { - state = ch === I ? 2 : 0; - } else { - if (ch === SPACE || ch === LF || ch === CR) { - maybeEIPos = stream.pos; - const followingBytes = stream.peekBytes(n); - const ii = followingBytes.length; - if (ii === 0) { - break; - } - for (let i = 0; i < ii; i++) { - ch = followingBytes[i]; - if (ch === NUL && followingBytes[i + 1] !== NUL) { - continue; - } - if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7f)) { - state = 0; - break; - } - } - if (state !== 2) { - continue; - } - if (!knownCommands) { - warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); - continue; - } - const tmpLexer = new Lexer(new Stream(stream.peekBytes(5 * n)), knownCommands); - tmpLexer._hexStringWarn = () => {}; - let numArgs = 0; - while (true) { - const nextObj = tmpLexer.getObj(); - if (nextObj === EOF) { - state = 0; - break; - } - if (nextObj instanceof Cmd) { - const knownCommand = knownCommands[nextObj.cmd]; - if (!knownCommand) { - state = 0; - break; - } else if (knownCommand.variableArgs ? numArgs <= knownCommand.numArgs : numArgs === knownCommand.numArgs) { - break; - } - numArgs = 0; - continue; - } - numArgs++; - } - if (state === 2) { - break; - } - } else { - state = 0; - } - } - } - if (ch === -1) { - warn("findDefaultInlineStreamEnd: " + "Reached the end of the stream without finding a valid EI marker"); - if (maybeEIPos) { - warn('... trying to recover by using the last "EI" occurrence.'); - stream.skip(-(stream.pos - maybeEIPos)); - } - } - let endOffset = 4; - stream.skip(-endOffset); - ch = stream.peekByte(); - stream.skip(endOffset); - if (!isWhiteSpace(ch)) { - endOffset--; - } - return stream.pos - endOffset - startPos; - } - findDCTDecodeInlineStreamEnd(stream) { - const startPos = stream.pos; - let foundEOI = false, - b, - markerLength; - while ((b = stream.getByte()) !== -1) { - if (b !== 0xff) { - continue; - } - switch (stream.getByte()) { - case 0x00: - break; - case 0xff: - stream.skip(-1); - break; - case 0xd9: - foundEOI = true; - break; - case 0xc0: - case 0xc1: - case 0xc2: - case 0xc3: - case 0xc5: - case 0xc6: - case 0xc7: - case 0xc9: - case 0xca: - case 0xcb: - case 0xcd: - case 0xce: - case 0xcf: - case 0xc4: - case 0xcc: - case 0xda: - case 0xdb: - case 0xdc: - case 0xdd: - case 0xde: - case 0xdf: - case 0xe0: - case 0xe1: - case 0xe2: - case 0xe3: - case 0xe4: - case 0xe5: - case 0xe6: - case 0xe7: - case 0xe8: - case 0xe9: - case 0xea: - case 0xeb: - case 0xec: - case 0xed: - case 0xee: - case 0xef: - case 0xfe: - markerLength = stream.getUint16(); - if (markerLength > 2) { - stream.skip(markerLength - 2); - } else { - stream.skip(-2); - } - break; - } - if (foundEOI) { - break; - } - } - const length = stream.pos - startPos; - if (b === -1) { - warn("Inline DCTDecode image stream: " + "EOI marker not found, searching for /EI/ instead."); - stream.skip(-length); - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - } - findASCII85DecodeInlineStreamEnd(stream) { - const TILDE = 0x7e, - GT = 0x3e; - const startPos = stream.pos; - let ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE) { - const tildePos = stream.pos; - ch = stream.peekByte(); - while (isWhiteSpace(ch)) { - stream.skip(); - ch = stream.peekByte(); - } - if (ch === GT) { - stream.skip(); - break; - } - if (stream.pos > tildePos) { - const maybeEI = stream.peekBytes(2); - if (maybeEI[0] === 0x45 && maybeEI[1] === 0x49) { - break; - } - } - } - } - const length = stream.pos - startPos; - if (ch === -1) { - warn("Inline ASCII85Decode image stream: " + "EOD marker not found, searching for /EI/ instead."); - stream.skip(-length); - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - } - findASCIIHexDecodeInlineStreamEnd(stream) { - const GT = 0x3e; - const startPos = stream.pos; - let ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === GT) { - break; - } - } - const length = stream.pos - startPos; - if (ch === -1) { - warn("Inline ASCIIHexDecode image stream: " + "EOD marker not found, searching for /EI/ instead."); - stream.skip(-length); - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - } - inlineStreamSkipEI(stream) { - const E = 0x45, - I = 0x49; - let state = 0, - ch; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = ch === E ? 1 : 0; - } else if (state === 1) { - state = ch === I ? 2 : 0; - } else if (state === 2) { - break; - } - } - } - makeInlineImage(cipherTransform) { - const lexer = this.lexer; - const stream = lexer.stream; - const dictMap = Object.create(null); - let dictLength; - while (!isCmd(this.buf1, "ID") && this.buf1 !== EOF) { - if (!(this.buf1 instanceof Name)) { - throw new FormatError("Dictionary key must be a name object"); - } - const key = this.buf1.name; - this.shift(); - if (this.buf1 === EOF) { - break; - } - dictMap[key] = this.getObj(cipherTransform); - } - if (lexer.beginInlineImagePos !== -1) { - dictLength = stream.pos - lexer.beginInlineImagePos; - } - const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); - let filterName; - if (filter instanceof Name) { - filterName = filter.name; - } else if (Array.isArray(filter)) { - const filterZero = this.xref.fetchIfRef(filter[0]); - if (filterZero instanceof Name) { - filterName = filterZero.name; - } - } - const startPos = stream.pos; - let length; - switch (filterName) { - case "DCT": - case "DCTDecode": - length = this.findDCTDecodeInlineStreamEnd(stream); - break; - case "A85": - case "ASCII85Decode": - length = this.findASCII85DecodeInlineStreamEnd(stream); - break; - case "AHx": - case "ASCIIHexDecode": - length = this.findASCIIHexDecodeInlineStreamEnd(stream); - break; - default: - length = this.findDefaultInlineStreamEnd(stream); - } - let cacheKey; - if (length < MAX_LENGTH_TO_CACHE && dictLength > 0) { - const initialStreamPos = stream.pos; - stream.pos = lexer.beginInlineImagePos; - cacheKey = getInlineImageCacheKey(stream.getBytes(dictLength + length)); - stream.pos = initialStreamPos; - const cacheEntry = this.imageCache[cacheKey]; - if (cacheEntry !== undefined) { - this.buf2 = Cmd.get("EI"); - this.shift(); - cacheEntry.reset(); - return cacheEntry; - } - } - const dict = new Dict(this.xref); - for (const key in dictMap) { - dict.set(key, dictMap[key]); - } - let imageStream = stream.makeSubStream(startPos, length, dict); - if (cipherTransform) { - imageStream = cipherTransform.createStream(imageStream, length); - } - imageStream = this.filter(imageStream, dict, length); - imageStream.dict = dict; - if (cacheKey !== undefined) { - imageStream.cacheKey = `inline_img_${++this._imageId}`; - this.imageCache[cacheKey] = imageStream; - } - this.buf2 = Cmd.get("EI"); - this.shift(); - return imageStream; - } - #findStreamLength(startPos) { - const { - stream - } = this.lexer; - stream.pos = startPos; - const SCAN_BLOCK_LENGTH = 2048; - const signatureLength = "endstream".length; - const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); - const endLength = END_SIGNATURE.length; - const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])]; - const normalLength = signatureLength - endLength; - while (stream.pos < stream.end) { - const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); - const scanLength = scanBytes.length - signatureLength; - if (scanLength <= 0) { - break; - } - let pos = 0; - while (pos < scanLength) { - let j = 0; - while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { - j++; - } - if (j >= endLength) { - let found = false; - for (const part of PARTIAL_SIGNATURE) { - const partLen = part.length; - let k = 0; - while (k < partLen && scanBytes[pos + j + k] === part[k]) { - k++; - } - if (k >= normalLength) { - found = true; - break; - } - if (k >= partLen) { - const lastByte = scanBytes[pos + j + k]; - if (isWhiteSpace(lastByte)) { - info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); - found = true; - } - break; - } - } - if (found) { - stream.pos += pos; - return stream.pos - startPos; - } - } - pos++; - } - stream.pos += scanLength; - } - return -1; - } - makeStream(dict, cipherTransform) { - const lexer = this.lexer; - let stream = lexer.stream; - lexer.skipToNextLine(); - const startPos = stream.pos - 1; - let length = dict.get("Length"); - if (!Number.isInteger(length)) { - info(`Bad length "${length && length.toString()}" in stream.`); - length = 0; - } - stream.pos = startPos + length; - lexer.nextChar(); - if (this.tryShift() && isCmd(this.buf2, "endstream")) { - this.shift(); - } else { - length = this.#findStreamLength(startPos); - if (length < 0) { - throw new FormatError("Missing endstream command."); - } - lexer.nextChar(); - this.shift(); - this.shift(); - } - this.shift(); - stream = stream.makeSubStream(startPos, length, dict); - if (cipherTransform) { - stream = cipherTransform.createStream(stream, length); - } - stream = this.filter(stream, dict, length); - stream.dict = dict; - return stream; - } - filter(stream, dict, length) { - let filter = dict.get("F", "Filter"); - let params = dict.get("DP", "DecodeParms"); - if (filter instanceof Name) { - if (Array.isArray(params)) { - warn("/DecodeParms should not be an Array, when /Filter is a Name."); - } - return this.makeFilter(stream, filter.name, length, params); - } - let maybeLength = length; - if (Array.isArray(filter)) { - const filterArray = filter; - const paramsArray = params; - for (let i = 0, ii = filterArray.length; i < ii; ++i) { - filter = this.xref.fetchIfRef(filterArray[i]); - if (!(filter instanceof Name)) { - throw new FormatError(`Bad filter name "${filter}"`); - } - params = null; - if (Array.isArray(paramsArray) && i in paramsArray) { - params = this.xref.fetchIfRef(paramsArray[i]); - } - stream = this.makeFilter(stream, filter.name, maybeLength, params); - maybeLength = null; - } - } - return stream; - } - makeFilter(stream, name, maybeLength, params) { - if (maybeLength === 0) { - warn(`Empty "${name}" stream.`); - return new NullStream(); - } - try { - switch (name) { - case "Fl": - case "FlateDecode": - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); - } - return new FlateStream(stream, maybeLength); - case "LZW": - case "LZWDecode": - let earlyChange = 1; - if (params) { - if (params.has("EarlyChange")) { - earlyChange = params.get("EarlyChange"); - } - return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); - } - return new LZWStream(stream, maybeLength, earlyChange); - case "DCT": - case "DCTDecode": - return new JpegStream(stream, maybeLength, params); - case "JPX": - case "JPXDecode": - return new JpxStream(stream, maybeLength, params); - case "A85": - case "ASCII85Decode": - return new Ascii85Stream(stream, maybeLength); - case "AHx": - case "ASCIIHexDecode": - return new AsciiHexStream(stream, maybeLength); - case "CCF": - case "CCITTFaxDecode": - return new CCITTFaxStream(stream, maybeLength, params); - case "RL": - case "RunLengthDecode": - return new RunLengthStream(stream, maybeLength); - case "JBIG2Decode": - return new Jbig2Stream(stream, maybeLength, params); - } - warn(`Filter "${name}" is not supported.`); - return stream; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`Invalid stream: "${ex}"`); - return new NullStream(); - } - } -} -const specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { - return ch & 0x0f; - } - if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { - return (ch & 0x0f) + 9; - } - return -1; -} -class Lexer { - constructor(stream, knownCommands = null) { - this.stream = stream; - this.nextChar(); - this.strBuf = []; - this.knownCommands = knownCommands; - this._hexStringNumWarn = 0; - this.beginInlineImagePos = -1; - } - nextChar() { - return this.currentChar = this.stream.getByte(); - } - peekChar() { - return this.stream.peekByte(); - } - getNumber() { - let ch = this.currentChar; - let eNotation = false; - let divideBy = 0; - let sign = 1; - if (ch === 0x2d) { - sign = -1; - ch = this.nextChar(); - if (ch === 0x2d) { - ch = this.nextChar(); - } - } else if (ch === 0x2b) { - ch = this.nextChar(); - } - if (ch === 0x0a || ch === 0x0d) { - do { - ch = this.nextChar(); - } while (ch === 0x0a || ch === 0x0d); - } - if (ch === 0x2e) { - divideBy = 10; - ch = this.nextChar(); - } - if (ch < 0x30 || ch > 0x39) { - const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; - if (isWhiteSpace(ch) || ch === 0x28 || ch === 0x3c || ch === -1) { - info(`Lexer.getNumber - "${msg}".`); - return 0; - } - throw new FormatError(msg); - } - let baseValue = ch - 0x30; - let powerValue = 0; - let powerValueSign = 1; - while ((ch = this.nextChar()) >= 0) { - if (ch >= 0x30 && ch <= 0x39) { - const currentDigit = ch - 0x30; - if (eNotation) { - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; - } - } else if (ch === 0x2e) { - if (divideBy === 0) { - divideBy = 1; - } else { - break; - } - } else if (ch === 0x2d) { - warn("Badly formatted number: minus sign in the middle"); - } else if (ch === 0x45 || ch === 0x65) { - ch = this.peekChar(); - if (ch === 0x2b || ch === 0x2d) { - powerValueSign = ch === 0x2d ? -1 : 1; - this.nextChar(); - } else if (ch < 0x30 || ch > 0x39) { - break; - } - eNotation = true; - } else { - break; - } - } - if (divideBy !== 0) { - baseValue /= divideBy; - } - if (eNotation) { - baseValue *= 10 ** (powerValueSign * powerValue); - } - return sign * baseValue; - } - getString() { - let numParen = 1; - let done = false; - const strBuf = this.strBuf; - strBuf.length = 0; - let ch = this.nextChar(); - while (true) { - let charBuffered = false; - switch (ch | 0) { - case -1: - warn("Unterminated string"); - done = true; - break; - case 0x28: - ++numParen; - strBuf.push("("); - break; - case 0x29: - if (--numParen === 0) { - this.nextChar(); - done = true; - } else { - strBuf.push(")"); - } - break; - case 0x5c: - ch = this.nextChar(); - switch (ch) { - case -1: - warn("Unterminated string"); - done = true; - break; - case 0x6e: - strBuf.push("\n"); - break; - case 0x72: - strBuf.push("\r"); - break; - case 0x74: - strBuf.push("\t"); - break; - case 0x62: - strBuf.push("\b"); - break; - case 0x66: - strBuf.push("\f"); - break; - case 0x5c: - case 0x28: - case 0x29: - strBuf.push(String.fromCharCode(ch)); - break; - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - let x = ch & 0x0f; - ch = this.nextChar(); - charBuffered = true; - if (ch >= 0x30 && ch <= 0x37) { - x = (x << 3) + (ch & 0x0f); - ch = this.nextChar(); - if (ch >= 0x30 && ch <= 0x37) { - charBuffered = false; - x = (x << 3) + (ch & 0x0f); - } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0d: - if (this.peekChar() === 0x0a) { - this.nextChar(); - } - break; - case 0x0a: - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(""); - } - getName() { - let ch, previousCh; - const strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { - ch = this.nextChar(); - if (specialChars[ch]) { - warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); - strBuf.push("#"); - break; - } - const x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - const x2 = toHexDigit(ch); - if (x2 === -1) { - warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); - strBuf.push("#", String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode(x << 4 | x2)); - } else { - strBuf.push("#", String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); - } - return Name.get(strBuf.join("")); - } - _hexStringWarn(ch) { - const MAX_HEX_STRING_NUM_WARN = 5; - if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { - warn("getHexString - ignoring additional invalid characters."); - return; - } - if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { - return; - } - warn(`getHexString - ignoring invalid character: ${ch}`); - } - getHexString() { - const strBuf = this.strBuf; - strBuf.length = 0; - let ch = this.currentChar; - let firstDigit = -1, - digit = -1; - this._hexStringNumWarn = 0; - while (true) { - if (ch < 0) { - warn("Unterminated hex string"); - break; - } else if (ch === 0x3e) { - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - digit = toHexDigit(ch); - if (digit === -1) { - this._hexStringWarn(ch); - } else if (firstDigit === -1) { - firstDigit = digit; - } else { - strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); - firstDigit = -1; - } - ch = this.nextChar(); - } - } - if (firstDigit !== -1) { - strBuf.push(String.fromCharCode(firstDigit << 4)); - } - return strBuf.join(""); - } - getObj() { - let comment = false; - let ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0a || ch === 0x0d) { - comment = false; - } - } else if (ch === 0x25) { - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - switch (ch | 0) { - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x2b: - case 0x2d: - case 0x2e: - return this.getNumber(); - case 0x28: - return this.getString(); - case 0x2f: - return this.getName(); - case 0x5b: - this.nextChar(); - return Cmd.get("["); - case 0x5d: - this.nextChar(); - return Cmd.get("]"); - case 0x3c: - ch = this.nextChar(); - if (ch === 0x3c) { - this.nextChar(); - return Cmd.get("<<"); - } - return this.getHexString(); - case 0x3e: - ch = this.nextChar(); - if (ch === 0x3e) { - this.nextChar(); - return Cmd.get(">>"); - } - return Cmd.get(">"); - case 0x7b: - this.nextChar(); - return Cmd.get("{"); - case 0x7d: - this.nextChar(); - return Cmd.get("}"); - case 0x29: - this.nextChar(); - throw new FormatError(`Illegal character: ${ch}`); - } - let str = String.fromCharCode(ch); - if (ch < 0x20 || ch > 0x7f) { - const nextCh = this.peekChar(); - if (nextCh >= 0x20 && nextCh <= 0x7f) { - this.nextChar(); - return Cmd.get(str); - } - } - const knownCommands = this.knownCommands; - let knownCommandFound = knownCommands?.[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - const possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - throw new FormatError(`Command token too long: ${str.length}`); - } - str = possibleCommand; - knownCommandFound = knownCommands?.[str] !== undefined; - } - if (str === "true") { - return true; - } - if (str === "false") { - return false; - } - if (str === "null") { - return null; - } - if (str === "BI") { - this.beginInlineImagePos = this.stream.pos; - } - return Cmd.get(str); - } - skipToNextLine() { - let ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0d) { - ch = this.nextChar(); - if (ch === 0x0a) { - this.nextChar(); - } - break; - } else if (ch === 0x0a) { - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } -} -class Linearization { - static create(stream) { - function getInt(linDict, name, allowZeroValue = false) { - const obj = linDict.get(name); - if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); - } - function getHints(linDict) { - const hints = linDict.get("H"); - let hintsLength; - if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (let index = 0; index < hintsLength; index++) { - const hint = hints[index]; - if (!(Number.isInteger(hint) && hint > 0)) { - throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); - } - } - return hints; - } - throw new Error("Hint array in the linearization dictionary is invalid."); - } - const parser = new Parser({ - lexer: new Lexer(stream), - xref: null - }); - const obj1 = parser.getObj(); - const obj2 = parser.getObj(); - const obj3 = parser.getObj(); - const linDict = parser.getObj(); - let obj, length; - if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { - return null; - } else if ((length = getInt(linDict, "L")) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); - } - return { - length, - hints: getHints(linDict), - objectNumberFirst: getInt(linDict, "O"), - endFirst: getInt(linDict, "E"), - numPages: getInt(linDict, "N"), - mainXRefEntriesOffset: getInt(linDict, "T"), - pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 - }; - } -} - -;// ./src/core/cmap.js - - - - - - - -const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; -const MAX_MAP_RANGE = 2 ** 24 - 1; -class CMap { - constructor(builtInCMap = false) { - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - this._map = []; - this.name = ""; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - addCodespaceRange(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - } - mapCidRange(low, high, dstLow) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); - } - while (low <= high) { - this._map[low++] = dstLow++; - } - } - mapBfRange(low, high, dstLow) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); - } - const lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - const nextCharCode = dstLow.charCodeAt(lastByte) + 1; - if (nextCharCode > 0xff) { - dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; - continue; - } - dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); - } - } - mapBfRangeToArray(low, high, array) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); - } - const ii = array.length; - let i = 0; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - } - mapOne(src, dst) { - this._map[src] = dst; - } - lookup(code) { - return this._map[code]; - } - contains(code) { - return this._map[code] !== undefined; - } - forEach(callback) { - const map = this._map; - const length = map.length; - if (length <= 0x10000) { - for (let i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (const i in map) { - callback(i, map[i]); - } - } - } - charCodeOf(value) { - const map = this._map; - if (map.length <= 0x10000) { - return map.indexOf(value); - } - for (const charCode in map) { - if (map[charCode] === value) { - return charCode | 0; - } - } - return -1; - } - getMap() { - return this._map; - } - readCharCode(str, offset, out) { - let c = 0; - const codespaceRanges = this.codespaceRanges; - for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { - c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; - const codespaceRange = codespaceRanges[n]; - for (let k = 0, kk = codespaceRange.length; k < kk;) { - const low = codespaceRange[k++]; - const high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - } - getCharCodeLength(charCode) { - const codespaceRanges = this.codespaceRanges; - for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { - const codespaceRange = codespaceRanges[n]; - for (let k = 0, kk = codespaceRange.length; k < kk;) { - const low = codespaceRange[k++]; - const high = codespaceRange[k++]; - if (charCode >= low && charCode <= high) { - return n + 1; - } - } - } - return 1; - } - get length() { - return this._map.length; - } - get isIdentityCMap() { - if (!(this.name === "Identity-H" || this.name === "Identity-V")) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (let i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } -} -class IdentityCMap extends CMap { - constructor(vertical, n) { - super(); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - mapCidRange(low, high, dstLow) { - unreachable("should not call mapCidRange"); - } - mapBfRange(low, high, dstLow) { - unreachable("should not call mapBfRange"); - } - mapBfRangeToArray(low, high, array) { - unreachable("should not call mapBfRangeToArray"); - } - mapOne(src, dst) { - unreachable("should not call mapCidOne"); - } - lookup(code) { - return Number.isInteger(code) && code <= 0xffff ? code : undefined; - } - contains(code) { - return Number.isInteger(code) && code <= 0xffff; - } - forEach(callback) { - for (let i = 0; i <= 0xffff; i++) { - callback(i, i); - } - } - charCodeOf(value) { - return Number.isInteger(value) && value <= 0xffff ? value : -1; - } - getMap() { - const map = new Array(0x10000); - for (let i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - } - get length() { - return 0x10000; - } - get isIdentityCMap() { - unreachable("should not access .isIdentityCMap"); - } -} -function strToInt(str) { - let a = 0; - for (let i = 0; i < str.length; i++) { - a = a << 8 | str.charCodeAt(i); - } - return a >>> 0; -} -function expectString(obj) { - if (typeof obj !== "string") { - throw new FormatError("Malformed CMap: expected string."); - } -} -function expectInt(obj) { - if (!Number.isInteger(obj)) { - throw new FormatError("Malformed CMap: expected int."); - } -} -function parseBfChar(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endbfchar")) { - return; - } - expectString(obj); - const src = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const dst = obj; - cMap.mapOne(src, dst); - } -} -function parseBfRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endbfrange")) { - return; - } - expectString(obj); - const low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const high = strToInt(obj); - obj = lexer.getObj(); - if (Number.isInteger(obj) || typeof obj === "string") { - const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, "[")) { - obj = lexer.getObj(); - const array = []; - while (!isCmd(obj, "]") && obj !== EOF) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - throw new FormatError("Invalid bf range."); -} -function parseCidChar(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcidchar")) { - return; - } - expectString(obj); - const src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - const dst = obj; - cMap.mapOne(src, dst); - } -} -function parseCidRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcidrange")) { - return; - } - expectString(obj); - const low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - const dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } -} -function parseCodespaceRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcodespacerange")) { - return; - } - if (typeof obj !== "string") { - break; - } - const low = strToInt(obj); - obj = lexer.getObj(); - if (typeof obj !== "string") { - break; - } - const high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - throw new FormatError("Invalid codespace range."); -} -function parseWMode(cMap, lexer) { - const obj = lexer.getObj(); - if (Number.isInteger(obj)) { - cMap.vertical = !!obj; - } -} -function parseCMapName(cMap, lexer) { - const obj = lexer.getObj(); - if (obj instanceof Name) { - cMap.name = obj.name; - } -} -async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { - let previous, embeddedUseCMap; - objLoop: while (true) { - try { - const obj = lexer.getObj(); - if (obj === EOF) { - break; - } else if (obj instanceof Name) { - if (obj.name === "WMode") { - parseWMode(cMap, lexer); - } else if (obj.name === "CMapName") { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (obj instanceof Cmd) { - switch (obj.cmd) { - case "endcmap": - break objLoop; - case "usecmap": - if (previous instanceof Name) { - embeddedUseCMap = previous.name; - } - break; - case "begincodespacerange": - parseCodespaceRange(cMap, lexer); - break; - case "beginbfchar": - parseBfChar(cMap, lexer); - break; - case "begincidchar": - parseCidChar(cMap, lexer); - break; - case "beginbfrange": - parseBfRange(cMap, lexer); - break; - case "begincidrange": - parseCidRange(cMap, lexer); - break; - } - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Invalid cMap data: " + ex); - continue; - } - } - if (!useCMap && embeddedUseCMap) { - useCMap = embeddedUseCMap; - } - if (useCMap) { - return extendCMap(cMap, fetchBuiltInCMap, useCMap); - } - return cMap; -} -async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { - cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); - if (cMap.numCodespaceRanges === 0) { - const useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (let i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - cMap.useCMap.forEach(function (key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, value); - } - }); - return cMap; -} -async function createBuiltInCMap(name, fetchBuiltInCMap) { - if (name === "Identity-H") { - return new IdentityCMap(false, 2); - } else if (name === "Identity-V") { - return new IdentityCMap(true, 2); - } - if (!BUILT_IN_CMAPS.includes(name)) { - throw new Error("Unknown CMap name: " + name); - } - if (!fetchBuiltInCMap) { - throw new Error("Built-in CMap parameters are not provided."); - } - const { - cMapData, - isCompressed - } = await fetchBuiltInCMap(name); - const cMap = new CMap(true); - if (isCompressed) { - return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); - } - const lexer = new Lexer(new Stream(cMapData)); - return parseCMap(cMap, lexer, fetchBuiltInCMap, null); -} -class CMapFactory { - static async create({ - encoding, - fetchBuiltInCMap, - useCMap - }) { - if (encoding instanceof Name) { - return createBuiltInCMap(encoding.name, fetchBuiltInCMap); - } else if (encoding instanceof BaseStream) { - const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); - if (parsedCMap.isIdentityCMap) { - return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); - } - return parsedCMap; - } - throw new Error("Encoding required."); - } -} - -;// ./src/core/encodings.js -const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; -const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; -const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; -const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; -const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; -const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; -const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; -function getEncoding(encodingName) { - switch (encodingName) { - case "WinAnsiEncoding": - return WinAnsiEncoding; - case "StandardEncoding": - return StandardEncoding; - case "MacRomanEncoding": - return MacRomanEncoding; - case "SymbolSetEncoding": - return SymbolSetEncoding; - case "ZapfDingbatsEncoding": - return ZapfDingbatsEncoding; - case "ExpertEncoding": - return ExpertEncoding; - case "MacExpertEncoding": - return MacExpertEncoding; - default: - return null; - } -} - -;// ./src/core/glyphlist.js - -const getGlyphsUnicode = getLookupTableFactory(function (t) { - t.A = 0x0041; - t.AE = 0x00c6; - t.AEacute = 0x01fc; - t.AEmacron = 0x01e2; - t.AEsmall = 0xf7e6; - t.Aacute = 0x00c1; - t.Aacutesmall = 0xf7e1; - t.Abreve = 0x0102; - t.Abreveacute = 0x1eae; - t.Abrevecyrillic = 0x04d0; - t.Abrevedotbelow = 0x1eb6; - t.Abrevegrave = 0x1eb0; - t.Abrevehookabove = 0x1eb2; - t.Abrevetilde = 0x1eb4; - t.Acaron = 0x01cd; - t.Acircle = 0x24b6; - t.Acircumflex = 0x00c2; - t.Acircumflexacute = 0x1ea4; - t.Acircumflexdotbelow = 0x1eac; - t.Acircumflexgrave = 0x1ea6; - t.Acircumflexhookabove = 0x1ea8; - t.Acircumflexsmall = 0xf7e2; - t.Acircumflextilde = 0x1eaa; - t.Acute = 0xf6c9; - t.Acutesmall = 0xf7b4; - t.Acyrillic = 0x0410; - t.Adblgrave = 0x0200; - t.Adieresis = 0x00c4; - t.Adieresiscyrillic = 0x04d2; - t.Adieresismacron = 0x01de; - t.Adieresissmall = 0xf7e4; - t.Adotbelow = 0x1ea0; - t.Adotmacron = 0x01e0; - t.Agrave = 0x00c0; - t.Agravesmall = 0xf7e0; - t.Ahookabove = 0x1ea2; - t.Aiecyrillic = 0x04d4; - t.Ainvertedbreve = 0x0202; - t.Alpha = 0x0391; - t.Alphatonos = 0x0386; - t.Amacron = 0x0100; - t.Amonospace = 0xff21; - t.Aogonek = 0x0104; - t.Aring = 0x00c5; - t.Aringacute = 0x01fa; - t.Aringbelow = 0x1e00; - t.Aringsmall = 0xf7e5; - t.Asmall = 0xf761; - t.Atilde = 0x00c3; - t.Atildesmall = 0xf7e3; - t.Aybarmenian = 0x0531; - t.B = 0x0042; - t.Bcircle = 0x24b7; - t.Bdotaccent = 0x1e02; - t.Bdotbelow = 0x1e04; - t.Becyrillic = 0x0411; - t.Benarmenian = 0x0532; - t.Beta = 0x0392; - t.Bhook = 0x0181; - t.Blinebelow = 0x1e06; - t.Bmonospace = 0xff22; - t.Brevesmall = 0xf6f4; - t.Bsmall = 0xf762; - t.Btopbar = 0x0182; - t.C = 0x0043; - t.Caarmenian = 0x053e; - t.Cacute = 0x0106; - t.Caron = 0xf6ca; - t.Caronsmall = 0xf6f5; - t.Ccaron = 0x010c; - t.Ccedilla = 0x00c7; - t.Ccedillaacute = 0x1e08; - t.Ccedillasmall = 0xf7e7; - t.Ccircle = 0x24b8; - t.Ccircumflex = 0x0108; - t.Cdot = 0x010a; - t.Cdotaccent = 0x010a; - t.Cedillasmall = 0xf7b8; - t.Chaarmenian = 0x0549; - t.Cheabkhasiancyrillic = 0x04bc; - t.Checyrillic = 0x0427; - t.Chedescenderabkhasiancyrillic = 0x04be; - t.Chedescendercyrillic = 0x04b6; - t.Chedieresiscyrillic = 0x04f4; - t.Cheharmenian = 0x0543; - t.Chekhakassiancyrillic = 0x04cb; - t.Cheverticalstrokecyrillic = 0x04b8; - t.Chi = 0x03a7; - t.Chook = 0x0187; - t.Circumflexsmall = 0xf6f6; - t.Cmonospace = 0xff23; - t.Coarmenian = 0x0551; - t.Csmall = 0xf763; - t.D = 0x0044; - t.DZ = 0x01f1; - t.DZcaron = 0x01c4; - t.Daarmenian = 0x0534; - t.Dafrican = 0x0189; - t.Dcaron = 0x010e; - t.Dcedilla = 0x1e10; - t.Dcircle = 0x24b9; - t.Dcircumflexbelow = 0x1e12; - t.Dcroat = 0x0110; - t.Ddotaccent = 0x1e0a; - t.Ddotbelow = 0x1e0c; - t.Decyrillic = 0x0414; - t.Deicoptic = 0x03ee; - t.Delta = 0x2206; - t.Deltagreek = 0x0394; - t.Dhook = 0x018a; - t.Dieresis = 0xf6cb; - t.DieresisAcute = 0xf6cc; - t.DieresisGrave = 0xf6cd; - t.Dieresissmall = 0xf7a8; - t.Digammagreek = 0x03dc; - t.Djecyrillic = 0x0402; - t.Dlinebelow = 0x1e0e; - t.Dmonospace = 0xff24; - t.Dotaccentsmall = 0xf6f7; - t.Dslash = 0x0110; - t.Dsmall = 0xf764; - t.Dtopbar = 0x018b; - t.Dz = 0x01f2; - t.Dzcaron = 0x01c5; - t.Dzeabkhasiancyrillic = 0x04e0; - t.Dzecyrillic = 0x0405; - t.Dzhecyrillic = 0x040f; - t.E = 0x0045; - t.Eacute = 0x00c9; - t.Eacutesmall = 0xf7e9; - t.Ebreve = 0x0114; - t.Ecaron = 0x011a; - t.Ecedillabreve = 0x1e1c; - t.Echarmenian = 0x0535; - t.Ecircle = 0x24ba; - t.Ecircumflex = 0x00ca; - t.Ecircumflexacute = 0x1ebe; - t.Ecircumflexbelow = 0x1e18; - t.Ecircumflexdotbelow = 0x1ec6; - t.Ecircumflexgrave = 0x1ec0; - t.Ecircumflexhookabove = 0x1ec2; - t.Ecircumflexsmall = 0xf7ea; - t.Ecircumflextilde = 0x1ec4; - t.Ecyrillic = 0x0404; - t.Edblgrave = 0x0204; - t.Edieresis = 0x00cb; - t.Edieresissmall = 0xf7eb; - t.Edot = 0x0116; - t.Edotaccent = 0x0116; - t.Edotbelow = 0x1eb8; - t.Efcyrillic = 0x0424; - t.Egrave = 0x00c8; - t.Egravesmall = 0xf7e8; - t.Eharmenian = 0x0537; - t.Ehookabove = 0x1eba; - t.Eightroman = 0x2167; - t.Einvertedbreve = 0x0206; - t.Eiotifiedcyrillic = 0x0464; - t.Elcyrillic = 0x041b; - t.Elevenroman = 0x216a; - t.Emacron = 0x0112; - t.Emacronacute = 0x1e16; - t.Emacrongrave = 0x1e14; - t.Emcyrillic = 0x041c; - t.Emonospace = 0xff25; - t.Encyrillic = 0x041d; - t.Endescendercyrillic = 0x04a2; - t.Eng = 0x014a; - t.Enghecyrillic = 0x04a4; - t.Enhookcyrillic = 0x04c7; - t.Eogonek = 0x0118; - t.Eopen = 0x0190; - t.Epsilon = 0x0395; - t.Epsilontonos = 0x0388; - t.Ercyrillic = 0x0420; - t.Ereversed = 0x018e; - t.Ereversedcyrillic = 0x042d; - t.Escyrillic = 0x0421; - t.Esdescendercyrillic = 0x04aa; - t.Esh = 0x01a9; - t.Esmall = 0xf765; - t.Eta = 0x0397; - t.Etarmenian = 0x0538; - t.Etatonos = 0x0389; - t.Eth = 0x00d0; - t.Ethsmall = 0xf7f0; - t.Etilde = 0x1ebc; - t.Etildebelow = 0x1e1a; - t.Euro = 0x20ac; - t.Ezh = 0x01b7; - t.Ezhcaron = 0x01ee; - t.Ezhreversed = 0x01b8; - t.F = 0x0046; - t.Fcircle = 0x24bb; - t.Fdotaccent = 0x1e1e; - t.Feharmenian = 0x0556; - t.Feicoptic = 0x03e4; - t.Fhook = 0x0191; - t.Fitacyrillic = 0x0472; - t.Fiveroman = 0x2164; - t.Fmonospace = 0xff26; - t.Fourroman = 0x2163; - t.Fsmall = 0xf766; - t.G = 0x0047; - t.GBsquare = 0x3387; - t.Gacute = 0x01f4; - t.Gamma = 0x0393; - t.Gammaafrican = 0x0194; - t.Gangiacoptic = 0x03ea; - t.Gbreve = 0x011e; - t.Gcaron = 0x01e6; - t.Gcedilla = 0x0122; - t.Gcircle = 0x24bc; - t.Gcircumflex = 0x011c; - t.Gcommaaccent = 0x0122; - t.Gdot = 0x0120; - t.Gdotaccent = 0x0120; - t.Gecyrillic = 0x0413; - t.Ghadarmenian = 0x0542; - t.Ghemiddlehookcyrillic = 0x0494; - t.Ghestrokecyrillic = 0x0492; - t.Gheupturncyrillic = 0x0490; - t.Ghook = 0x0193; - t.Gimarmenian = 0x0533; - t.Gjecyrillic = 0x0403; - t.Gmacron = 0x1e20; - t.Gmonospace = 0xff27; - t.Grave = 0xf6ce; - t.Gravesmall = 0xf760; - t.Gsmall = 0xf767; - t.Gsmallhook = 0x029b; - t.Gstroke = 0x01e4; - t.H = 0x0048; - t.H18533 = 0x25cf; - t.H18543 = 0x25aa; - t.H18551 = 0x25ab; - t.H22073 = 0x25a1; - t.HPsquare = 0x33cb; - t.Haabkhasiancyrillic = 0x04a8; - t.Hadescendercyrillic = 0x04b2; - t.Hardsigncyrillic = 0x042a; - t.Hbar = 0x0126; - t.Hbrevebelow = 0x1e2a; - t.Hcedilla = 0x1e28; - t.Hcircle = 0x24bd; - t.Hcircumflex = 0x0124; - t.Hdieresis = 0x1e26; - t.Hdotaccent = 0x1e22; - t.Hdotbelow = 0x1e24; - t.Hmonospace = 0xff28; - t.Hoarmenian = 0x0540; - t.Horicoptic = 0x03e8; - t.Hsmall = 0xf768; - t.Hungarumlaut = 0xf6cf; - t.Hungarumlautsmall = 0xf6f8; - t.Hzsquare = 0x3390; - t.I = 0x0049; - t.IAcyrillic = 0x042f; - t.IJ = 0x0132; - t.IUcyrillic = 0x042e; - t.Iacute = 0x00cd; - t.Iacutesmall = 0xf7ed; - t.Ibreve = 0x012c; - t.Icaron = 0x01cf; - t.Icircle = 0x24be; - t.Icircumflex = 0x00ce; - t.Icircumflexsmall = 0xf7ee; - t.Icyrillic = 0x0406; - t.Idblgrave = 0x0208; - t.Idieresis = 0x00cf; - t.Idieresisacute = 0x1e2e; - t.Idieresiscyrillic = 0x04e4; - t.Idieresissmall = 0xf7ef; - t.Idot = 0x0130; - t.Idotaccent = 0x0130; - t.Idotbelow = 0x1eca; - t.Iebrevecyrillic = 0x04d6; - t.Iecyrillic = 0x0415; - t.Ifraktur = 0x2111; - t.Igrave = 0x00cc; - t.Igravesmall = 0xf7ec; - t.Ihookabove = 0x1ec8; - t.Iicyrillic = 0x0418; - t.Iinvertedbreve = 0x020a; - t.Iishortcyrillic = 0x0419; - t.Imacron = 0x012a; - t.Imacroncyrillic = 0x04e2; - t.Imonospace = 0xff29; - t.Iniarmenian = 0x053b; - t.Iocyrillic = 0x0401; - t.Iogonek = 0x012e; - t.Iota = 0x0399; - t.Iotaafrican = 0x0196; - t.Iotadieresis = 0x03aa; - t.Iotatonos = 0x038a; - t.Ismall = 0xf769; - t.Istroke = 0x0197; - t.Itilde = 0x0128; - t.Itildebelow = 0x1e2c; - t.Izhitsacyrillic = 0x0474; - t.Izhitsadblgravecyrillic = 0x0476; - t.J = 0x004a; - t.Jaarmenian = 0x0541; - t.Jcircle = 0x24bf; - t.Jcircumflex = 0x0134; - t.Jecyrillic = 0x0408; - t.Jheharmenian = 0x054b; - t.Jmonospace = 0xff2a; - t.Jsmall = 0xf76a; - t.K = 0x004b; - t.KBsquare = 0x3385; - t.KKsquare = 0x33cd; - t.Kabashkircyrillic = 0x04a0; - t.Kacute = 0x1e30; - t.Kacyrillic = 0x041a; - t.Kadescendercyrillic = 0x049a; - t.Kahookcyrillic = 0x04c3; - t.Kappa = 0x039a; - t.Kastrokecyrillic = 0x049e; - t.Kaverticalstrokecyrillic = 0x049c; - t.Kcaron = 0x01e8; - t.Kcedilla = 0x0136; - t.Kcircle = 0x24c0; - t.Kcommaaccent = 0x0136; - t.Kdotbelow = 0x1e32; - t.Keharmenian = 0x0554; - t.Kenarmenian = 0x053f; - t.Khacyrillic = 0x0425; - t.Kheicoptic = 0x03e6; - t.Khook = 0x0198; - t.Kjecyrillic = 0x040c; - t.Klinebelow = 0x1e34; - t.Kmonospace = 0xff2b; - t.Koppacyrillic = 0x0480; - t.Koppagreek = 0x03de; - t.Ksicyrillic = 0x046e; - t.Ksmall = 0xf76b; - t.L = 0x004c; - t.LJ = 0x01c7; - t.LL = 0xf6bf; - t.Lacute = 0x0139; - t.Lambda = 0x039b; - t.Lcaron = 0x013d; - t.Lcedilla = 0x013b; - t.Lcircle = 0x24c1; - t.Lcircumflexbelow = 0x1e3c; - t.Lcommaaccent = 0x013b; - t.Ldot = 0x013f; - t.Ldotaccent = 0x013f; - t.Ldotbelow = 0x1e36; - t.Ldotbelowmacron = 0x1e38; - t.Liwnarmenian = 0x053c; - t.Lj = 0x01c8; - t.Ljecyrillic = 0x0409; - t.Llinebelow = 0x1e3a; - t.Lmonospace = 0xff2c; - t.Lslash = 0x0141; - t.Lslashsmall = 0xf6f9; - t.Lsmall = 0xf76c; - t.M = 0x004d; - t.MBsquare = 0x3386; - t.Macron = 0xf6d0; - t.Macronsmall = 0xf7af; - t.Macute = 0x1e3e; - t.Mcircle = 0x24c2; - t.Mdotaccent = 0x1e40; - t.Mdotbelow = 0x1e42; - t.Menarmenian = 0x0544; - t.Mmonospace = 0xff2d; - t.Msmall = 0xf76d; - t.Mturned = 0x019c; - t.Mu = 0x039c; - t.N = 0x004e; - t.NJ = 0x01ca; - t.Nacute = 0x0143; - t.Ncaron = 0x0147; - t.Ncedilla = 0x0145; - t.Ncircle = 0x24c3; - t.Ncircumflexbelow = 0x1e4a; - t.Ncommaaccent = 0x0145; - t.Ndotaccent = 0x1e44; - t.Ndotbelow = 0x1e46; - t.Nhookleft = 0x019d; - t.Nineroman = 0x2168; - t.Nj = 0x01cb; - t.Njecyrillic = 0x040a; - t.Nlinebelow = 0x1e48; - t.Nmonospace = 0xff2e; - t.Nowarmenian = 0x0546; - t.Nsmall = 0xf76e; - t.Ntilde = 0x00d1; - t.Ntildesmall = 0xf7f1; - t.Nu = 0x039d; - t.O = 0x004f; - t.OE = 0x0152; - t.OEsmall = 0xf6fa; - t.Oacute = 0x00d3; - t.Oacutesmall = 0xf7f3; - t.Obarredcyrillic = 0x04e8; - t.Obarreddieresiscyrillic = 0x04ea; - t.Obreve = 0x014e; - t.Ocaron = 0x01d1; - t.Ocenteredtilde = 0x019f; - t.Ocircle = 0x24c4; - t.Ocircumflex = 0x00d4; - t.Ocircumflexacute = 0x1ed0; - t.Ocircumflexdotbelow = 0x1ed8; - t.Ocircumflexgrave = 0x1ed2; - t.Ocircumflexhookabove = 0x1ed4; - t.Ocircumflexsmall = 0xf7f4; - t.Ocircumflextilde = 0x1ed6; - t.Ocyrillic = 0x041e; - t.Odblacute = 0x0150; - t.Odblgrave = 0x020c; - t.Odieresis = 0x00d6; - t.Odieresiscyrillic = 0x04e6; - t.Odieresissmall = 0xf7f6; - t.Odotbelow = 0x1ecc; - t.Ogoneksmall = 0xf6fb; - t.Ograve = 0x00d2; - t.Ogravesmall = 0xf7f2; - t.Oharmenian = 0x0555; - t.Ohm = 0x2126; - t.Ohookabove = 0x1ece; - t.Ohorn = 0x01a0; - t.Ohornacute = 0x1eda; - t.Ohorndotbelow = 0x1ee2; - t.Ohorngrave = 0x1edc; - t.Ohornhookabove = 0x1ede; - t.Ohorntilde = 0x1ee0; - t.Ohungarumlaut = 0x0150; - t.Oi = 0x01a2; - t.Oinvertedbreve = 0x020e; - t.Omacron = 0x014c; - t.Omacronacute = 0x1e52; - t.Omacrongrave = 0x1e50; - t.Omega = 0x2126; - t.Omegacyrillic = 0x0460; - t.Omegagreek = 0x03a9; - t.Omegaroundcyrillic = 0x047a; - t.Omegatitlocyrillic = 0x047c; - t.Omegatonos = 0x038f; - t.Omicron = 0x039f; - t.Omicrontonos = 0x038c; - t.Omonospace = 0xff2f; - t.Oneroman = 0x2160; - t.Oogonek = 0x01ea; - t.Oogonekmacron = 0x01ec; - t.Oopen = 0x0186; - t.Oslash = 0x00d8; - t.Oslashacute = 0x01fe; - t.Oslashsmall = 0xf7f8; - t.Osmall = 0xf76f; - t.Ostrokeacute = 0x01fe; - t.Otcyrillic = 0x047e; - t.Otilde = 0x00d5; - t.Otildeacute = 0x1e4c; - t.Otildedieresis = 0x1e4e; - t.Otildesmall = 0xf7f5; - t.P = 0x0050; - t.Pacute = 0x1e54; - t.Pcircle = 0x24c5; - t.Pdotaccent = 0x1e56; - t.Pecyrillic = 0x041f; - t.Peharmenian = 0x054a; - t.Pemiddlehookcyrillic = 0x04a6; - t.Phi = 0x03a6; - t.Phook = 0x01a4; - t.Pi = 0x03a0; - t.Piwrarmenian = 0x0553; - t.Pmonospace = 0xff30; - t.Psi = 0x03a8; - t.Psicyrillic = 0x0470; - t.Psmall = 0xf770; - t.Q = 0x0051; - t.Qcircle = 0x24c6; - t.Qmonospace = 0xff31; - t.Qsmall = 0xf771; - t.R = 0x0052; - t.Raarmenian = 0x054c; - t.Racute = 0x0154; - t.Rcaron = 0x0158; - t.Rcedilla = 0x0156; - t.Rcircle = 0x24c7; - t.Rcommaaccent = 0x0156; - t.Rdblgrave = 0x0210; - t.Rdotaccent = 0x1e58; - t.Rdotbelow = 0x1e5a; - t.Rdotbelowmacron = 0x1e5c; - t.Reharmenian = 0x0550; - t.Rfraktur = 0x211c; - t.Rho = 0x03a1; - t.Ringsmall = 0xf6fc; - t.Rinvertedbreve = 0x0212; - t.Rlinebelow = 0x1e5e; - t.Rmonospace = 0xff32; - t.Rsmall = 0xf772; - t.Rsmallinverted = 0x0281; - t.Rsmallinvertedsuperior = 0x02b6; - t.S = 0x0053; - t.SF010000 = 0x250c; - t.SF020000 = 0x2514; - t.SF030000 = 0x2510; - t.SF040000 = 0x2518; - t.SF050000 = 0x253c; - t.SF060000 = 0x252c; - t.SF070000 = 0x2534; - t.SF080000 = 0x251c; - t.SF090000 = 0x2524; - t.SF100000 = 0x2500; - t.SF110000 = 0x2502; - t.SF190000 = 0x2561; - t.SF200000 = 0x2562; - t.SF210000 = 0x2556; - t.SF220000 = 0x2555; - t.SF230000 = 0x2563; - t.SF240000 = 0x2551; - t.SF250000 = 0x2557; - t.SF260000 = 0x255d; - t.SF270000 = 0x255c; - t.SF280000 = 0x255b; - t.SF360000 = 0x255e; - t.SF370000 = 0x255f; - t.SF380000 = 0x255a; - t.SF390000 = 0x2554; - t.SF400000 = 0x2569; - t.SF410000 = 0x2566; - t.SF420000 = 0x2560; - t.SF430000 = 0x2550; - t.SF440000 = 0x256c; - t.SF450000 = 0x2567; - t.SF460000 = 0x2568; - t.SF470000 = 0x2564; - t.SF480000 = 0x2565; - t.SF490000 = 0x2559; - t.SF500000 = 0x2558; - t.SF510000 = 0x2552; - t.SF520000 = 0x2553; - t.SF530000 = 0x256b; - t.SF540000 = 0x256a; - t.Sacute = 0x015a; - t.Sacutedotaccent = 0x1e64; - t.Sampigreek = 0x03e0; - t.Scaron = 0x0160; - t.Scarondotaccent = 0x1e66; - t.Scaronsmall = 0xf6fd; - t.Scedilla = 0x015e; - t.Schwa = 0x018f; - t.Schwacyrillic = 0x04d8; - t.Schwadieresiscyrillic = 0x04da; - t.Scircle = 0x24c8; - t.Scircumflex = 0x015c; - t.Scommaaccent = 0x0218; - t.Sdotaccent = 0x1e60; - t.Sdotbelow = 0x1e62; - t.Sdotbelowdotaccent = 0x1e68; - t.Seharmenian = 0x054d; - t.Sevenroman = 0x2166; - t.Shaarmenian = 0x0547; - t.Shacyrillic = 0x0428; - t.Shchacyrillic = 0x0429; - t.Sheicoptic = 0x03e2; - t.Shhacyrillic = 0x04ba; - t.Shimacoptic = 0x03ec; - t.Sigma = 0x03a3; - t.Sixroman = 0x2165; - t.Smonospace = 0xff33; - t.Softsigncyrillic = 0x042c; - t.Ssmall = 0xf773; - t.Stigmagreek = 0x03da; - t.T = 0x0054; - t.Tau = 0x03a4; - t.Tbar = 0x0166; - t.Tcaron = 0x0164; - t.Tcedilla = 0x0162; - t.Tcircle = 0x24c9; - t.Tcircumflexbelow = 0x1e70; - t.Tcommaaccent = 0x0162; - t.Tdotaccent = 0x1e6a; - t.Tdotbelow = 0x1e6c; - t.Tecyrillic = 0x0422; - t.Tedescendercyrillic = 0x04ac; - t.Tenroman = 0x2169; - t.Tetsecyrillic = 0x04b4; - t.Theta = 0x0398; - t.Thook = 0x01ac; - t.Thorn = 0x00de; - t.Thornsmall = 0xf7fe; - t.Threeroman = 0x2162; - t.Tildesmall = 0xf6fe; - t.Tiwnarmenian = 0x054f; - t.Tlinebelow = 0x1e6e; - t.Tmonospace = 0xff34; - t.Toarmenian = 0x0539; - t.Tonefive = 0x01bc; - t.Tonesix = 0x0184; - t.Tonetwo = 0x01a7; - t.Tretroflexhook = 0x01ae; - t.Tsecyrillic = 0x0426; - t.Tshecyrillic = 0x040b; - t.Tsmall = 0xf774; - t.Twelveroman = 0x216b; - t.Tworoman = 0x2161; - t.U = 0x0055; - t.Uacute = 0x00da; - t.Uacutesmall = 0xf7fa; - t.Ubreve = 0x016c; - t.Ucaron = 0x01d3; - t.Ucircle = 0x24ca; - t.Ucircumflex = 0x00db; - t.Ucircumflexbelow = 0x1e76; - t.Ucircumflexsmall = 0xf7fb; - t.Ucyrillic = 0x0423; - t.Udblacute = 0x0170; - t.Udblgrave = 0x0214; - t.Udieresis = 0x00dc; - t.Udieresisacute = 0x01d7; - t.Udieresisbelow = 0x1e72; - t.Udieresiscaron = 0x01d9; - t.Udieresiscyrillic = 0x04f0; - t.Udieresisgrave = 0x01db; - t.Udieresismacron = 0x01d5; - t.Udieresissmall = 0xf7fc; - t.Udotbelow = 0x1ee4; - t.Ugrave = 0x00d9; - t.Ugravesmall = 0xf7f9; - t.Uhookabove = 0x1ee6; - t.Uhorn = 0x01af; - t.Uhornacute = 0x1ee8; - t.Uhorndotbelow = 0x1ef0; - t.Uhorngrave = 0x1eea; - t.Uhornhookabove = 0x1eec; - t.Uhorntilde = 0x1eee; - t.Uhungarumlaut = 0x0170; - t.Uhungarumlautcyrillic = 0x04f2; - t.Uinvertedbreve = 0x0216; - t.Ukcyrillic = 0x0478; - t.Umacron = 0x016a; - t.Umacroncyrillic = 0x04ee; - t.Umacrondieresis = 0x1e7a; - t.Umonospace = 0xff35; - t.Uogonek = 0x0172; - t.Upsilon = 0x03a5; - t.Upsilon1 = 0x03d2; - t.Upsilonacutehooksymbolgreek = 0x03d3; - t.Upsilonafrican = 0x01b1; - t.Upsilondieresis = 0x03ab; - t.Upsilondieresishooksymbolgreek = 0x03d4; - t.Upsilonhooksymbol = 0x03d2; - t.Upsilontonos = 0x038e; - t.Uring = 0x016e; - t.Ushortcyrillic = 0x040e; - t.Usmall = 0xf775; - t.Ustraightcyrillic = 0x04ae; - t.Ustraightstrokecyrillic = 0x04b0; - t.Utilde = 0x0168; - t.Utildeacute = 0x1e78; - t.Utildebelow = 0x1e74; - t.V = 0x0056; - t.Vcircle = 0x24cb; - t.Vdotbelow = 0x1e7e; - t.Vecyrillic = 0x0412; - t.Vewarmenian = 0x054e; - t.Vhook = 0x01b2; - t.Vmonospace = 0xff36; - t.Voarmenian = 0x0548; - t.Vsmall = 0xf776; - t.Vtilde = 0x1e7c; - t.W = 0x0057; - t.Wacute = 0x1e82; - t.Wcircle = 0x24cc; - t.Wcircumflex = 0x0174; - t.Wdieresis = 0x1e84; - t.Wdotaccent = 0x1e86; - t.Wdotbelow = 0x1e88; - t.Wgrave = 0x1e80; - t.Wmonospace = 0xff37; - t.Wsmall = 0xf777; - t.X = 0x0058; - t.Xcircle = 0x24cd; - t.Xdieresis = 0x1e8c; - t.Xdotaccent = 0x1e8a; - t.Xeharmenian = 0x053d; - t.Xi = 0x039e; - t.Xmonospace = 0xff38; - t.Xsmall = 0xf778; - t.Y = 0x0059; - t.Yacute = 0x00dd; - t.Yacutesmall = 0xf7fd; - t.Yatcyrillic = 0x0462; - t.Ycircle = 0x24ce; - t.Ycircumflex = 0x0176; - t.Ydieresis = 0x0178; - t.Ydieresissmall = 0xf7ff; - t.Ydotaccent = 0x1e8e; - t.Ydotbelow = 0x1ef4; - t.Yericyrillic = 0x042b; - t.Yerudieresiscyrillic = 0x04f8; - t.Ygrave = 0x1ef2; - t.Yhook = 0x01b3; - t.Yhookabove = 0x1ef6; - t.Yiarmenian = 0x0545; - t.Yicyrillic = 0x0407; - t.Yiwnarmenian = 0x0552; - t.Ymonospace = 0xff39; - t.Ysmall = 0xf779; - t.Ytilde = 0x1ef8; - t.Yusbigcyrillic = 0x046a; - t.Yusbigiotifiedcyrillic = 0x046c; - t.Yuslittlecyrillic = 0x0466; - t.Yuslittleiotifiedcyrillic = 0x0468; - t.Z = 0x005a; - t.Zaarmenian = 0x0536; - t.Zacute = 0x0179; - t.Zcaron = 0x017d; - t.Zcaronsmall = 0xf6ff; - t.Zcircle = 0x24cf; - t.Zcircumflex = 0x1e90; - t.Zdot = 0x017b; - t.Zdotaccent = 0x017b; - t.Zdotbelow = 0x1e92; - t.Zecyrillic = 0x0417; - t.Zedescendercyrillic = 0x0498; - t.Zedieresiscyrillic = 0x04de; - t.Zeta = 0x0396; - t.Zhearmenian = 0x053a; - t.Zhebrevecyrillic = 0x04c1; - t.Zhecyrillic = 0x0416; - t.Zhedescendercyrillic = 0x0496; - t.Zhedieresiscyrillic = 0x04dc; - t.Zlinebelow = 0x1e94; - t.Zmonospace = 0xff3a; - t.Zsmall = 0xf77a; - t.Zstroke = 0x01b5; - t.a = 0x0061; - t.aabengali = 0x0986; - t.aacute = 0x00e1; - t.aadeva = 0x0906; - t.aagujarati = 0x0a86; - t.aagurmukhi = 0x0a06; - t.aamatragurmukhi = 0x0a3e; - t.aarusquare = 0x3303; - t.aavowelsignbengali = 0x09be; - t.aavowelsigndeva = 0x093e; - t.aavowelsigngujarati = 0x0abe; - t.abbreviationmarkarmenian = 0x055f; - t.abbreviationsigndeva = 0x0970; - t.abengali = 0x0985; - t.abopomofo = 0x311a; - t.abreve = 0x0103; - t.abreveacute = 0x1eaf; - t.abrevecyrillic = 0x04d1; - t.abrevedotbelow = 0x1eb7; - t.abrevegrave = 0x1eb1; - t.abrevehookabove = 0x1eb3; - t.abrevetilde = 0x1eb5; - t.acaron = 0x01ce; - t.acircle = 0x24d0; - t.acircumflex = 0x00e2; - t.acircumflexacute = 0x1ea5; - t.acircumflexdotbelow = 0x1ead; - t.acircumflexgrave = 0x1ea7; - t.acircumflexhookabove = 0x1ea9; - t.acircumflextilde = 0x1eab; - t.acute = 0x00b4; - t.acutebelowcmb = 0x0317; - t.acutecmb = 0x0301; - t.acutecomb = 0x0301; - t.acutedeva = 0x0954; - t.acutelowmod = 0x02cf; - t.acutetonecmb = 0x0341; - t.acyrillic = 0x0430; - t.adblgrave = 0x0201; - t.addakgurmukhi = 0x0a71; - t.adeva = 0x0905; - t.adieresis = 0x00e4; - t.adieresiscyrillic = 0x04d3; - t.adieresismacron = 0x01df; - t.adotbelow = 0x1ea1; - t.adotmacron = 0x01e1; - t.ae = 0x00e6; - t.aeacute = 0x01fd; - t.aekorean = 0x3150; - t.aemacron = 0x01e3; - t.afii00208 = 0x2015; - t.afii08941 = 0x20a4; - t.afii10017 = 0x0410; - t.afii10018 = 0x0411; - t.afii10019 = 0x0412; - t.afii10020 = 0x0413; - t.afii10021 = 0x0414; - t.afii10022 = 0x0415; - t.afii10023 = 0x0401; - t.afii10024 = 0x0416; - t.afii10025 = 0x0417; - t.afii10026 = 0x0418; - t.afii10027 = 0x0419; - t.afii10028 = 0x041a; - t.afii10029 = 0x041b; - t.afii10030 = 0x041c; - t.afii10031 = 0x041d; - t.afii10032 = 0x041e; - t.afii10033 = 0x041f; - t.afii10034 = 0x0420; - t.afii10035 = 0x0421; - t.afii10036 = 0x0422; - t.afii10037 = 0x0423; - t.afii10038 = 0x0424; - t.afii10039 = 0x0425; - t.afii10040 = 0x0426; - t.afii10041 = 0x0427; - t.afii10042 = 0x0428; - t.afii10043 = 0x0429; - t.afii10044 = 0x042a; - t.afii10045 = 0x042b; - t.afii10046 = 0x042c; - t.afii10047 = 0x042d; - t.afii10048 = 0x042e; - t.afii10049 = 0x042f; - t.afii10050 = 0x0490; - t.afii10051 = 0x0402; - t.afii10052 = 0x0403; - t.afii10053 = 0x0404; - t.afii10054 = 0x0405; - t.afii10055 = 0x0406; - t.afii10056 = 0x0407; - t.afii10057 = 0x0408; - t.afii10058 = 0x0409; - t.afii10059 = 0x040a; - t.afii10060 = 0x040b; - t.afii10061 = 0x040c; - t.afii10062 = 0x040e; - t.afii10063 = 0xf6c4; - t.afii10064 = 0xf6c5; - t.afii10065 = 0x0430; - t.afii10066 = 0x0431; - t.afii10067 = 0x0432; - t.afii10068 = 0x0433; - t.afii10069 = 0x0434; - t.afii10070 = 0x0435; - t.afii10071 = 0x0451; - t.afii10072 = 0x0436; - t.afii10073 = 0x0437; - t.afii10074 = 0x0438; - t.afii10075 = 0x0439; - t.afii10076 = 0x043a; - t.afii10077 = 0x043b; - t.afii10078 = 0x043c; - t.afii10079 = 0x043d; - t.afii10080 = 0x043e; - t.afii10081 = 0x043f; - t.afii10082 = 0x0440; - t.afii10083 = 0x0441; - t.afii10084 = 0x0442; - t.afii10085 = 0x0443; - t.afii10086 = 0x0444; - t.afii10087 = 0x0445; - t.afii10088 = 0x0446; - t.afii10089 = 0x0447; - t.afii10090 = 0x0448; - t.afii10091 = 0x0449; - t.afii10092 = 0x044a; - t.afii10093 = 0x044b; - t.afii10094 = 0x044c; - t.afii10095 = 0x044d; - t.afii10096 = 0x044e; - t.afii10097 = 0x044f; - t.afii10098 = 0x0491; - t.afii10099 = 0x0452; - t.afii10100 = 0x0453; - t.afii10101 = 0x0454; - t.afii10102 = 0x0455; - t.afii10103 = 0x0456; - t.afii10104 = 0x0457; - t.afii10105 = 0x0458; - t.afii10106 = 0x0459; - t.afii10107 = 0x045a; - t.afii10108 = 0x045b; - t.afii10109 = 0x045c; - t.afii10110 = 0x045e; - t.afii10145 = 0x040f; - t.afii10146 = 0x0462; - t.afii10147 = 0x0472; - t.afii10148 = 0x0474; - t.afii10192 = 0xf6c6; - t.afii10193 = 0x045f; - t.afii10194 = 0x0463; - t.afii10195 = 0x0473; - t.afii10196 = 0x0475; - t.afii10831 = 0xf6c7; - t.afii10832 = 0xf6c8; - t.afii10846 = 0x04d9; - t.afii299 = 0x200e; - t.afii300 = 0x200f; - t.afii301 = 0x200d; - t.afii57381 = 0x066a; - t.afii57388 = 0x060c; - t.afii57392 = 0x0660; - t.afii57393 = 0x0661; - t.afii57394 = 0x0662; - t.afii57395 = 0x0663; - t.afii57396 = 0x0664; - t.afii57397 = 0x0665; - t.afii57398 = 0x0666; - t.afii57399 = 0x0667; - t.afii57400 = 0x0668; - t.afii57401 = 0x0669; - t.afii57403 = 0x061b; - t.afii57407 = 0x061f; - t.afii57409 = 0x0621; - t.afii57410 = 0x0622; - t.afii57411 = 0x0623; - t.afii57412 = 0x0624; - t.afii57413 = 0x0625; - t.afii57414 = 0x0626; - t.afii57415 = 0x0627; - t.afii57416 = 0x0628; - t.afii57417 = 0x0629; - t.afii57418 = 0x062a; - t.afii57419 = 0x062b; - t.afii57420 = 0x062c; - t.afii57421 = 0x062d; - t.afii57422 = 0x062e; - t.afii57423 = 0x062f; - t.afii57424 = 0x0630; - t.afii57425 = 0x0631; - t.afii57426 = 0x0632; - t.afii57427 = 0x0633; - t.afii57428 = 0x0634; - t.afii57429 = 0x0635; - t.afii57430 = 0x0636; - t.afii57431 = 0x0637; - t.afii57432 = 0x0638; - t.afii57433 = 0x0639; - t.afii57434 = 0x063a; - t.afii57440 = 0x0640; - t.afii57441 = 0x0641; - t.afii57442 = 0x0642; - t.afii57443 = 0x0643; - t.afii57444 = 0x0644; - t.afii57445 = 0x0645; - t.afii57446 = 0x0646; - t.afii57448 = 0x0648; - t.afii57449 = 0x0649; - t.afii57450 = 0x064a; - t.afii57451 = 0x064b; - t.afii57452 = 0x064c; - t.afii57453 = 0x064d; - t.afii57454 = 0x064e; - t.afii57455 = 0x064f; - t.afii57456 = 0x0650; - t.afii57457 = 0x0651; - t.afii57458 = 0x0652; - t.afii57470 = 0x0647; - t.afii57505 = 0x06a4; - t.afii57506 = 0x067e; - t.afii57507 = 0x0686; - t.afii57508 = 0x0698; - t.afii57509 = 0x06af; - t.afii57511 = 0x0679; - t.afii57512 = 0x0688; - t.afii57513 = 0x0691; - t.afii57514 = 0x06ba; - t.afii57519 = 0x06d2; - t.afii57534 = 0x06d5; - t.afii57636 = 0x20aa; - t.afii57645 = 0x05be; - t.afii57658 = 0x05c3; - t.afii57664 = 0x05d0; - t.afii57665 = 0x05d1; - t.afii57666 = 0x05d2; - t.afii57667 = 0x05d3; - t.afii57668 = 0x05d4; - t.afii57669 = 0x05d5; - t.afii57670 = 0x05d6; - t.afii57671 = 0x05d7; - t.afii57672 = 0x05d8; - t.afii57673 = 0x05d9; - t.afii57674 = 0x05da; - t.afii57675 = 0x05db; - t.afii57676 = 0x05dc; - t.afii57677 = 0x05dd; - t.afii57678 = 0x05de; - t.afii57679 = 0x05df; - t.afii57680 = 0x05e0; - t.afii57681 = 0x05e1; - t.afii57682 = 0x05e2; - t.afii57683 = 0x05e3; - t.afii57684 = 0x05e4; - t.afii57685 = 0x05e5; - t.afii57686 = 0x05e6; - t.afii57687 = 0x05e7; - t.afii57688 = 0x05e8; - t.afii57689 = 0x05e9; - t.afii57690 = 0x05ea; - t.afii57694 = 0xfb2a; - t.afii57695 = 0xfb2b; - t.afii57700 = 0xfb4b; - t.afii57705 = 0xfb1f; - t.afii57716 = 0x05f0; - t.afii57717 = 0x05f1; - t.afii57718 = 0x05f2; - t.afii57723 = 0xfb35; - t.afii57793 = 0x05b4; - t.afii57794 = 0x05b5; - t.afii57795 = 0x05b6; - t.afii57796 = 0x05bb; - t.afii57797 = 0x05b8; - t.afii57798 = 0x05b7; - t.afii57799 = 0x05b0; - t.afii57800 = 0x05b2; - t.afii57801 = 0x05b1; - t.afii57802 = 0x05b3; - t.afii57803 = 0x05c2; - t.afii57804 = 0x05c1; - t.afii57806 = 0x05b9; - t.afii57807 = 0x05bc; - t.afii57839 = 0x05bd; - t.afii57841 = 0x05bf; - t.afii57842 = 0x05c0; - t.afii57929 = 0x02bc; - t.afii61248 = 0x2105; - t.afii61289 = 0x2113; - t.afii61352 = 0x2116; - t.afii61573 = 0x202c; - t.afii61574 = 0x202d; - t.afii61575 = 0x202e; - t.afii61664 = 0x200c; - t.afii63167 = 0x066d; - t.afii64937 = 0x02bd; - t.agrave = 0x00e0; - t.agujarati = 0x0a85; - t.agurmukhi = 0x0a05; - t.ahiragana = 0x3042; - t.ahookabove = 0x1ea3; - t.aibengali = 0x0990; - t.aibopomofo = 0x311e; - t.aideva = 0x0910; - t.aiecyrillic = 0x04d5; - t.aigujarati = 0x0a90; - t.aigurmukhi = 0x0a10; - t.aimatragurmukhi = 0x0a48; - t.ainarabic = 0x0639; - t.ainfinalarabic = 0xfeca; - t.aininitialarabic = 0xfecb; - t.ainmedialarabic = 0xfecc; - t.ainvertedbreve = 0x0203; - t.aivowelsignbengali = 0x09c8; - t.aivowelsigndeva = 0x0948; - t.aivowelsigngujarati = 0x0ac8; - t.akatakana = 0x30a2; - t.akatakanahalfwidth = 0xff71; - t.akorean = 0x314f; - t.alef = 0x05d0; - t.alefarabic = 0x0627; - t.alefdageshhebrew = 0xfb30; - t.aleffinalarabic = 0xfe8e; - t.alefhamzaabovearabic = 0x0623; - t.alefhamzaabovefinalarabic = 0xfe84; - t.alefhamzabelowarabic = 0x0625; - t.alefhamzabelowfinalarabic = 0xfe88; - t.alefhebrew = 0x05d0; - t.aleflamedhebrew = 0xfb4f; - t.alefmaddaabovearabic = 0x0622; - t.alefmaddaabovefinalarabic = 0xfe82; - t.alefmaksuraarabic = 0x0649; - t.alefmaksurafinalarabic = 0xfef0; - t.alefmaksurainitialarabic = 0xfef3; - t.alefmaksuramedialarabic = 0xfef4; - t.alefpatahhebrew = 0xfb2e; - t.alefqamatshebrew = 0xfb2f; - t.aleph = 0x2135; - t.allequal = 0x224c; - t.alpha = 0x03b1; - t.alphatonos = 0x03ac; - t.amacron = 0x0101; - t.amonospace = 0xff41; - t.ampersand = 0x0026; - t.ampersandmonospace = 0xff06; - t.ampersandsmall = 0xf726; - t.amsquare = 0x33c2; - t.anbopomofo = 0x3122; - t.angbopomofo = 0x3124; - t.angbracketleft = 0x3008; - t.angbracketright = 0x3009; - t.angkhankhuthai = 0x0e5a; - t.angle = 0x2220; - t.anglebracketleft = 0x3008; - t.anglebracketleftvertical = 0xfe3f; - t.anglebracketright = 0x3009; - t.anglebracketrightvertical = 0xfe40; - t.angleleft = 0x2329; - t.angleright = 0x232a; - t.angstrom = 0x212b; - t.anoteleia = 0x0387; - t.anudattadeva = 0x0952; - t.anusvarabengali = 0x0982; - t.anusvaradeva = 0x0902; - t.anusvaragujarati = 0x0a82; - t.aogonek = 0x0105; - t.apaatosquare = 0x3300; - t.aparen = 0x249c; - t.apostrophearmenian = 0x055a; - t.apostrophemod = 0x02bc; - t.apple = 0xf8ff; - t.approaches = 0x2250; - t.approxequal = 0x2248; - t.approxequalorimage = 0x2252; - t.approximatelyequal = 0x2245; - t.araeaekorean = 0x318e; - t.araeakorean = 0x318d; - t.arc = 0x2312; - t.arighthalfring = 0x1e9a; - t.aring = 0x00e5; - t.aringacute = 0x01fb; - t.aringbelow = 0x1e01; - t.arrowboth = 0x2194; - t.arrowdashdown = 0x21e3; - t.arrowdashleft = 0x21e0; - t.arrowdashright = 0x21e2; - t.arrowdashup = 0x21e1; - t.arrowdblboth = 0x21d4; - t.arrowdbldown = 0x21d3; - t.arrowdblleft = 0x21d0; - t.arrowdblright = 0x21d2; - t.arrowdblup = 0x21d1; - t.arrowdown = 0x2193; - t.arrowdownleft = 0x2199; - t.arrowdownright = 0x2198; - t.arrowdownwhite = 0x21e9; - t.arrowheaddownmod = 0x02c5; - t.arrowheadleftmod = 0x02c2; - t.arrowheadrightmod = 0x02c3; - t.arrowheadupmod = 0x02c4; - t.arrowhorizex = 0xf8e7; - t.arrowleft = 0x2190; - t.arrowleftdbl = 0x21d0; - t.arrowleftdblstroke = 0x21cd; - t.arrowleftoverright = 0x21c6; - t.arrowleftwhite = 0x21e6; - t.arrowright = 0x2192; - t.arrowrightdblstroke = 0x21cf; - t.arrowrightheavy = 0x279e; - t.arrowrightoverleft = 0x21c4; - t.arrowrightwhite = 0x21e8; - t.arrowtableft = 0x21e4; - t.arrowtabright = 0x21e5; - t.arrowup = 0x2191; - t.arrowupdn = 0x2195; - t.arrowupdnbse = 0x21a8; - t.arrowupdownbase = 0x21a8; - t.arrowupleft = 0x2196; - t.arrowupleftofdown = 0x21c5; - t.arrowupright = 0x2197; - t.arrowupwhite = 0x21e7; - t.arrowvertex = 0xf8e6; - t.asciicircum = 0x005e; - t.asciicircummonospace = 0xff3e; - t.asciitilde = 0x007e; - t.asciitildemonospace = 0xff5e; - t.ascript = 0x0251; - t.ascriptturned = 0x0252; - t.asmallhiragana = 0x3041; - t.asmallkatakana = 0x30a1; - t.asmallkatakanahalfwidth = 0xff67; - t.asterisk = 0x002a; - t.asteriskaltonearabic = 0x066d; - t.asteriskarabic = 0x066d; - t.asteriskmath = 0x2217; - t.asteriskmonospace = 0xff0a; - t.asterisksmall = 0xfe61; - t.asterism = 0x2042; - t.asuperior = 0xf6e9; - t.asymptoticallyequal = 0x2243; - t.at = 0x0040; - t.atilde = 0x00e3; - t.atmonospace = 0xff20; - t.atsmall = 0xfe6b; - t.aturned = 0x0250; - t.aubengali = 0x0994; - t.aubopomofo = 0x3120; - t.audeva = 0x0914; - t.augujarati = 0x0a94; - t.augurmukhi = 0x0a14; - t.aulengthmarkbengali = 0x09d7; - t.aumatragurmukhi = 0x0a4c; - t.auvowelsignbengali = 0x09cc; - t.auvowelsigndeva = 0x094c; - t.auvowelsigngujarati = 0x0acc; - t.avagrahadeva = 0x093d; - t.aybarmenian = 0x0561; - t.ayin = 0x05e2; - t.ayinaltonehebrew = 0xfb20; - t.ayinhebrew = 0x05e2; - t.b = 0x0062; - t.babengali = 0x09ac; - t.backslash = 0x005c; - t.backslashmonospace = 0xff3c; - t.badeva = 0x092c; - t.bagujarati = 0x0aac; - t.bagurmukhi = 0x0a2c; - t.bahiragana = 0x3070; - t.bahtthai = 0x0e3f; - t.bakatakana = 0x30d0; - t.bar = 0x007c; - t.barmonospace = 0xff5c; - t.bbopomofo = 0x3105; - t.bcircle = 0x24d1; - t.bdotaccent = 0x1e03; - t.bdotbelow = 0x1e05; - t.beamedsixteenthnotes = 0x266c; - t.because = 0x2235; - t.becyrillic = 0x0431; - t.beharabic = 0x0628; - t.behfinalarabic = 0xfe90; - t.behinitialarabic = 0xfe91; - t.behiragana = 0x3079; - t.behmedialarabic = 0xfe92; - t.behmeeminitialarabic = 0xfc9f; - t.behmeemisolatedarabic = 0xfc08; - t.behnoonfinalarabic = 0xfc6d; - t.bekatakana = 0x30d9; - t.benarmenian = 0x0562; - t.bet = 0x05d1; - t.beta = 0x03b2; - t.betasymbolgreek = 0x03d0; - t.betdagesh = 0xfb31; - t.betdageshhebrew = 0xfb31; - t.bethebrew = 0x05d1; - t.betrafehebrew = 0xfb4c; - t.bhabengali = 0x09ad; - t.bhadeva = 0x092d; - t.bhagujarati = 0x0aad; - t.bhagurmukhi = 0x0a2d; - t.bhook = 0x0253; - t.bihiragana = 0x3073; - t.bikatakana = 0x30d3; - t.bilabialclick = 0x0298; - t.bindigurmukhi = 0x0a02; - t.birusquare = 0x3331; - t.blackcircle = 0x25cf; - t.blackdiamond = 0x25c6; - t.blackdownpointingtriangle = 0x25bc; - t.blackleftpointingpointer = 0x25c4; - t.blackleftpointingtriangle = 0x25c0; - t.blacklenticularbracketleft = 0x3010; - t.blacklenticularbracketleftvertical = 0xfe3b; - t.blacklenticularbracketright = 0x3011; - t.blacklenticularbracketrightvertical = 0xfe3c; - t.blacklowerlefttriangle = 0x25e3; - t.blacklowerrighttriangle = 0x25e2; - t.blackrectangle = 0x25ac; - t.blackrightpointingpointer = 0x25ba; - t.blackrightpointingtriangle = 0x25b6; - t.blacksmallsquare = 0x25aa; - t.blacksmilingface = 0x263b; - t.blacksquare = 0x25a0; - t.blackstar = 0x2605; - t.blackupperlefttriangle = 0x25e4; - t.blackupperrighttriangle = 0x25e5; - t.blackuppointingsmalltriangle = 0x25b4; - t.blackuppointingtriangle = 0x25b2; - t.blank = 0x2423; - t.blinebelow = 0x1e07; - t.block = 0x2588; - t.bmonospace = 0xff42; - t.bobaimaithai = 0x0e1a; - t.bohiragana = 0x307c; - t.bokatakana = 0x30dc; - t.bparen = 0x249d; - t.bqsquare = 0x33c3; - t.braceex = 0xf8f4; - t.braceleft = 0x007b; - t.braceleftbt = 0xf8f3; - t.braceleftmid = 0xf8f2; - t.braceleftmonospace = 0xff5b; - t.braceleftsmall = 0xfe5b; - t.bracelefttp = 0xf8f1; - t.braceleftvertical = 0xfe37; - t.braceright = 0x007d; - t.bracerightbt = 0xf8fe; - t.bracerightmid = 0xf8fd; - t.bracerightmonospace = 0xff5d; - t.bracerightsmall = 0xfe5c; - t.bracerighttp = 0xf8fc; - t.bracerightvertical = 0xfe38; - t.bracketleft = 0x005b; - t.bracketleftbt = 0xf8f0; - t.bracketleftex = 0xf8ef; - t.bracketleftmonospace = 0xff3b; - t.bracketlefttp = 0xf8ee; - t.bracketright = 0x005d; - t.bracketrightbt = 0xf8fb; - t.bracketrightex = 0xf8fa; - t.bracketrightmonospace = 0xff3d; - t.bracketrighttp = 0xf8f9; - t.breve = 0x02d8; - t.brevebelowcmb = 0x032e; - t.brevecmb = 0x0306; - t.breveinvertedbelowcmb = 0x032f; - t.breveinvertedcmb = 0x0311; - t.breveinverteddoublecmb = 0x0361; - t.bridgebelowcmb = 0x032a; - t.bridgeinvertedbelowcmb = 0x033a; - t.brokenbar = 0x00a6; - t.bstroke = 0x0180; - t.bsuperior = 0xf6ea; - t.btopbar = 0x0183; - t.buhiragana = 0x3076; - t.bukatakana = 0x30d6; - t.bullet = 0x2022; - t.bulletinverse = 0x25d8; - t.bulletoperator = 0x2219; - t.bullseye = 0x25ce; - t.c = 0x0063; - t.caarmenian = 0x056e; - t.cabengali = 0x099a; - t.cacute = 0x0107; - t.cadeva = 0x091a; - t.cagujarati = 0x0a9a; - t.cagurmukhi = 0x0a1a; - t.calsquare = 0x3388; - t.candrabindubengali = 0x0981; - t.candrabinducmb = 0x0310; - t.candrabindudeva = 0x0901; - t.candrabindugujarati = 0x0a81; - t.capslock = 0x21ea; - t.careof = 0x2105; - t.caron = 0x02c7; - t.caronbelowcmb = 0x032c; - t.caroncmb = 0x030c; - t.carriagereturn = 0x21b5; - t.cbopomofo = 0x3118; - t.ccaron = 0x010d; - t.ccedilla = 0x00e7; - t.ccedillaacute = 0x1e09; - t.ccircle = 0x24d2; - t.ccircumflex = 0x0109; - t.ccurl = 0x0255; - t.cdot = 0x010b; - t.cdotaccent = 0x010b; - t.cdsquare = 0x33c5; - t.cedilla = 0x00b8; - t.cedillacmb = 0x0327; - t.cent = 0x00a2; - t.centigrade = 0x2103; - t.centinferior = 0xf6df; - t.centmonospace = 0xffe0; - t.centoldstyle = 0xf7a2; - t.centsuperior = 0xf6e0; - t.chaarmenian = 0x0579; - t.chabengali = 0x099b; - t.chadeva = 0x091b; - t.chagujarati = 0x0a9b; - t.chagurmukhi = 0x0a1b; - t.chbopomofo = 0x3114; - t.cheabkhasiancyrillic = 0x04bd; - t.checkmark = 0x2713; - t.checyrillic = 0x0447; - t.chedescenderabkhasiancyrillic = 0x04bf; - t.chedescendercyrillic = 0x04b7; - t.chedieresiscyrillic = 0x04f5; - t.cheharmenian = 0x0573; - t.chekhakassiancyrillic = 0x04cc; - t.cheverticalstrokecyrillic = 0x04b9; - t.chi = 0x03c7; - t.chieuchacirclekorean = 0x3277; - t.chieuchaparenkorean = 0x3217; - t.chieuchcirclekorean = 0x3269; - t.chieuchkorean = 0x314a; - t.chieuchparenkorean = 0x3209; - t.chochangthai = 0x0e0a; - t.chochanthai = 0x0e08; - t.chochingthai = 0x0e09; - t.chochoethai = 0x0e0c; - t.chook = 0x0188; - t.cieucacirclekorean = 0x3276; - t.cieucaparenkorean = 0x3216; - t.cieuccirclekorean = 0x3268; - t.cieuckorean = 0x3148; - t.cieucparenkorean = 0x3208; - t.cieucuparenkorean = 0x321c; - t.circle = 0x25cb; - t.circlecopyrt = 0x00a9; - t.circlemultiply = 0x2297; - t.circleot = 0x2299; - t.circleplus = 0x2295; - t.circlepostalmark = 0x3036; - t.circlewithlefthalfblack = 0x25d0; - t.circlewithrighthalfblack = 0x25d1; - t.circumflex = 0x02c6; - t.circumflexbelowcmb = 0x032d; - t.circumflexcmb = 0x0302; - t.clear = 0x2327; - t.clickalveolar = 0x01c2; - t.clickdental = 0x01c0; - t.clicklateral = 0x01c1; - t.clickretroflex = 0x01c3; - t.club = 0x2663; - t.clubsuitblack = 0x2663; - t.clubsuitwhite = 0x2667; - t.cmcubedsquare = 0x33a4; - t.cmonospace = 0xff43; - t.cmsquaredsquare = 0x33a0; - t.coarmenian = 0x0581; - t.colon = 0x003a; - t.colonmonetary = 0x20a1; - t.colonmonospace = 0xff1a; - t.colonsign = 0x20a1; - t.colonsmall = 0xfe55; - t.colontriangularhalfmod = 0x02d1; - t.colontriangularmod = 0x02d0; - t.comma = 0x002c; - t.commaabovecmb = 0x0313; - t.commaaboverightcmb = 0x0315; - t.commaaccent = 0xf6c3; - t.commaarabic = 0x060c; - t.commaarmenian = 0x055d; - t.commainferior = 0xf6e1; - t.commamonospace = 0xff0c; - t.commareversedabovecmb = 0x0314; - t.commareversedmod = 0x02bd; - t.commasmall = 0xfe50; - t.commasuperior = 0xf6e2; - t.commaturnedabovecmb = 0x0312; - t.commaturnedmod = 0x02bb; - t.compass = 0x263c; - t.congruent = 0x2245; - t.contourintegral = 0x222e; - t.control = 0x2303; - t.controlACK = 0x0006; - t.controlBEL = 0x0007; - t.controlBS = 0x0008; - t.controlCAN = 0x0018; - t.controlCR = 0x000d; - t.controlDC1 = 0x0011; - t.controlDC2 = 0x0012; - t.controlDC3 = 0x0013; - t.controlDC4 = 0x0014; - t.controlDEL = 0x007f; - t.controlDLE = 0x0010; - t.controlEM = 0x0019; - t.controlENQ = 0x0005; - t.controlEOT = 0x0004; - t.controlESC = 0x001b; - t.controlETB = 0x0017; - t.controlETX = 0x0003; - t.controlFF = 0x000c; - t.controlFS = 0x001c; - t.controlGS = 0x001d; - t.controlHT = 0x0009; - t.controlLF = 0x000a; - t.controlNAK = 0x0015; - t.controlNULL = 0x0000; - t.controlRS = 0x001e; - t.controlSI = 0x000f; - t.controlSO = 0x000e; - t.controlSOT = 0x0002; - t.controlSTX = 0x0001; - t.controlSUB = 0x001a; - t.controlSYN = 0x0016; - t.controlUS = 0x001f; - t.controlVT = 0x000b; - t.copyright = 0x00a9; - t.copyrightsans = 0xf8e9; - t.copyrightserif = 0xf6d9; - t.cornerbracketleft = 0x300c; - t.cornerbracketlefthalfwidth = 0xff62; - t.cornerbracketleftvertical = 0xfe41; - t.cornerbracketright = 0x300d; - t.cornerbracketrighthalfwidth = 0xff63; - t.cornerbracketrightvertical = 0xfe42; - t.corporationsquare = 0x337f; - t.cosquare = 0x33c7; - t.coverkgsquare = 0x33c6; - t.cparen = 0x249e; - t.cruzeiro = 0x20a2; - t.cstretched = 0x0297; - t.curlyand = 0x22cf; - t.curlyor = 0x22ce; - t.currency = 0x00a4; - t.cyrBreve = 0xf6d1; - t.cyrFlex = 0xf6d2; - t.cyrbreve = 0xf6d4; - t.cyrflex = 0xf6d5; - t.d = 0x0064; - t.daarmenian = 0x0564; - t.dabengali = 0x09a6; - t.dadarabic = 0x0636; - t.dadeva = 0x0926; - t.dadfinalarabic = 0xfebe; - t.dadinitialarabic = 0xfebf; - t.dadmedialarabic = 0xfec0; - t.dagesh = 0x05bc; - t.dageshhebrew = 0x05bc; - t.dagger = 0x2020; - t.daggerdbl = 0x2021; - t.dagujarati = 0x0aa6; - t.dagurmukhi = 0x0a26; - t.dahiragana = 0x3060; - t.dakatakana = 0x30c0; - t.dalarabic = 0x062f; - t.dalet = 0x05d3; - t.daletdagesh = 0xfb33; - t.daletdageshhebrew = 0xfb33; - t.dalethebrew = 0x05d3; - t.dalfinalarabic = 0xfeaa; - t.dammaarabic = 0x064f; - t.dammalowarabic = 0x064f; - t.dammatanaltonearabic = 0x064c; - t.dammatanarabic = 0x064c; - t.danda = 0x0964; - t.dargahebrew = 0x05a7; - t.dargalefthebrew = 0x05a7; - t.dasiapneumatacyrilliccmb = 0x0485; - t.dblGrave = 0xf6d3; - t.dblanglebracketleft = 0x300a; - t.dblanglebracketleftvertical = 0xfe3d; - t.dblanglebracketright = 0x300b; - t.dblanglebracketrightvertical = 0xfe3e; - t.dblarchinvertedbelowcmb = 0x032b; - t.dblarrowleft = 0x21d4; - t.dblarrowright = 0x21d2; - t.dbldanda = 0x0965; - t.dblgrave = 0xf6d6; - t.dblgravecmb = 0x030f; - t.dblintegral = 0x222c; - t.dbllowline = 0x2017; - t.dbllowlinecmb = 0x0333; - t.dbloverlinecmb = 0x033f; - t.dblprimemod = 0x02ba; - t.dblverticalbar = 0x2016; - t.dblverticallineabovecmb = 0x030e; - t.dbopomofo = 0x3109; - t.dbsquare = 0x33c8; - t.dcaron = 0x010f; - t.dcedilla = 0x1e11; - t.dcircle = 0x24d3; - t.dcircumflexbelow = 0x1e13; - t.dcroat = 0x0111; - t.ddabengali = 0x09a1; - t.ddadeva = 0x0921; - t.ddagujarati = 0x0aa1; - t.ddagurmukhi = 0x0a21; - t.ddalarabic = 0x0688; - t.ddalfinalarabic = 0xfb89; - t.dddhadeva = 0x095c; - t.ddhabengali = 0x09a2; - t.ddhadeva = 0x0922; - t.ddhagujarati = 0x0aa2; - t.ddhagurmukhi = 0x0a22; - t.ddotaccent = 0x1e0b; - t.ddotbelow = 0x1e0d; - t.decimalseparatorarabic = 0x066b; - t.decimalseparatorpersian = 0x066b; - t.decyrillic = 0x0434; - t.degree = 0x00b0; - t.dehihebrew = 0x05ad; - t.dehiragana = 0x3067; - t.deicoptic = 0x03ef; - t.dekatakana = 0x30c7; - t.deleteleft = 0x232b; - t.deleteright = 0x2326; - t.delta = 0x03b4; - t.deltaturned = 0x018d; - t.denominatorminusonenumeratorbengali = 0x09f8; - t.dezh = 0x02a4; - t.dhabengali = 0x09a7; - t.dhadeva = 0x0927; - t.dhagujarati = 0x0aa7; - t.dhagurmukhi = 0x0a27; - t.dhook = 0x0257; - t.dialytikatonos = 0x0385; - t.dialytikatonoscmb = 0x0344; - t.diamond = 0x2666; - t.diamondsuitwhite = 0x2662; - t.dieresis = 0x00a8; - t.dieresisacute = 0xf6d7; - t.dieresisbelowcmb = 0x0324; - t.dieresiscmb = 0x0308; - t.dieresisgrave = 0xf6d8; - t.dieresistonos = 0x0385; - t.dihiragana = 0x3062; - t.dikatakana = 0x30c2; - t.dittomark = 0x3003; - t.divide = 0x00f7; - t.divides = 0x2223; - t.divisionslash = 0x2215; - t.djecyrillic = 0x0452; - t.dkshade = 0x2593; - t.dlinebelow = 0x1e0f; - t.dlsquare = 0x3397; - t.dmacron = 0x0111; - t.dmonospace = 0xff44; - t.dnblock = 0x2584; - t.dochadathai = 0x0e0e; - t.dodekthai = 0x0e14; - t.dohiragana = 0x3069; - t.dokatakana = 0x30c9; - t.dollar = 0x0024; - t.dollarinferior = 0xf6e3; - t.dollarmonospace = 0xff04; - t.dollaroldstyle = 0xf724; - t.dollarsmall = 0xfe69; - t.dollarsuperior = 0xf6e4; - t.dong = 0x20ab; - t.dorusquare = 0x3326; - t.dotaccent = 0x02d9; - t.dotaccentcmb = 0x0307; - t.dotbelowcmb = 0x0323; - t.dotbelowcomb = 0x0323; - t.dotkatakana = 0x30fb; - t.dotlessi = 0x0131; - t.dotlessj = 0xf6be; - t.dotlessjstrokehook = 0x0284; - t.dotmath = 0x22c5; - t.dottedcircle = 0x25cc; - t.doubleyodpatah = 0xfb1f; - t.doubleyodpatahhebrew = 0xfb1f; - t.downtackbelowcmb = 0x031e; - t.downtackmod = 0x02d5; - t.dparen = 0x249f; - t.dsuperior = 0xf6eb; - t.dtail = 0x0256; - t.dtopbar = 0x018c; - t.duhiragana = 0x3065; - t.dukatakana = 0x30c5; - t.dz = 0x01f3; - t.dzaltone = 0x02a3; - t.dzcaron = 0x01c6; - t.dzcurl = 0x02a5; - t.dzeabkhasiancyrillic = 0x04e1; - t.dzecyrillic = 0x0455; - t.dzhecyrillic = 0x045f; - t.e = 0x0065; - t.eacute = 0x00e9; - t.earth = 0x2641; - t.ebengali = 0x098f; - t.ebopomofo = 0x311c; - t.ebreve = 0x0115; - t.ecandradeva = 0x090d; - t.ecandragujarati = 0x0a8d; - t.ecandravowelsigndeva = 0x0945; - t.ecandravowelsigngujarati = 0x0ac5; - t.ecaron = 0x011b; - t.ecedillabreve = 0x1e1d; - t.echarmenian = 0x0565; - t.echyiwnarmenian = 0x0587; - t.ecircle = 0x24d4; - t.ecircumflex = 0x00ea; - t.ecircumflexacute = 0x1ebf; - t.ecircumflexbelow = 0x1e19; - t.ecircumflexdotbelow = 0x1ec7; - t.ecircumflexgrave = 0x1ec1; - t.ecircumflexhookabove = 0x1ec3; - t.ecircumflextilde = 0x1ec5; - t.ecyrillic = 0x0454; - t.edblgrave = 0x0205; - t.edeva = 0x090f; - t.edieresis = 0x00eb; - t.edot = 0x0117; - t.edotaccent = 0x0117; - t.edotbelow = 0x1eb9; - t.eegurmukhi = 0x0a0f; - t.eematragurmukhi = 0x0a47; - t.efcyrillic = 0x0444; - t.egrave = 0x00e8; - t.egujarati = 0x0a8f; - t.eharmenian = 0x0567; - t.ehbopomofo = 0x311d; - t.ehiragana = 0x3048; - t.ehookabove = 0x1ebb; - t.eibopomofo = 0x311f; - t.eight = 0x0038; - t.eightarabic = 0x0668; - t.eightbengali = 0x09ee; - t.eightcircle = 0x2467; - t.eightcircleinversesansserif = 0x2791; - t.eightdeva = 0x096e; - t.eighteencircle = 0x2471; - t.eighteenparen = 0x2485; - t.eighteenperiod = 0x2499; - t.eightgujarati = 0x0aee; - t.eightgurmukhi = 0x0a6e; - t.eighthackarabic = 0x0668; - t.eighthangzhou = 0x3028; - t.eighthnotebeamed = 0x266b; - t.eightideographicparen = 0x3227; - t.eightinferior = 0x2088; - t.eightmonospace = 0xff18; - t.eightoldstyle = 0xf738; - t.eightparen = 0x247b; - t.eightperiod = 0x248f; - t.eightpersian = 0x06f8; - t.eightroman = 0x2177; - t.eightsuperior = 0x2078; - t.eightthai = 0x0e58; - t.einvertedbreve = 0x0207; - t.eiotifiedcyrillic = 0x0465; - t.ekatakana = 0x30a8; - t.ekatakanahalfwidth = 0xff74; - t.ekonkargurmukhi = 0x0a74; - t.ekorean = 0x3154; - t.elcyrillic = 0x043b; - t.element = 0x2208; - t.elevencircle = 0x246a; - t.elevenparen = 0x247e; - t.elevenperiod = 0x2492; - t.elevenroman = 0x217a; - t.ellipsis = 0x2026; - t.ellipsisvertical = 0x22ee; - t.emacron = 0x0113; - t.emacronacute = 0x1e17; - t.emacrongrave = 0x1e15; - t.emcyrillic = 0x043c; - t.emdash = 0x2014; - t.emdashvertical = 0xfe31; - t.emonospace = 0xff45; - t.emphasismarkarmenian = 0x055b; - t.emptyset = 0x2205; - t.enbopomofo = 0x3123; - t.encyrillic = 0x043d; - t.endash = 0x2013; - t.endashvertical = 0xfe32; - t.endescendercyrillic = 0x04a3; - t.eng = 0x014b; - t.engbopomofo = 0x3125; - t.enghecyrillic = 0x04a5; - t.enhookcyrillic = 0x04c8; - t.enspace = 0x2002; - t.eogonek = 0x0119; - t.eokorean = 0x3153; - t.eopen = 0x025b; - t.eopenclosed = 0x029a; - t.eopenreversed = 0x025c; - t.eopenreversedclosed = 0x025e; - t.eopenreversedhook = 0x025d; - t.eparen = 0x24a0; - t.epsilon = 0x03b5; - t.epsilontonos = 0x03ad; - t.equal = 0x003d; - t.equalmonospace = 0xff1d; - t.equalsmall = 0xfe66; - t.equalsuperior = 0x207c; - t.equivalence = 0x2261; - t.erbopomofo = 0x3126; - t.ercyrillic = 0x0440; - t.ereversed = 0x0258; - t.ereversedcyrillic = 0x044d; - t.escyrillic = 0x0441; - t.esdescendercyrillic = 0x04ab; - t.esh = 0x0283; - t.eshcurl = 0x0286; - t.eshortdeva = 0x090e; - t.eshortvowelsigndeva = 0x0946; - t.eshreversedloop = 0x01aa; - t.eshsquatreversed = 0x0285; - t.esmallhiragana = 0x3047; - t.esmallkatakana = 0x30a7; - t.esmallkatakanahalfwidth = 0xff6a; - t.estimated = 0x212e; - t.esuperior = 0xf6ec; - t.eta = 0x03b7; - t.etarmenian = 0x0568; - t.etatonos = 0x03ae; - t.eth = 0x00f0; - t.etilde = 0x1ebd; - t.etildebelow = 0x1e1b; - t.etnahtafoukhhebrew = 0x0591; - t.etnahtafoukhlefthebrew = 0x0591; - t.etnahtahebrew = 0x0591; - t.etnahtalefthebrew = 0x0591; - t.eturned = 0x01dd; - t.eukorean = 0x3161; - t.euro = 0x20ac; - t.evowelsignbengali = 0x09c7; - t.evowelsigndeva = 0x0947; - t.evowelsigngujarati = 0x0ac7; - t.exclam = 0x0021; - t.exclamarmenian = 0x055c; - t.exclamdbl = 0x203c; - t.exclamdown = 0x00a1; - t.exclamdownsmall = 0xf7a1; - t.exclammonospace = 0xff01; - t.exclamsmall = 0xf721; - t.existential = 0x2203; - t.ezh = 0x0292; - t.ezhcaron = 0x01ef; - t.ezhcurl = 0x0293; - t.ezhreversed = 0x01b9; - t.ezhtail = 0x01ba; - t.f = 0x0066; - t.fadeva = 0x095e; - t.fagurmukhi = 0x0a5e; - t.fahrenheit = 0x2109; - t.fathaarabic = 0x064e; - t.fathalowarabic = 0x064e; - t.fathatanarabic = 0x064b; - t.fbopomofo = 0x3108; - t.fcircle = 0x24d5; - t.fdotaccent = 0x1e1f; - t.feharabic = 0x0641; - t.feharmenian = 0x0586; - t.fehfinalarabic = 0xfed2; - t.fehinitialarabic = 0xfed3; - t.fehmedialarabic = 0xfed4; - t.feicoptic = 0x03e5; - t.female = 0x2640; - t.ff = 0xfb00; - t.f_f = 0xfb00; - t.ffi = 0xfb03; - t.f_f_i = 0xfb03; - t.ffl = 0xfb04; - t.f_f_l = 0xfb04; - t.fi = 0xfb01; - t.f_i = 0xfb01; - t.fifteencircle = 0x246e; - t.fifteenparen = 0x2482; - t.fifteenperiod = 0x2496; - t.figuredash = 0x2012; - t.filledbox = 0x25a0; - t.filledrect = 0x25ac; - t.finalkaf = 0x05da; - t.finalkafdagesh = 0xfb3a; - t.finalkafdageshhebrew = 0xfb3a; - t.finalkafhebrew = 0x05da; - t.finalmem = 0x05dd; - t.finalmemhebrew = 0x05dd; - t.finalnun = 0x05df; - t.finalnunhebrew = 0x05df; - t.finalpe = 0x05e3; - t.finalpehebrew = 0x05e3; - t.finaltsadi = 0x05e5; - t.finaltsadihebrew = 0x05e5; - t.firsttonechinese = 0x02c9; - t.fisheye = 0x25c9; - t.fitacyrillic = 0x0473; - t.five = 0x0035; - t.fivearabic = 0x0665; - t.fivebengali = 0x09eb; - t.fivecircle = 0x2464; - t.fivecircleinversesansserif = 0x278e; - t.fivedeva = 0x096b; - t.fiveeighths = 0x215d; - t.fivegujarati = 0x0aeb; - t.fivegurmukhi = 0x0a6b; - t.fivehackarabic = 0x0665; - t.fivehangzhou = 0x3025; - t.fiveideographicparen = 0x3224; - t.fiveinferior = 0x2085; - t.fivemonospace = 0xff15; - t.fiveoldstyle = 0xf735; - t.fiveparen = 0x2478; - t.fiveperiod = 0x248c; - t.fivepersian = 0x06f5; - t.fiveroman = 0x2174; - t.fivesuperior = 0x2075; - t.fivethai = 0x0e55; - t.fl = 0xfb02; - t.f_l = 0xfb02; - t.florin = 0x0192; - t.fmonospace = 0xff46; - t.fmsquare = 0x3399; - t.fofanthai = 0x0e1f; - t.fofathai = 0x0e1d; - t.fongmanthai = 0x0e4f; - t.forall = 0x2200; - t.four = 0x0034; - t.fourarabic = 0x0664; - t.fourbengali = 0x09ea; - t.fourcircle = 0x2463; - t.fourcircleinversesansserif = 0x278d; - t.fourdeva = 0x096a; - t.fourgujarati = 0x0aea; - t.fourgurmukhi = 0x0a6a; - t.fourhackarabic = 0x0664; - t.fourhangzhou = 0x3024; - t.fourideographicparen = 0x3223; - t.fourinferior = 0x2084; - t.fourmonospace = 0xff14; - t.fournumeratorbengali = 0x09f7; - t.fouroldstyle = 0xf734; - t.fourparen = 0x2477; - t.fourperiod = 0x248b; - t.fourpersian = 0x06f4; - t.fourroman = 0x2173; - t.foursuperior = 0x2074; - t.fourteencircle = 0x246d; - t.fourteenparen = 0x2481; - t.fourteenperiod = 0x2495; - t.fourthai = 0x0e54; - t.fourthtonechinese = 0x02cb; - t.fparen = 0x24a1; - t.fraction = 0x2044; - t.franc = 0x20a3; - t.g = 0x0067; - t.gabengali = 0x0997; - t.gacute = 0x01f5; - t.gadeva = 0x0917; - t.gafarabic = 0x06af; - t.gaffinalarabic = 0xfb93; - t.gafinitialarabic = 0xfb94; - t.gafmedialarabic = 0xfb95; - t.gagujarati = 0x0a97; - t.gagurmukhi = 0x0a17; - t.gahiragana = 0x304c; - t.gakatakana = 0x30ac; - t.gamma = 0x03b3; - t.gammalatinsmall = 0x0263; - t.gammasuperior = 0x02e0; - t.gangiacoptic = 0x03eb; - t.gbopomofo = 0x310d; - t.gbreve = 0x011f; - t.gcaron = 0x01e7; - t.gcedilla = 0x0123; - t.gcircle = 0x24d6; - t.gcircumflex = 0x011d; - t.gcommaaccent = 0x0123; - t.gdot = 0x0121; - t.gdotaccent = 0x0121; - t.gecyrillic = 0x0433; - t.gehiragana = 0x3052; - t.gekatakana = 0x30b2; - t.geometricallyequal = 0x2251; - t.gereshaccenthebrew = 0x059c; - t.gereshhebrew = 0x05f3; - t.gereshmuqdamhebrew = 0x059d; - t.germandbls = 0x00df; - t.gershayimaccenthebrew = 0x059e; - t.gershayimhebrew = 0x05f4; - t.getamark = 0x3013; - t.ghabengali = 0x0998; - t.ghadarmenian = 0x0572; - t.ghadeva = 0x0918; - t.ghagujarati = 0x0a98; - t.ghagurmukhi = 0x0a18; - t.ghainarabic = 0x063a; - t.ghainfinalarabic = 0xfece; - t.ghaininitialarabic = 0xfecf; - t.ghainmedialarabic = 0xfed0; - t.ghemiddlehookcyrillic = 0x0495; - t.ghestrokecyrillic = 0x0493; - t.gheupturncyrillic = 0x0491; - t.ghhadeva = 0x095a; - t.ghhagurmukhi = 0x0a5a; - t.ghook = 0x0260; - t.ghzsquare = 0x3393; - t.gihiragana = 0x304e; - t.gikatakana = 0x30ae; - t.gimarmenian = 0x0563; - t.gimel = 0x05d2; - t.gimeldagesh = 0xfb32; - t.gimeldageshhebrew = 0xfb32; - t.gimelhebrew = 0x05d2; - t.gjecyrillic = 0x0453; - t.glottalinvertedstroke = 0x01be; - t.glottalstop = 0x0294; - t.glottalstopinverted = 0x0296; - t.glottalstopmod = 0x02c0; - t.glottalstopreversed = 0x0295; - t.glottalstopreversedmod = 0x02c1; - t.glottalstopreversedsuperior = 0x02e4; - t.glottalstopstroke = 0x02a1; - t.glottalstopstrokereversed = 0x02a2; - t.gmacron = 0x1e21; - t.gmonospace = 0xff47; - t.gohiragana = 0x3054; - t.gokatakana = 0x30b4; - t.gparen = 0x24a2; - t.gpasquare = 0x33ac; - t.gradient = 0x2207; - t.grave = 0x0060; - t.gravebelowcmb = 0x0316; - t.gravecmb = 0x0300; - t.gravecomb = 0x0300; - t.gravedeva = 0x0953; - t.gravelowmod = 0x02ce; - t.gravemonospace = 0xff40; - t.gravetonecmb = 0x0340; - t.greater = 0x003e; - t.greaterequal = 0x2265; - t.greaterequalorless = 0x22db; - t.greatermonospace = 0xff1e; - t.greaterorequivalent = 0x2273; - t.greaterorless = 0x2277; - t.greateroverequal = 0x2267; - t.greatersmall = 0xfe65; - t.gscript = 0x0261; - t.gstroke = 0x01e5; - t.guhiragana = 0x3050; - t.guillemotleft = 0x00ab; - t.guillemotright = 0x00bb; - t.guilsinglleft = 0x2039; - t.guilsinglright = 0x203a; - t.gukatakana = 0x30b0; - t.guramusquare = 0x3318; - t.gysquare = 0x33c9; - t.h = 0x0068; - t.haabkhasiancyrillic = 0x04a9; - t.haaltonearabic = 0x06c1; - t.habengali = 0x09b9; - t.hadescendercyrillic = 0x04b3; - t.hadeva = 0x0939; - t.hagujarati = 0x0ab9; - t.hagurmukhi = 0x0a39; - t.haharabic = 0x062d; - t.hahfinalarabic = 0xfea2; - t.hahinitialarabic = 0xfea3; - t.hahiragana = 0x306f; - t.hahmedialarabic = 0xfea4; - t.haitusquare = 0x332a; - t.hakatakana = 0x30cf; - t.hakatakanahalfwidth = 0xff8a; - t.halantgurmukhi = 0x0a4d; - t.hamzaarabic = 0x0621; - t.hamzalowarabic = 0x0621; - t.hangulfiller = 0x3164; - t.hardsigncyrillic = 0x044a; - t.harpoonleftbarbup = 0x21bc; - t.harpoonrightbarbup = 0x21c0; - t.hasquare = 0x33ca; - t.hatafpatah = 0x05b2; - t.hatafpatah16 = 0x05b2; - t.hatafpatah23 = 0x05b2; - t.hatafpatah2f = 0x05b2; - t.hatafpatahhebrew = 0x05b2; - t.hatafpatahnarrowhebrew = 0x05b2; - t.hatafpatahquarterhebrew = 0x05b2; - t.hatafpatahwidehebrew = 0x05b2; - t.hatafqamats = 0x05b3; - t.hatafqamats1b = 0x05b3; - t.hatafqamats28 = 0x05b3; - t.hatafqamats34 = 0x05b3; - t.hatafqamatshebrew = 0x05b3; - t.hatafqamatsnarrowhebrew = 0x05b3; - t.hatafqamatsquarterhebrew = 0x05b3; - t.hatafqamatswidehebrew = 0x05b3; - t.hatafsegol = 0x05b1; - t.hatafsegol17 = 0x05b1; - t.hatafsegol24 = 0x05b1; - t.hatafsegol30 = 0x05b1; - t.hatafsegolhebrew = 0x05b1; - t.hatafsegolnarrowhebrew = 0x05b1; - t.hatafsegolquarterhebrew = 0x05b1; - t.hatafsegolwidehebrew = 0x05b1; - t.hbar = 0x0127; - t.hbopomofo = 0x310f; - t.hbrevebelow = 0x1e2b; - t.hcedilla = 0x1e29; - t.hcircle = 0x24d7; - t.hcircumflex = 0x0125; - t.hdieresis = 0x1e27; - t.hdotaccent = 0x1e23; - t.hdotbelow = 0x1e25; - t.he = 0x05d4; - t.heart = 0x2665; - t.heartsuitblack = 0x2665; - t.heartsuitwhite = 0x2661; - t.hedagesh = 0xfb34; - t.hedageshhebrew = 0xfb34; - t.hehaltonearabic = 0x06c1; - t.heharabic = 0x0647; - t.hehebrew = 0x05d4; - t.hehfinalaltonearabic = 0xfba7; - t.hehfinalalttwoarabic = 0xfeea; - t.hehfinalarabic = 0xfeea; - t.hehhamzaabovefinalarabic = 0xfba5; - t.hehhamzaaboveisolatedarabic = 0xfba4; - t.hehinitialaltonearabic = 0xfba8; - t.hehinitialarabic = 0xfeeb; - t.hehiragana = 0x3078; - t.hehmedialaltonearabic = 0xfba9; - t.hehmedialarabic = 0xfeec; - t.heiseierasquare = 0x337b; - t.hekatakana = 0x30d8; - t.hekatakanahalfwidth = 0xff8d; - t.hekutaarusquare = 0x3336; - t.henghook = 0x0267; - t.herutusquare = 0x3339; - t.het = 0x05d7; - t.hethebrew = 0x05d7; - t.hhook = 0x0266; - t.hhooksuperior = 0x02b1; - t.hieuhacirclekorean = 0x327b; - t.hieuhaparenkorean = 0x321b; - t.hieuhcirclekorean = 0x326d; - t.hieuhkorean = 0x314e; - t.hieuhparenkorean = 0x320d; - t.hihiragana = 0x3072; - t.hikatakana = 0x30d2; - t.hikatakanahalfwidth = 0xff8b; - t.hiriq = 0x05b4; - t.hiriq14 = 0x05b4; - t.hiriq21 = 0x05b4; - t.hiriq2d = 0x05b4; - t.hiriqhebrew = 0x05b4; - t.hiriqnarrowhebrew = 0x05b4; - t.hiriqquarterhebrew = 0x05b4; - t.hiriqwidehebrew = 0x05b4; - t.hlinebelow = 0x1e96; - t.hmonospace = 0xff48; - t.hoarmenian = 0x0570; - t.hohipthai = 0x0e2b; - t.hohiragana = 0x307b; - t.hokatakana = 0x30db; - t.hokatakanahalfwidth = 0xff8e; - t.holam = 0x05b9; - t.holam19 = 0x05b9; - t.holam26 = 0x05b9; - t.holam32 = 0x05b9; - t.holamhebrew = 0x05b9; - t.holamnarrowhebrew = 0x05b9; - t.holamquarterhebrew = 0x05b9; - t.holamwidehebrew = 0x05b9; - t.honokhukthai = 0x0e2e; - t.hookabovecomb = 0x0309; - t.hookcmb = 0x0309; - t.hookpalatalizedbelowcmb = 0x0321; - t.hookretroflexbelowcmb = 0x0322; - t.hoonsquare = 0x3342; - t.horicoptic = 0x03e9; - t.horizontalbar = 0x2015; - t.horncmb = 0x031b; - t.hotsprings = 0x2668; - t.house = 0x2302; - t.hparen = 0x24a3; - t.hsuperior = 0x02b0; - t.hturned = 0x0265; - t.huhiragana = 0x3075; - t.huiitosquare = 0x3333; - t.hukatakana = 0x30d5; - t.hukatakanahalfwidth = 0xff8c; - t.hungarumlaut = 0x02dd; - t.hungarumlautcmb = 0x030b; - t.hv = 0x0195; - t.hyphen = 0x002d; - t.hypheninferior = 0xf6e5; - t.hyphenmonospace = 0xff0d; - t.hyphensmall = 0xfe63; - t.hyphensuperior = 0xf6e6; - t.hyphentwo = 0x2010; - t.i = 0x0069; - t.iacute = 0x00ed; - t.iacyrillic = 0x044f; - t.ibengali = 0x0987; - t.ibopomofo = 0x3127; - t.ibreve = 0x012d; - t.icaron = 0x01d0; - t.icircle = 0x24d8; - t.icircumflex = 0x00ee; - t.icyrillic = 0x0456; - t.idblgrave = 0x0209; - t.ideographearthcircle = 0x328f; - t.ideographfirecircle = 0x328b; - t.ideographicallianceparen = 0x323f; - t.ideographiccallparen = 0x323a; - t.ideographiccentrecircle = 0x32a5; - t.ideographicclose = 0x3006; - t.ideographiccomma = 0x3001; - t.ideographiccommaleft = 0xff64; - t.ideographiccongratulationparen = 0x3237; - t.ideographiccorrectcircle = 0x32a3; - t.ideographicearthparen = 0x322f; - t.ideographicenterpriseparen = 0x323d; - t.ideographicexcellentcircle = 0x329d; - t.ideographicfestivalparen = 0x3240; - t.ideographicfinancialcircle = 0x3296; - t.ideographicfinancialparen = 0x3236; - t.ideographicfireparen = 0x322b; - t.ideographichaveparen = 0x3232; - t.ideographichighcircle = 0x32a4; - t.ideographiciterationmark = 0x3005; - t.ideographiclaborcircle = 0x3298; - t.ideographiclaborparen = 0x3238; - t.ideographicleftcircle = 0x32a7; - t.ideographiclowcircle = 0x32a6; - t.ideographicmedicinecircle = 0x32a9; - t.ideographicmetalparen = 0x322e; - t.ideographicmoonparen = 0x322a; - t.ideographicnameparen = 0x3234; - t.ideographicperiod = 0x3002; - t.ideographicprintcircle = 0x329e; - t.ideographicreachparen = 0x3243; - t.ideographicrepresentparen = 0x3239; - t.ideographicresourceparen = 0x323e; - t.ideographicrightcircle = 0x32a8; - t.ideographicsecretcircle = 0x3299; - t.ideographicselfparen = 0x3242; - t.ideographicsocietyparen = 0x3233; - t.ideographicspace = 0x3000; - t.ideographicspecialparen = 0x3235; - t.ideographicstockparen = 0x3231; - t.ideographicstudyparen = 0x323b; - t.ideographicsunparen = 0x3230; - t.ideographicsuperviseparen = 0x323c; - t.ideographicwaterparen = 0x322c; - t.ideographicwoodparen = 0x322d; - t.ideographiczero = 0x3007; - t.ideographmetalcircle = 0x328e; - t.ideographmooncircle = 0x328a; - t.ideographnamecircle = 0x3294; - t.ideographsuncircle = 0x3290; - t.ideographwatercircle = 0x328c; - t.ideographwoodcircle = 0x328d; - t.ideva = 0x0907; - t.idieresis = 0x00ef; - t.idieresisacute = 0x1e2f; - t.idieresiscyrillic = 0x04e5; - t.idotbelow = 0x1ecb; - t.iebrevecyrillic = 0x04d7; - t.iecyrillic = 0x0435; - t.ieungacirclekorean = 0x3275; - t.ieungaparenkorean = 0x3215; - t.ieungcirclekorean = 0x3267; - t.ieungkorean = 0x3147; - t.ieungparenkorean = 0x3207; - t.igrave = 0x00ec; - t.igujarati = 0x0a87; - t.igurmukhi = 0x0a07; - t.ihiragana = 0x3044; - t.ihookabove = 0x1ec9; - t.iibengali = 0x0988; - t.iicyrillic = 0x0438; - t.iideva = 0x0908; - t.iigujarati = 0x0a88; - t.iigurmukhi = 0x0a08; - t.iimatragurmukhi = 0x0a40; - t.iinvertedbreve = 0x020b; - t.iishortcyrillic = 0x0439; - t.iivowelsignbengali = 0x09c0; - t.iivowelsigndeva = 0x0940; - t.iivowelsigngujarati = 0x0ac0; - t.ij = 0x0133; - t.ikatakana = 0x30a4; - t.ikatakanahalfwidth = 0xff72; - t.ikorean = 0x3163; - t.ilde = 0x02dc; - t.iluyhebrew = 0x05ac; - t.imacron = 0x012b; - t.imacroncyrillic = 0x04e3; - t.imageorapproximatelyequal = 0x2253; - t.imatragurmukhi = 0x0a3f; - t.imonospace = 0xff49; - t.increment = 0x2206; - t.infinity = 0x221e; - t.iniarmenian = 0x056b; - t.integral = 0x222b; - t.integralbottom = 0x2321; - t.integralbt = 0x2321; - t.integralex = 0xf8f5; - t.integraltop = 0x2320; - t.integraltp = 0x2320; - t.intersection = 0x2229; - t.intisquare = 0x3305; - t.invbullet = 0x25d8; - t.invcircle = 0x25d9; - t.invsmileface = 0x263b; - t.iocyrillic = 0x0451; - t.iogonek = 0x012f; - t.iota = 0x03b9; - t.iotadieresis = 0x03ca; - t.iotadieresistonos = 0x0390; - t.iotalatin = 0x0269; - t.iotatonos = 0x03af; - t.iparen = 0x24a4; - t.irigurmukhi = 0x0a72; - t.ismallhiragana = 0x3043; - t.ismallkatakana = 0x30a3; - t.ismallkatakanahalfwidth = 0xff68; - t.issharbengali = 0x09fa; - t.istroke = 0x0268; - t.isuperior = 0xf6ed; - t.iterationhiragana = 0x309d; - t.iterationkatakana = 0x30fd; - t.itilde = 0x0129; - t.itildebelow = 0x1e2d; - t.iubopomofo = 0x3129; - t.iucyrillic = 0x044e; - t.ivowelsignbengali = 0x09bf; - t.ivowelsigndeva = 0x093f; - t.ivowelsigngujarati = 0x0abf; - t.izhitsacyrillic = 0x0475; - t.izhitsadblgravecyrillic = 0x0477; - t.j = 0x006a; - t.jaarmenian = 0x0571; - t.jabengali = 0x099c; - t.jadeva = 0x091c; - t.jagujarati = 0x0a9c; - t.jagurmukhi = 0x0a1c; - t.jbopomofo = 0x3110; - t.jcaron = 0x01f0; - t.jcircle = 0x24d9; - t.jcircumflex = 0x0135; - t.jcrossedtail = 0x029d; - t.jdotlessstroke = 0x025f; - t.jecyrillic = 0x0458; - t.jeemarabic = 0x062c; - t.jeemfinalarabic = 0xfe9e; - t.jeeminitialarabic = 0xfe9f; - t.jeemmedialarabic = 0xfea0; - t.jeharabic = 0x0698; - t.jehfinalarabic = 0xfb8b; - t.jhabengali = 0x099d; - t.jhadeva = 0x091d; - t.jhagujarati = 0x0a9d; - t.jhagurmukhi = 0x0a1d; - t.jheharmenian = 0x057b; - t.jis = 0x3004; - t.jmonospace = 0xff4a; - t.jparen = 0x24a5; - t.jsuperior = 0x02b2; - t.k = 0x006b; - t.kabashkircyrillic = 0x04a1; - t.kabengali = 0x0995; - t.kacute = 0x1e31; - t.kacyrillic = 0x043a; - t.kadescendercyrillic = 0x049b; - t.kadeva = 0x0915; - t.kaf = 0x05db; - t.kafarabic = 0x0643; - t.kafdagesh = 0xfb3b; - t.kafdageshhebrew = 0xfb3b; - t.kaffinalarabic = 0xfeda; - t.kafhebrew = 0x05db; - t.kafinitialarabic = 0xfedb; - t.kafmedialarabic = 0xfedc; - t.kafrafehebrew = 0xfb4d; - t.kagujarati = 0x0a95; - t.kagurmukhi = 0x0a15; - t.kahiragana = 0x304b; - t.kahookcyrillic = 0x04c4; - t.kakatakana = 0x30ab; - t.kakatakanahalfwidth = 0xff76; - t.kappa = 0x03ba; - t.kappasymbolgreek = 0x03f0; - t.kapyeounmieumkorean = 0x3171; - t.kapyeounphieuphkorean = 0x3184; - t.kapyeounpieupkorean = 0x3178; - t.kapyeounssangpieupkorean = 0x3179; - t.karoriisquare = 0x330d; - t.kashidaautoarabic = 0x0640; - t.kashidaautonosidebearingarabic = 0x0640; - t.kasmallkatakana = 0x30f5; - t.kasquare = 0x3384; - t.kasraarabic = 0x0650; - t.kasratanarabic = 0x064d; - t.kastrokecyrillic = 0x049f; - t.katahiraprolongmarkhalfwidth = 0xff70; - t.kaverticalstrokecyrillic = 0x049d; - t.kbopomofo = 0x310e; - t.kcalsquare = 0x3389; - t.kcaron = 0x01e9; - t.kcedilla = 0x0137; - t.kcircle = 0x24da; - t.kcommaaccent = 0x0137; - t.kdotbelow = 0x1e33; - t.keharmenian = 0x0584; - t.kehiragana = 0x3051; - t.kekatakana = 0x30b1; - t.kekatakanahalfwidth = 0xff79; - t.kenarmenian = 0x056f; - t.kesmallkatakana = 0x30f6; - t.kgreenlandic = 0x0138; - t.khabengali = 0x0996; - t.khacyrillic = 0x0445; - t.khadeva = 0x0916; - t.khagujarati = 0x0a96; - t.khagurmukhi = 0x0a16; - t.khaharabic = 0x062e; - t.khahfinalarabic = 0xfea6; - t.khahinitialarabic = 0xfea7; - t.khahmedialarabic = 0xfea8; - t.kheicoptic = 0x03e7; - t.khhadeva = 0x0959; - t.khhagurmukhi = 0x0a59; - t.khieukhacirclekorean = 0x3278; - t.khieukhaparenkorean = 0x3218; - t.khieukhcirclekorean = 0x326a; - t.khieukhkorean = 0x314b; - t.khieukhparenkorean = 0x320a; - t.khokhaithai = 0x0e02; - t.khokhonthai = 0x0e05; - t.khokhuatthai = 0x0e03; - t.khokhwaithai = 0x0e04; - t.khomutthai = 0x0e5b; - t.khook = 0x0199; - t.khorakhangthai = 0x0e06; - t.khzsquare = 0x3391; - t.kihiragana = 0x304d; - t.kikatakana = 0x30ad; - t.kikatakanahalfwidth = 0xff77; - t.kiroguramusquare = 0x3315; - t.kiromeetorusquare = 0x3316; - t.kirosquare = 0x3314; - t.kiyeokacirclekorean = 0x326e; - t.kiyeokaparenkorean = 0x320e; - t.kiyeokcirclekorean = 0x3260; - t.kiyeokkorean = 0x3131; - t.kiyeokparenkorean = 0x3200; - t.kiyeoksioskorean = 0x3133; - t.kjecyrillic = 0x045c; - t.klinebelow = 0x1e35; - t.klsquare = 0x3398; - t.kmcubedsquare = 0x33a6; - t.kmonospace = 0xff4b; - t.kmsquaredsquare = 0x33a2; - t.kohiragana = 0x3053; - t.kohmsquare = 0x33c0; - t.kokaithai = 0x0e01; - t.kokatakana = 0x30b3; - t.kokatakanahalfwidth = 0xff7a; - t.kooposquare = 0x331e; - t.koppacyrillic = 0x0481; - t.koreanstandardsymbol = 0x327f; - t.koroniscmb = 0x0343; - t.kparen = 0x24a6; - t.kpasquare = 0x33aa; - t.ksicyrillic = 0x046f; - t.ktsquare = 0x33cf; - t.kturned = 0x029e; - t.kuhiragana = 0x304f; - t.kukatakana = 0x30af; - t.kukatakanahalfwidth = 0xff78; - t.kvsquare = 0x33b8; - t.kwsquare = 0x33be; - t.l = 0x006c; - t.labengali = 0x09b2; - t.lacute = 0x013a; - t.ladeva = 0x0932; - t.lagujarati = 0x0ab2; - t.lagurmukhi = 0x0a32; - t.lakkhangyaothai = 0x0e45; - t.lamaleffinalarabic = 0xfefc; - t.lamalefhamzaabovefinalarabic = 0xfef8; - t.lamalefhamzaaboveisolatedarabic = 0xfef7; - t.lamalefhamzabelowfinalarabic = 0xfefa; - t.lamalefhamzabelowisolatedarabic = 0xfef9; - t.lamalefisolatedarabic = 0xfefb; - t.lamalefmaddaabovefinalarabic = 0xfef6; - t.lamalefmaddaaboveisolatedarabic = 0xfef5; - t.lamarabic = 0x0644; - t.lambda = 0x03bb; - t.lambdastroke = 0x019b; - t.lamed = 0x05dc; - t.lameddagesh = 0xfb3c; - t.lameddageshhebrew = 0xfb3c; - t.lamedhebrew = 0x05dc; - t.lamfinalarabic = 0xfede; - t.lamhahinitialarabic = 0xfcca; - t.laminitialarabic = 0xfedf; - t.lamjeeminitialarabic = 0xfcc9; - t.lamkhahinitialarabic = 0xfccb; - t.lamlamhehisolatedarabic = 0xfdf2; - t.lammedialarabic = 0xfee0; - t.lammeemhahinitialarabic = 0xfd88; - t.lammeeminitialarabic = 0xfccc; - t.largecircle = 0x25ef; - t.lbar = 0x019a; - t.lbelt = 0x026c; - t.lbopomofo = 0x310c; - t.lcaron = 0x013e; - t.lcedilla = 0x013c; - t.lcircle = 0x24db; - t.lcircumflexbelow = 0x1e3d; - t.lcommaaccent = 0x013c; - t.ldot = 0x0140; - t.ldotaccent = 0x0140; - t.ldotbelow = 0x1e37; - t.ldotbelowmacron = 0x1e39; - t.leftangleabovecmb = 0x031a; - t.lefttackbelowcmb = 0x0318; - t.less = 0x003c; - t.lessequal = 0x2264; - t.lessequalorgreater = 0x22da; - t.lessmonospace = 0xff1c; - t.lessorequivalent = 0x2272; - t.lessorgreater = 0x2276; - t.lessoverequal = 0x2266; - t.lesssmall = 0xfe64; - t.lezh = 0x026e; - t.lfblock = 0x258c; - t.lhookretroflex = 0x026d; - t.lira = 0x20a4; - t.liwnarmenian = 0x056c; - t.lj = 0x01c9; - t.ljecyrillic = 0x0459; - t.ll = 0xf6c0; - t.lladeva = 0x0933; - t.llagujarati = 0x0ab3; - t.llinebelow = 0x1e3b; - t.llladeva = 0x0934; - t.llvocalicbengali = 0x09e1; - t.llvocalicdeva = 0x0961; - t.llvocalicvowelsignbengali = 0x09e3; - t.llvocalicvowelsigndeva = 0x0963; - t.lmiddletilde = 0x026b; - t.lmonospace = 0xff4c; - t.lmsquare = 0x33d0; - t.lochulathai = 0x0e2c; - t.logicaland = 0x2227; - t.logicalnot = 0x00ac; - t.logicalnotreversed = 0x2310; - t.logicalor = 0x2228; - t.lolingthai = 0x0e25; - t.longs = 0x017f; - t.lowlinecenterline = 0xfe4e; - t.lowlinecmb = 0x0332; - t.lowlinedashed = 0xfe4d; - t.lozenge = 0x25ca; - t.lparen = 0x24a7; - t.lslash = 0x0142; - t.lsquare = 0x2113; - t.lsuperior = 0xf6ee; - t.ltshade = 0x2591; - t.luthai = 0x0e26; - t.lvocalicbengali = 0x098c; - t.lvocalicdeva = 0x090c; - t.lvocalicvowelsignbengali = 0x09e2; - t.lvocalicvowelsigndeva = 0x0962; - t.lxsquare = 0x33d3; - t.m = 0x006d; - t.mabengali = 0x09ae; - t.macron = 0x00af; - t.macronbelowcmb = 0x0331; - t.macroncmb = 0x0304; - t.macronlowmod = 0x02cd; - t.macronmonospace = 0xffe3; - t.macute = 0x1e3f; - t.madeva = 0x092e; - t.magujarati = 0x0aae; - t.magurmukhi = 0x0a2e; - t.mahapakhhebrew = 0x05a4; - t.mahapakhlefthebrew = 0x05a4; - t.mahiragana = 0x307e; - t.maichattawalowleftthai = 0xf895; - t.maichattawalowrightthai = 0xf894; - t.maichattawathai = 0x0e4b; - t.maichattawaupperleftthai = 0xf893; - t.maieklowleftthai = 0xf88c; - t.maieklowrightthai = 0xf88b; - t.maiekthai = 0x0e48; - t.maiekupperleftthai = 0xf88a; - t.maihanakatleftthai = 0xf884; - t.maihanakatthai = 0x0e31; - t.maitaikhuleftthai = 0xf889; - t.maitaikhuthai = 0x0e47; - t.maitholowleftthai = 0xf88f; - t.maitholowrightthai = 0xf88e; - t.maithothai = 0x0e49; - t.maithoupperleftthai = 0xf88d; - t.maitrilowleftthai = 0xf892; - t.maitrilowrightthai = 0xf891; - t.maitrithai = 0x0e4a; - t.maitriupperleftthai = 0xf890; - t.maiyamokthai = 0x0e46; - t.makatakana = 0x30de; - t.makatakanahalfwidth = 0xff8f; - t.male = 0x2642; - t.mansyonsquare = 0x3347; - t.maqafhebrew = 0x05be; - t.mars = 0x2642; - t.masoracirclehebrew = 0x05af; - t.masquare = 0x3383; - t.mbopomofo = 0x3107; - t.mbsquare = 0x33d4; - t.mcircle = 0x24dc; - t.mcubedsquare = 0x33a5; - t.mdotaccent = 0x1e41; - t.mdotbelow = 0x1e43; - t.meemarabic = 0x0645; - t.meemfinalarabic = 0xfee2; - t.meeminitialarabic = 0xfee3; - t.meemmedialarabic = 0xfee4; - t.meemmeeminitialarabic = 0xfcd1; - t.meemmeemisolatedarabic = 0xfc48; - t.meetorusquare = 0x334d; - t.mehiragana = 0x3081; - t.meizierasquare = 0x337e; - t.mekatakana = 0x30e1; - t.mekatakanahalfwidth = 0xff92; - t.mem = 0x05de; - t.memdagesh = 0xfb3e; - t.memdageshhebrew = 0xfb3e; - t.memhebrew = 0x05de; - t.menarmenian = 0x0574; - t.merkhahebrew = 0x05a5; - t.merkhakefulahebrew = 0x05a6; - t.merkhakefulalefthebrew = 0x05a6; - t.merkhalefthebrew = 0x05a5; - t.mhook = 0x0271; - t.mhzsquare = 0x3392; - t.middledotkatakanahalfwidth = 0xff65; - t.middot = 0x00b7; - t.mieumacirclekorean = 0x3272; - t.mieumaparenkorean = 0x3212; - t.mieumcirclekorean = 0x3264; - t.mieumkorean = 0x3141; - t.mieumpansioskorean = 0x3170; - t.mieumparenkorean = 0x3204; - t.mieumpieupkorean = 0x316e; - t.mieumsioskorean = 0x316f; - t.mihiragana = 0x307f; - t.mikatakana = 0x30df; - t.mikatakanahalfwidth = 0xff90; - t.minus = 0x2212; - t.minusbelowcmb = 0x0320; - t.minuscircle = 0x2296; - t.minusmod = 0x02d7; - t.minusplus = 0x2213; - t.minute = 0x2032; - t.miribaarusquare = 0x334a; - t.mirisquare = 0x3349; - t.mlonglegturned = 0x0270; - t.mlsquare = 0x3396; - t.mmcubedsquare = 0x33a3; - t.mmonospace = 0xff4d; - t.mmsquaredsquare = 0x339f; - t.mohiragana = 0x3082; - t.mohmsquare = 0x33c1; - t.mokatakana = 0x30e2; - t.mokatakanahalfwidth = 0xff93; - t.molsquare = 0x33d6; - t.momathai = 0x0e21; - t.moverssquare = 0x33a7; - t.moverssquaredsquare = 0x33a8; - t.mparen = 0x24a8; - t.mpasquare = 0x33ab; - t.mssquare = 0x33b3; - t.msuperior = 0xf6ef; - t.mturned = 0x026f; - t.mu = 0x00b5; - t.mu1 = 0x00b5; - t.muasquare = 0x3382; - t.muchgreater = 0x226b; - t.muchless = 0x226a; - t.mufsquare = 0x338c; - t.mugreek = 0x03bc; - t.mugsquare = 0x338d; - t.muhiragana = 0x3080; - t.mukatakana = 0x30e0; - t.mukatakanahalfwidth = 0xff91; - t.mulsquare = 0x3395; - t.multiply = 0x00d7; - t.mumsquare = 0x339b; - t.munahhebrew = 0x05a3; - t.munahlefthebrew = 0x05a3; - t.musicalnote = 0x266a; - t.musicalnotedbl = 0x266b; - t.musicflatsign = 0x266d; - t.musicsharpsign = 0x266f; - t.mussquare = 0x33b2; - t.muvsquare = 0x33b6; - t.muwsquare = 0x33bc; - t.mvmegasquare = 0x33b9; - t.mvsquare = 0x33b7; - t.mwmegasquare = 0x33bf; - t.mwsquare = 0x33bd; - t.n = 0x006e; - t.nabengali = 0x09a8; - t.nabla = 0x2207; - t.nacute = 0x0144; - t.nadeva = 0x0928; - t.nagujarati = 0x0aa8; - t.nagurmukhi = 0x0a28; - t.nahiragana = 0x306a; - t.nakatakana = 0x30ca; - t.nakatakanahalfwidth = 0xff85; - t.napostrophe = 0x0149; - t.nasquare = 0x3381; - t.nbopomofo = 0x310b; - t.nbspace = 0x00a0; - t.ncaron = 0x0148; - t.ncedilla = 0x0146; - t.ncircle = 0x24dd; - t.ncircumflexbelow = 0x1e4b; - t.ncommaaccent = 0x0146; - t.ndotaccent = 0x1e45; - t.ndotbelow = 0x1e47; - t.nehiragana = 0x306d; - t.nekatakana = 0x30cd; - t.nekatakanahalfwidth = 0xff88; - t.newsheqelsign = 0x20aa; - t.nfsquare = 0x338b; - t.ngabengali = 0x0999; - t.ngadeva = 0x0919; - t.ngagujarati = 0x0a99; - t.ngagurmukhi = 0x0a19; - t.ngonguthai = 0x0e07; - t.nhiragana = 0x3093; - t.nhookleft = 0x0272; - t.nhookretroflex = 0x0273; - t.nieunacirclekorean = 0x326f; - t.nieunaparenkorean = 0x320f; - t.nieuncieuckorean = 0x3135; - t.nieuncirclekorean = 0x3261; - t.nieunhieuhkorean = 0x3136; - t.nieunkorean = 0x3134; - t.nieunpansioskorean = 0x3168; - t.nieunparenkorean = 0x3201; - t.nieunsioskorean = 0x3167; - t.nieuntikeutkorean = 0x3166; - t.nihiragana = 0x306b; - t.nikatakana = 0x30cb; - t.nikatakanahalfwidth = 0xff86; - t.nikhahitleftthai = 0xf899; - t.nikhahitthai = 0x0e4d; - t.nine = 0x0039; - t.ninearabic = 0x0669; - t.ninebengali = 0x09ef; - t.ninecircle = 0x2468; - t.ninecircleinversesansserif = 0x2792; - t.ninedeva = 0x096f; - t.ninegujarati = 0x0aef; - t.ninegurmukhi = 0x0a6f; - t.ninehackarabic = 0x0669; - t.ninehangzhou = 0x3029; - t.nineideographicparen = 0x3228; - t.nineinferior = 0x2089; - t.ninemonospace = 0xff19; - t.nineoldstyle = 0xf739; - t.nineparen = 0x247c; - t.nineperiod = 0x2490; - t.ninepersian = 0x06f9; - t.nineroman = 0x2178; - t.ninesuperior = 0x2079; - t.nineteencircle = 0x2472; - t.nineteenparen = 0x2486; - t.nineteenperiod = 0x249a; - t.ninethai = 0x0e59; - t.nj = 0x01cc; - t.njecyrillic = 0x045a; - t.nkatakana = 0x30f3; - t.nkatakanahalfwidth = 0xff9d; - t.nlegrightlong = 0x019e; - t.nlinebelow = 0x1e49; - t.nmonospace = 0xff4e; - t.nmsquare = 0x339a; - t.nnabengali = 0x09a3; - t.nnadeva = 0x0923; - t.nnagujarati = 0x0aa3; - t.nnagurmukhi = 0x0a23; - t.nnnadeva = 0x0929; - t.nohiragana = 0x306e; - t.nokatakana = 0x30ce; - t.nokatakanahalfwidth = 0xff89; - t.nonbreakingspace = 0x00a0; - t.nonenthai = 0x0e13; - t.nonuthai = 0x0e19; - t.noonarabic = 0x0646; - t.noonfinalarabic = 0xfee6; - t.noonghunnaarabic = 0x06ba; - t.noonghunnafinalarabic = 0xfb9f; - t.nooninitialarabic = 0xfee7; - t.noonjeeminitialarabic = 0xfcd2; - t.noonjeemisolatedarabic = 0xfc4b; - t.noonmedialarabic = 0xfee8; - t.noonmeeminitialarabic = 0xfcd5; - t.noonmeemisolatedarabic = 0xfc4e; - t.noonnoonfinalarabic = 0xfc8d; - t.notcontains = 0x220c; - t.notelement = 0x2209; - t.notelementof = 0x2209; - t.notequal = 0x2260; - t.notgreater = 0x226f; - t.notgreaternorequal = 0x2271; - t.notgreaternorless = 0x2279; - t.notidentical = 0x2262; - t.notless = 0x226e; - t.notlessnorequal = 0x2270; - t.notparallel = 0x2226; - t.notprecedes = 0x2280; - t.notsubset = 0x2284; - t.notsucceeds = 0x2281; - t.notsuperset = 0x2285; - t.nowarmenian = 0x0576; - t.nparen = 0x24a9; - t.nssquare = 0x33b1; - t.nsuperior = 0x207f; - t.ntilde = 0x00f1; - t.nu = 0x03bd; - t.nuhiragana = 0x306c; - t.nukatakana = 0x30cc; - t.nukatakanahalfwidth = 0xff87; - t.nuktabengali = 0x09bc; - t.nuktadeva = 0x093c; - t.nuktagujarati = 0x0abc; - t.nuktagurmukhi = 0x0a3c; - t.numbersign = 0x0023; - t.numbersignmonospace = 0xff03; - t.numbersignsmall = 0xfe5f; - t.numeralsigngreek = 0x0374; - t.numeralsignlowergreek = 0x0375; - t.numero = 0x2116; - t.nun = 0x05e0; - t.nundagesh = 0xfb40; - t.nundageshhebrew = 0xfb40; - t.nunhebrew = 0x05e0; - t.nvsquare = 0x33b5; - t.nwsquare = 0x33bb; - t.nyabengali = 0x099e; - t.nyadeva = 0x091e; - t.nyagujarati = 0x0a9e; - t.nyagurmukhi = 0x0a1e; - t.o = 0x006f; - t.oacute = 0x00f3; - t.oangthai = 0x0e2d; - t.obarred = 0x0275; - t.obarredcyrillic = 0x04e9; - t.obarreddieresiscyrillic = 0x04eb; - t.obengali = 0x0993; - t.obopomofo = 0x311b; - t.obreve = 0x014f; - t.ocandradeva = 0x0911; - t.ocandragujarati = 0x0a91; - t.ocandravowelsigndeva = 0x0949; - t.ocandravowelsigngujarati = 0x0ac9; - t.ocaron = 0x01d2; - t.ocircle = 0x24de; - t.ocircumflex = 0x00f4; - t.ocircumflexacute = 0x1ed1; - t.ocircumflexdotbelow = 0x1ed9; - t.ocircumflexgrave = 0x1ed3; - t.ocircumflexhookabove = 0x1ed5; - t.ocircumflextilde = 0x1ed7; - t.ocyrillic = 0x043e; - t.odblacute = 0x0151; - t.odblgrave = 0x020d; - t.odeva = 0x0913; - t.odieresis = 0x00f6; - t.odieresiscyrillic = 0x04e7; - t.odotbelow = 0x1ecd; - t.oe = 0x0153; - t.oekorean = 0x315a; - t.ogonek = 0x02db; - t.ogonekcmb = 0x0328; - t.ograve = 0x00f2; - t.ogujarati = 0x0a93; - t.oharmenian = 0x0585; - t.ohiragana = 0x304a; - t.ohookabove = 0x1ecf; - t.ohorn = 0x01a1; - t.ohornacute = 0x1edb; - t.ohorndotbelow = 0x1ee3; - t.ohorngrave = 0x1edd; - t.ohornhookabove = 0x1edf; - t.ohorntilde = 0x1ee1; - t.ohungarumlaut = 0x0151; - t.oi = 0x01a3; - t.oinvertedbreve = 0x020f; - t.okatakana = 0x30aa; - t.okatakanahalfwidth = 0xff75; - t.okorean = 0x3157; - t.olehebrew = 0x05ab; - t.omacron = 0x014d; - t.omacronacute = 0x1e53; - t.omacrongrave = 0x1e51; - t.omdeva = 0x0950; - t.omega = 0x03c9; - t.omega1 = 0x03d6; - t.omegacyrillic = 0x0461; - t.omegalatinclosed = 0x0277; - t.omegaroundcyrillic = 0x047b; - t.omegatitlocyrillic = 0x047d; - t.omegatonos = 0x03ce; - t.omgujarati = 0x0ad0; - t.omicron = 0x03bf; - t.omicrontonos = 0x03cc; - t.omonospace = 0xff4f; - t.one = 0x0031; - t.onearabic = 0x0661; - t.onebengali = 0x09e7; - t.onecircle = 0x2460; - t.onecircleinversesansserif = 0x278a; - t.onedeva = 0x0967; - t.onedotenleader = 0x2024; - t.oneeighth = 0x215b; - t.onefitted = 0xf6dc; - t.onegujarati = 0x0ae7; - t.onegurmukhi = 0x0a67; - t.onehackarabic = 0x0661; - t.onehalf = 0x00bd; - t.onehangzhou = 0x3021; - t.oneideographicparen = 0x3220; - t.oneinferior = 0x2081; - t.onemonospace = 0xff11; - t.onenumeratorbengali = 0x09f4; - t.oneoldstyle = 0xf731; - t.oneparen = 0x2474; - t.oneperiod = 0x2488; - t.onepersian = 0x06f1; - t.onequarter = 0x00bc; - t.oneroman = 0x2170; - t.onesuperior = 0x00b9; - t.onethai = 0x0e51; - t.onethird = 0x2153; - t.oogonek = 0x01eb; - t.oogonekmacron = 0x01ed; - t.oogurmukhi = 0x0a13; - t.oomatragurmukhi = 0x0a4b; - t.oopen = 0x0254; - t.oparen = 0x24aa; - t.openbullet = 0x25e6; - t.option = 0x2325; - t.ordfeminine = 0x00aa; - t.ordmasculine = 0x00ba; - t.orthogonal = 0x221f; - t.oshortdeva = 0x0912; - t.oshortvowelsigndeva = 0x094a; - t.oslash = 0x00f8; - t.oslashacute = 0x01ff; - t.osmallhiragana = 0x3049; - t.osmallkatakana = 0x30a9; - t.osmallkatakanahalfwidth = 0xff6b; - t.ostrokeacute = 0x01ff; - t.osuperior = 0xf6f0; - t.otcyrillic = 0x047f; - t.otilde = 0x00f5; - t.otildeacute = 0x1e4d; - t.otildedieresis = 0x1e4f; - t.oubopomofo = 0x3121; - t.overline = 0x203e; - t.overlinecenterline = 0xfe4a; - t.overlinecmb = 0x0305; - t.overlinedashed = 0xfe49; - t.overlinedblwavy = 0xfe4c; - t.overlinewavy = 0xfe4b; - t.overscore = 0x00af; - t.ovowelsignbengali = 0x09cb; - t.ovowelsigndeva = 0x094b; - t.ovowelsigngujarati = 0x0acb; - t.p = 0x0070; - t.paampssquare = 0x3380; - t.paasentosquare = 0x332b; - t.pabengali = 0x09aa; - t.pacute = 0x1e55; - t.padeva = 0x092a; - t.pagedown = 0x21df; - t.pageup = 0x21de; - t.pagujarati = 0x0aaa; - t.pagurmukhi = 0x0a2a; - t.pahiragana = 0x3071; - t.paiyannoithai = 0x0e2f; - t.pakatakana = 0x30d1; - t.palatalizationcyrilliccmb = 0x0484; - t.palochkacyrillic = 0x04c0; - t.pansioskorean = 0x317f; - t.paragraph = 0x00b6; - t.parallel = 0x2225; - t.parenleft = 0x0028; - t.parenleftaltonearabic = 0xfd3e; - t.parenleftbt = 0xf8ed; - t.parenleftex = 0xf8ec; - t.parenleftinferior = 0x208d; - t.parenleftmonospace = 0xff08; - t.parenleftsmall = 0xfe59; - t.parenleftsuperior = 0x207d; - t.parenlefttp = 0xf8eb; - t.parenleftvertical = 0xfe35; - t.parenright = 0x0029; - t.parenrightaltonearabic = 0xfd3f; - t.parenrightbt = 0xf8f8; - t.parenrightex = 0xf8f7; - t.parenrightinferior = 0x208e; - t.parenrightmonospace = 0xff09; - t.parenrightsmall = 0xfe5a; - t.parenrightsuperior = 0x207e; - t.parenrighttp = 0xf8f6; - t.parenrightvertical = 0xfe36; - t.partialdiff = 0x2202; - t.paseqhebrew = 0x05c0; - t.pashtahebrew = 0x0599; - t.pasquare = 0x33a9; - t.patah = 0x05b7; - t.patah11 = 0x05b7; - t.patah1d = 0x05b7; - t.patah2a = 0x05b7; - t.patahhebrew = 0x05b7; - t.patahnarrowhebrew = 0x05b7; - t.patahquarterhebrew = 0x05b7; - t.patahwidehebrew = 0x05b7; - t.pazerhebrew = 0x05a1; - t.pbopomofo = 0x3106; - t.pcircle = 0x24df; - t.pdotaccent = 0x1e57; - t.pe = 0x05e4; - t.pecyrillic = 0x043f; - t.pedagesh = 0xfb44; - t.pedageshhebrew = 0xfb44; - t.peezisquare = 0x333b; - t.pefinaldageshhebrew = 0xfb43; - t.peharabic = 0x067e; - t.peharmenian = 0x057a; - t.pehebrew = 0x05e4; - t.pehfinalarabic = 0xfb57; - t.pehinitialarabic = 0xfb58; - t.pehiragana = 0x307a; - t.pehmedialarabic = 0xfb59; - t.pekatakana = 0x30da; - t.pemiddlehookcyrillic = 0x04a7; - t.perafehebrew = 0xfb4e; - t.percent = 0x0025; - t.percentarabic = 0x066a; - t.percentmonospace = 0xff05; - t.percentsmall = 0xfe6a; - t.period = 0x002e; - t.periodarmenian = 0x0589; - t.periodcentered = 0x00b7; - t.periodhalfwidth = 0xff61; - t.periodinferior = 0xf6e7; - t.periodmonospace = 0xff0e; - t.periodsmall = 0xfe52; - t.periodsuperior = 0xf6e8; - t.perispomenigreekcmb = 0x0342; - t.perpendicular = 0x22a5; - t.perthousand = 0x2030; - t.peseta = 0x20a7; - t.pfsquare = 0x338a; - t.phabengali = 0x09ab; - t.phadeva = 0x092b; - t.phagujarati = 0x0aab; - t.phagurmukhi = 0x0a2b; - t.phi = 0x03c6; - t.phi1 = 0x03d5; - t.phieuphacirclekorean = 0x327a; - t.phieuphaparenkorean = 0x321a; - t.phieuphcirclekorean = 0x326c; - t.phieuphkorean = 0x314d; - t.phieuphparenkorean = 0x320c; - t.philatin = 0x0278; - t.phinthuthai = 0x0e3a; - t.phisymbolgreek = 0x03d5; - t.phook = 0x01a5; - t.phophanthai = 0x0e1e; - t.phophungthai = 0x0e1c; - t.phosamphaothai = 0x0e20; - t.pi = 0x03c0; - t.pieupacirclekorean = 0x3273; - t.pieupaparenkorean = 0x3213; - t.pieupcieuckorean = 0x3176; - t.pieupcirclekorean = 0x3265; - t.pieupkiyeokkorean = 0x3172; - t.pieupkorean = 0x3142; - t.pieupparenkorean = 0x3205; - t.pieupsioskiyeokkorean = 0x3174; - t.pieupsioskorean = 0x3144; - t.pieupsiostikeutkorean = 0x3175; - t.pieupthieuthkorean = 0x3177; - t.pieuptikeutkorean = 0x3173; - t.pihiragana = 0x3074; - t.pikatakana = 0x30d4; - t.pisymbolgreek = 0x03d6; - t.piwrarmenian = 0x0583; - t.planckover2pi = 0x210f; - t.planckover2pi1 = 0x210f; - t.plus = 0x002b; - t.plusbelowcmb = 0x031f; - t.pluscircle = 0x2295; - t.plusminus = 0x00b1; - t.plusmod = 0x02d6; - t.plusmonospace = 0xff0b; - t.plussmall = 0xfe62; - t.plussuperior = 0x207a; - t.pmonospace = 0xff50; - t.pmsquare = 0x33d8; - t.pohiragana = 0x307d; - t.pointingindexdownwhite = 0x261f; - t.pointingindexleftwhite = 0x261c; - t.pointingindexrightwhite = 0x261e; - t.pointingindexupwhite = 0x261d; - t.pokatakana = 0x30dd; - t.poplathai = 0x0e1b; - t.postalmark = 0x3012; - t.postalmarkface = 0x3020; - t.pparen = 0x24ab; - t.precedes = 0x227a; - t.prescription = 0x211e; - t.primemod = 0x02b9; - t.primereversed = 0x2035; - t.product = 0x220f; - t.projective = 0x2305; - t.prolongedkana = 0x30fc; - t.propellor = 0x2318; - t.propersubset = 0x2282; - t.propersuperset = 0x2283; - t.proportion = 0x2237; - t.proportional = 0x221d; - t.psi = 0x03c8; - t.psicyrillic = 0x0471; - t.psilipneumatacyrilliccmb = 0x0486; - t.pssquare = 0x33b0; - t.puhiragana = 0x3077; - t.pukatakana = 0x30d7; - t.pvsquare = 0x33b4; - t.pwsquare = 0x33ba; - t.q = 0x0071; - t.qadeva = 0x0958; - t.qadmahebrew = 0x05a8; - t.qafarabic = 0x0642; - t.qaffinalarabic = 0xfed6; - t.qafinitialarabic = 0xfed7; - t.qafmedialarabic = 0xfed8; - t.qamats = 0x05b8; - t.qamats10 = 0x05b8; - t.qamats1a = 0x05b8; - t.qamats1c = 0x05b8; - t.qamats27 = 0x05b8; - t.qamats29 = 0x05b8; - t.qamats33 = 0x05b8; - t.qamatsde = 0x05b8; - t.qamatshebrew = 0x05b8; - t.qamatsnarrowhebrew = 0x05b8; - t.qamatsqatanhebrew = 0x05b8; - t.qamatsqatannarrowhebrew = 0x05b8; - t.qamatsqatanquarterhebrew = 0x05b8; - t.qamatsqatanwidehebrew = 0x05b8; - t.qamatsquarterhebrew = 0x05b8; - t.qamatswidehebrew = 0x05b8; - t.qarneyparahebrew = 0x059f; - t.qbopomofo = 0x3111; - t.qcircle = 0x24e0; - t.qhook = 0x02a0; - t.qmonospace = 0xff51; - t.qof = 0x05e7; - t.qofdagesh = 0xfb47; - t.qofdageshhebrew = 0xfb47; - t.qofhebrew = 0x05e7; - t.qparen = 0x24ac; - t.quarternote = 0x2669; - t.qubuts = 0x05bb; - t.qubuts18 = 0x05bb; - t.qubuts25 = 0x05bb; - t.qubuts31 = 0x05bb; - t.qubutshebrew = 0x05bb; - t.qubutsnarrowhebrew = 0x05bb; - t.qubutsquarterhebrew = 0x05bb; - t.qubutswidehebrew = 0x05bb; - t.question = 0x003f; - t.questionarabic = 0x061f; - t.questionarmenian = 0x055e; - t.questiondown = 0x00bf; - t.questiondownsmall = 0xf7bf; - t.questiongreek = 0x037e; - t.questionmonospace = 0xff1f; - t.questionsmall = 0xf73f; - t.quotedbl = 0x0022; - t.quotedblbase = 0x201e; - t.quotedblleft = 0x201c; - t.quotedblmonospace = 0xff02; - t.quotedblprime = 0x301e; - t.quotedblprimereversed = 0x301d; - t.quotedblright = 0x201d; - t.quoteleft = 0x2018; - t.quoteleftreversed = 0x201b; - t.quotereversed = 0x201b; - t.quoteright = 0x2019; - t.quoterightn = 0x0149; - t.quotesinglbase = 0x201a; - t.quotesingle = 0x0027; - t.quotesinglemonospace = 0xff07; - t.r = 0x0072; - t.raarmenian = 0x057c; - t.rabengali = 0x09b0; - t.racute = 0x0155; - t.radeva = 0x0930; - t.radical = 0x221a; - t.radicalex = 0xf8e5; - t.radoverssquare = 0x33ae; - t.radoverssquaredsquare = 0x33af; - t.radsquare = 0x33ad; - t.rafe = 0x05bf; - t.rafehebrew = 0x05bf; - t.ragujarati = 0x0ab0; - t.ragurmukhi = 0x0a30; - t.rahiragana = 0x3089; - t.rakatakana = 0x30e9; - t.rakatakanahalfwidth = 0xff97; - t.ralowerdiagonalbengali = 0x09f1; - t.ramiddlediagonalbengali = 0x09f0; - t.ramshorn = 0x0264; - t.ratio = 0x2236; - t.rbopomofo = 0x3116; - t.rcaron = 0x0159; - t.rcedilla = 0x0157; - t.rcircle = 0x24e1; - t.rcommaaccent = 0x0157; - t.rdblgrave = 0x0211; - t.rdotaccent = 0x1e59; - t.rdotbelow = 0x1e5b; - t.rdotbelowmacron = 0x1e5d; - t.referencemark = 0x203b; - t.reflexsubset = 0x2286; - t.reflexsuperset = 0x2287; - t.registered = 0x00ae; - t.registersans = 0xf8e8; - t.registerserif = 0xf6da; - t.reharabic = 0x0631; - t.reharmenian = 0x0580; - t.rehfinalarabic = 0xfeae; - t.rehiragana = 0x308c; - t.rekatakana = 0x30ec; - t.rekatakanahalfwidth = 0xff9a; - t.resh = 0x05e8; - t.reshdageshhebrew = 0xfb48; - t.reshhebrew = 0x05e8; - t.reversedtilde = 0x223d; - t.reviahebrew = 0x0597; - t.reviamugrashhebrew = 0x0597; - t.revlogicalnot = 0x2310; - t.rfishhook = 0x027e; - t.rfishhookreversed = 0x027f; - t.rhabengali = 0x09dd; - t.rhadeva = 0x095d; - t.rho = 0x03c1; - t.rhook = 0x027d; - t.rhookturned = 0x027b; - t.rhookturnedsuperior = 0x02b5; - t.rhosymbolgreek = 0x03f1; - t.rhotichookmod = 0x02de; - t.rieulacirclekorean = 0x3271; - t.rieulaparenkorean = 0x3211; - t.rieulcirclekorean = 0x3263; - t.rieulhieuhkorean = 0x3140; - t.rieulkiyeokkorean = 0x313a; - t.rieulkiyeoksioskorean = 0x3169; - t.rieulkorean = 0x3139; - t.rieulmieumkorean = 0x313b; - t.rieulpansioskorean = 0x316c; - t.rieulparenkorean = 0x3203; - t.rieulphieuphkorean = 0x313f; - t.rieulpieupkorean = 0x313c; - t.rieulpieupsioskorean = 0x316b; - t.rieulsioskorean = 0x313d; - t.rieulthieuthkorean = 0x313e; - t.rieultikeutkorean = 0x316a; - t.rieulyeorinhieuhkorean = 0x316d; - t.rightangle = 0x221f; - t.righttackbelowcmb = 0x0319; - t.righttriangle = 0x22bf; - t.rihiragana = 0x308a; - t.rikatakana = 0x30ea; - t.rikatakanahalfwidth = 0xff98; - t.ring = 0x02da; - t.ringbelowcmb = 0x0325; - t.ringcmb = 0x030a; - t.ringhalfleft = 0x02bf; - t.ringhalfleftarmenian = 0x0559; - t.ringhalfleftbelowcmb = 0x031c; - t.ringhalfleftcentered = 0x02d3; - t.ringhalfright = 0x02be; - t.ringhalfrightbelowcmb = 0x0339; - t.ringhalfrightcentered = 0x02d2; - t.rinvertedbreve = 0x0213; - t.rittorusquare = 0x3351; - t.rlinebelow = 0x1e5f; - t.rlongleg = 0x027c; - t.rlonglegturned = 0x027a; - t.rmonospace = 0xff52; - t.rohiragana = 0x308d; - t.rokatakana = 0x30ed; - t.rokatakanahalfwidth = 0xff9b; - t.roruathai = 0x0e23; - t.rparen = 0x24ad; - t.rrabengali = 0x09dc; - t.rradeva = 0x0931; - t.rragurmukhi = 0x0a5c; - t.rreharabic = 0x0691; - t.rrehfinalarabic = 0xfb8d; - t.rrvocalicbengali = 0x09e0; - t.rrvocalicdeva = 0x0960; - t.rrvocalicgujarati = 0x0ae0; - t.rrvocalicvowelsignbengali = 0x09c4; - t.rrvocalicvowelsigndeva = 0x0944; - t.rrvocalicvowelsigngujarati = 0x0ac4; - t.rsuperior = 0xf6f1; - t.rtblock = 0x2590; - t.rturned = 0x0279; - t.rturnedsuperior = 0x02b4; - t.ruhiragana = 0x308b; - t.rukatakana = 0x30eb; - t.rukatakanahalfwidth = 0xff99; - t.rupeemarkbengali = 0x09f2; - t.rupeesignbengali = 0x09f3; - t.rupiah = 0xf6dd; - t.ruthai = 0x0e24; - t.rvocalicbengali = 0x098b; - t.rvocalicdeva = 0x090b; - t.rvocalicgujarati = 0x0a8b; - t.rvocalicvowelsignbengali = 0x09c3; - t.rvocalicvowelsigndeva = 0x0943; - t.rvocalicvowelsigngujarati = 0x0ac3; - t.s = 0x0073; - t.sabengali = 0x09b8; - t.sacute = 0x015b; - t.sacutedotaccent = 0x1e65; - t.sadarabic = 0x0635; - t.sadeva = 0x0938; - t.sadfinalarabic = 0xfeba; - t.sadinitialarabic = 0xfebb; - t.sadmedialarabic = 0xfebc; - t.sagujarati = 0x0ab8; - t.sagurmukhi = 0x0a38; - t.sahiragana = 0x3055; - t.sakatakana = 0x30b5; - t.sakatakanahalfwidth = 0xff7b; - t.sallallahoualayhewasallamarabic = 0xfdfa; - t.samekh = 0x05e1; - t.samekhdagesh = 0xfb41; - t.samekhdageshhebrew = 0xfb41; - t.samekhhebrew = 0x05e1; - t.saraaathai = 0x0e32; - t.saraaethai = 0x0e41; - t.saraaimaimalaithai = 0x0e44; - t.saraaimaimuanthai = 0x0e43; - t.saraamthai = 0x0e33; - t.saraathai = 0x0e30; - t.saraethai = 0x0e40; - t.saraiileftthai = 0xf886; - t.saraiithai = 0x0e35; - t.saraileftthai = 0xf885; - t.saraithai = 0x0e34; - t.saraothai = 0x0e42; - t.saraueeleftthai = 0xf888; - t.saraueethai = 0x0e37; - t.saraueleftthai = 0xf887; - t.sarauethai = 0x0e36; - t.sarauthai = 0x0e38; - t.sarauuthai = 0x0e39; - t.sbopomofo = 0x3119; - t.scaron = 0x0161; - t.scarondotaccent = 0x1e67; - t.scedilla = 0x015f; - t.schwa = 0x0259; - t.schwacyrillic = 0x04d9; - t.schwadieresiscyrillic = 0x04db; - t.schwahook = 0x025a; - t.scircle = 0x24e2; - t.scircumflex = 0x015d; - t.scommaaccent = 0x0219; - t.sdotaccent = 0x1e61; - t.sdotbelow = 0x1e63; - t.sdotbelowdotaccent = 0x1e69; - t.seagullbelowcmb = 0x033c; - t.second = 0x2033; - t.secondtonechinese = 0x02ca; - t.section = 0x00a7; - t.seenarabic = 0x0633; - t.seenfinalarabic = 0xfeb2; - t.seeninitialarabic = 0xfeb3; - t.seenmedialarabic = 0xfeb4; - t.segol = 0x05b6; - t.segol13 = 0x05b6; - t.segol1f = 0x05b6; - t.segol2c = 0x05b6; - t.segolhebrew = 0x05b6; - t.segolnarrowhebrew = 0x05b6; - t.segolquarterhebrew = 0x05b6; - t.segoltahebrew = 0x0592; - t.segolwidehebrew = 0x05b6; - t.seharmenian = 0x057d; - t.sehiragana = 0x305b; - t.sekatakana = 0x30bb; - t.sekatakanahalfwidth = 0xff7e; - t.semicolon = 0x003b; - t.semicolonarabic = 0x061b; - t.semicolonmonospace = 0xff1b; - t.semicolonsmall = 0xfe54; - t.semivoicedmarkkana = 0x309c; - t.semivoicedmarkkanahalfwidth = 0xff9f; - t.sentisquare = 0x3322; - t.sentosquare = 0x3323; - t.seven = 0x0037; - t.sevenarabic = 0x0667; - t.sevenbengali = 0x09ed; - t.sevencircle = 0x2466; - t.sevencircleinversesansserif = 0x2790; - t.sevendeva = 0x096d; - t.seveneighths = 0x215e; - t.sevengujarati = 0x0aed; - t.sevengurmukhi = 0x0a6d; - t.sevenhackarabic = 0x0667; - t.sevenhangzhou = 0x3027; - t.sevenideographicparen = 0x3226; - t.seveninferior = 0x2087; - t.sevenmonospace = 0xff17; - t.sevenoldstyle = 0xf737; - t.sevenparen = 0x247a; - t.sevenperiod = 0x248e; - t.sevenpersian = 0x06f7; - t.sevenroman = 0x2176; - t.sevensuperior = 0x2077; - t.seventeencircle = 0x2470; - t.seventeenparen = 0x2484; - t.seventeenperiod = 0x2498; - t.seventhai = 0x0e57; - t.sfthyphen = 0x00ad; - t.shaarmenian = 0x0577; - t.shabengali = 0x09b6; - t.shacyrillic = 0x0448; - t.shaddaarabic = 0x0651; - t.shaddadammaarabic = 0xfc61; - t.shaddadammatanarabic = 0xfc5e; - t.shaddafathaarabic = 0xfc60; - t.shaddakasraarabic = 0xfc62; - t.shaddakasratanarabic = 0xfc5f; - t.shade = 0x2592; - t.shadedark = 0x2593; - t.shadelight = 0x2591; - t.shademedium = 0x2592; - t.shadeva = 0x0936; - t.shagujarati = 0x0ab6; - t.shagurmukhi = 0x0a36; - t.shalshelethebrew = 0x0593; - t.shbopomofo = 0x3115; - t.shchacyrillic = 0x0449; - t.sheenarabic = 0x0634; - t.sheenfinalarabic = 0xfeb6; - t.sheeninitialarabic = 0xfeb7; - t.sheenmedialarabic = 0xfeb8; - t.sheicoptic = 0x03e3; - t.sheqel = 0x20aa; - t.sheqelhebrew = 0x20aa; - t.sheva = 0x05b0; - t.sheva115 = 0x05b0; - t.sheva15 = 0x05b0; - t.sheva22 = 0x05b0; - t.sheva2e = 0x05b0; - t.shevahebrew = 0x05b0; - t.shevanarrowhebrew = 0x05b0; - t.shevaquarterhebrew = 0x05b0; - t.shevawidehebrew = 0x05b0; - t.shhacyrillic = 0x04bb; - t.shimacoptic = 0x03ed; - t.shin = 0x05e9; - t.shindagesh = 0xfb49; - t.shindageshhebrew = 0xfb49; - t.shindageshshindot = 0xfb2c; - t.shindageshshindothebrew = 0xfb2c; - t.shindageshsindot = 0xfb2d; - t.shindageshsindothebrew = 0xfb2d; - t.shindothebrew = 0x05c1; - t.shinhebrew = 0x05e9; - t.shinshindot = 0xfb2a; - t.shinshindothebrew = 0xfb2a; - t.shinsindot = 0xfb2b; - t.shinsindothebrew = 0xfb2b; - t.shook = 0x0282; - t.sigma = 0x03c3; - t.sigma1 = 0x03c2; - t.sigmafinal = 0x03c2; - t.sigmalunatesymbolgreek = 0x03f2; - t.sihiragana = 0x3057; - t.sikatakana = 0x30b7; - t.sikatakanahalfwidth = 0xff7c; - t.siluqhebrew = 0x05bd; - t.siluqlefthebrew = 0x05bd; - t.similar = 0x223c; - t.sindothebrew = 0x05c2; - t.siosacirclekorean = 0x3274; - t.siosaparenkorean = 0x3214; - t.sioscieuckorean = 0x317e; - t.sioscirclekorean = 0x3266; - t.sioskiyeokkorean = 0x317a; - t.sioskorean = 0x3145; - t.siosnieunkorean = 0x317b; - t.siosparenkorean = 0x3206; - t.siospieupkorean = 0x317d; - t.siostikeutkorean = 0x317c; - t.six = 0x0036; - t.sixarabic = 0x0666; - t.sixbengali = 0x09ec; - t.sixcircle = 0x2465; - t.sixcircleinversesansserif = 0x278f; - t.sixdeva = 0x096c; - t.sixgujarati = 0x0aec; - t.sixgurmukhi = 0x0a6c; - t.sixhackarabic = 0x0666; - t.sixhangzhou = 0x3026; - t.sixideographicparen = 0x3225; - t.sixinferior = 0x2086; - t.sixmonospace = 0xff16; - t.sixoldstyle = 0xf736; - t.sixparen = 0x2479; - t.sixperiod = 0x248d; - t.sixpersian = 0x06f6; - t.sixroman = 0x2175; - t.sixsuperior = 0x2076; - t.sixteencircle = 0x246f; - t.sixteencurrencydenominatorbengali = 0x09f9; - t.sixteenparen = 0x2483; - t.sixteenperiod = 0x2497; - t.sixthai = 0x0e56; - t.slash = 0x002f; - t.slashmonospace = 0xff0f; - t.slong = 0x017f; - t.slongdotaccent = 0x1e9b; - t.smileface = 0x263a; - t.smonospace = 0xff53; - t.sofpasuqhebrew = 0x05c3; - t.softhyphen = 0x00ad; - t.softsigncyrillic = 0x044c; - t.sohiragana = 0x305d; - t.sokatakana = 0x30bd; - t.sokatakanahalfwidth = 0xff7f; - t.soliduslongoverlaycmb = 0x0338; - t.solidusshortoverlaycmb = 0x0337; - t.sorusithai = 0x0e29; - t.sosalathai = 0x0e28; - t.sosothai = 0x0e0b; - t.sosuathai = 0x0e2a; - t.space = 0x0020; - t.spacehackarabic = 0x0020; - t.spade = 0x2660; - t.spadesuitblack = 0x2660; - t.spadesuitwhite = 0x2664; - t.sparen = 0x24ae; - t.squarebelowcmb = 0x033b; - t.squarecc = 0x33c4; - t.squarecm = 0x339d; - t.squarediagonalcrosshatchfill = 0x25a9; - t.squarehorizontalfill = 0x25a4; - t.squarekg = 0x338f; - t.squarekm = 0x339e; - t.squarekmcapital = 0x33ce; - t.squareln = 0x33d1; - t.squarelog = 0x33d2; - t.squaremg = 0x338e; - t.squaremil = 0x33d5; - t.squaremm = 0x339c; - t.squaremsquared = 0x33a1; - t.squareorthogonalcrosshatchfill = 0x25a6; - t.squareupperlefttolowerrightfill = 0x25a7; - t.squareupperrighttolowerleftfill = 0x25a8; - t.squareverticalfill = 0x25a5; - t.squarewhitewithsmallblack = 0x25a3; - t.srsquare = 0x33db; - t.ssabengali = 0x09b7; - t.ssadeva = 0x0937; - t.ssagujarati = 0x0ab7; - t.ssangcieuckorean = 0x3149; - t.ssanghieuhkorean = 0x3185; - t.ssangieungkorean = 0x3180; - t.ssangkiyeokkorean = 0x3132; - t.ssangnieunkorean = 0x3165; - t.ssangpieupkorean = 0x3143; - t.ssangsioskorean = 0x3146; - t.ssangtikeutkorean = 0x3138; - t.ssuperior = 0xf6f2; - t.sterling = 0x00a3; - t.sterlingmonospace = 0xffe1; - t.strokelongoverlaycmb = 0x0336; - t.strokeshortoverlaycmb = 0x0335; - t.subset = 0x2282; - t.subsetnotequal = 0x228a; - t.subsetorequal = 0x2286; - t.succeeds = 0x227b; - t.suchthat = 0x220b; - t.suhiragana = 0x3059; - t.sukatakana = 0x30b9; - t.sukatakanahalfwidth = 0xff7d; - t.sukunarabic = 0x0652; - t.summation = 0x2211; - t.sun = 0x263c; - t.superset = 0x2283; - t.supersetnotequal = 0x228b; - t.supersetorequal = 0x2287; - t.svsquare = 0x33dc; - t.syouwaerasquare = 0x337c; - t.t = 0x0074; - t.tabengali = 0x09a4; - t.tackdown = 0x22a4; - t.tackleft = 0x22a3; - t.tadeva = 0x0924; - t.tagujarati = 0x0aa4; - t.tagurmukhi = 0x0a24; - t.taharabic = 0x0637; - t.tahfinalarabic = 0xfec2; - t.tahinitialarabic = 0xfec3; - t.tahiragana = 0x305f; - t.tahmedialarabic = 0xfec4; - t.taisyouerasquare = 0x337d; - t.takatakana = 0x30bf; - t.takatakanahalfwidth = 0xff80; - t.tatweelarabic = 0x0640; - t.tau = 0x03c4; - t.tav = 0x05ea; - t.tavdages = 0xfb4a; - t.tavdagesh = 0xfb4a; - t.tavdageshhebrew = 0xfb4a; - t.tavhebrew = 0x05ea; - t.tbar = 0x0167; - t.tbopomofo = 0x310a; - t.tcaron = 0x0165; - t.tccurl = 0x02a8; - t.tcedilla = 0x0163; - t.tcheharabic = 0x0686; - t.tchehfinalarabic = 0xfb7b; - t.tchehinitialarabic = 0xfb7c; - t.tchehmedialarabic = 0xfb7d; - t.tcircle = 0x24e3; - t.tcircumflexbelow = 0x1e71; - t.tcommaaccent = 0x0163; - t.tdieresis = 0x1e97; - t.tdotaccent = 0x1e6b; - t.tdotbelow = 0x1e6d; - t.tecyrillic = 0x0442; - t.tedescendercyrillic = 0x04ad; - t.teharabic = 0x062a; - t.tehfinalarabic = 0xfe96; - t.tehhahinitialarabic = 0xfca2; - t.tehhahisolatedarabic = 0xfc0c; - t.tehinitialarabic = 0xfe97; - t.tehiragana = 0x3066; - t.tehjeeminitialarabic = 0xfca1; - t.tehjeemisolatedarabic = 0xfc0b; - t.tehmarbutaarabic = 0x0629; - t.tehmarbutafinalarabic = 0xfe94; - t.tehmedialarabic = 0xfe98; - t.tehmeeminitialarabic = 0xfca4; - t.tehmeemisolatedarabic = 0xfc0e; - t.tehnoonfinalarabic = 0xfc73; - t.tekatakana = 0x30c6; - t.tekatakanahalfwidth = 0xff83; - t.telephone = 0x2121; - t.telephoneblack = 0x260e; - t.telishagedolahebrew = 0x05a0; - t.telishaqetanahebrew = 0x05a9; - t.tencircle = 0x2469; - t.tenideographicparen = 0x3229; - t.tenparen = 0x247d; - t.tenperiod = 0x2491; - t.tenroman = 0x2179; - t.tesh = 0x02a7; - t.tet = 0x05d8; - t.tetdagesh = 0xfb38; - t.tetdageshhebrew = 0xfb38; - t.tethebrew = 0x05d8; - t.tetsecyrillic = 0x04b5; - t.tevirhebrew = 0x059b; - t.tevirlefthebrew = 0x059b; - t.thabengali = 0x09a5; - t.thadeva = 0x0925; - t.thagujarati = 0x0aa5; - t.thagurmukhi = 0x0a25; - t.thalarabic = 0x0630; - t.thalfinalarabic = 0xfeac; - t.thanthakhatlowleftthai = 0xf898; - t.thanthakhatlowrightthai = 0xf897; - t.thanthakhatthai = 0x0e4c; - t.thanthakhatupperleftthai = 0xf896; - t.theharabic = 0x062b; - t.thehfinalarabic = 0xfe9a; - t.thehinitialarabic = 0xfe9b; - t.thehmedialarabic = 0xfe9c; - t.thereexists = 0x2203; - t.therefore = 0x2234; - t.theta = 0x03b8; - t.theta1 = 0x03d1; - t.thetasymbolgreek = 0x03d1; - t.thieuthacirclekorean = 0x3279; - t.thieuthaparenkorean = 0x3219; - t.thieuthcirclekorean = 0x326b; - t.thieuthkorean = 0x314c; - t.thieuthparenkorean = 0x320b; - t.thirteencircle = 0x246c; - t.thirteenparen = 0x2480; - t.thirteenperiod = 0x2494; - t.thonangmonthothai = 0x0e11; - t.thook = 0x01ad; - t.thophuthaothai = 0x0e12; - t.thorn = 0x00fe; - t.thothahanthai = 0x0e17; - t.thothanthai = 0x0e10; - t.thothongthai = 0x0e18; - t.thothungthai = 0x0e16; - t.thousandcyrillic = 0x0482; - t.thousandsseparatorarabic = 0x066c; - t.thousandsseparatorpersian = 0x066c; - t.three = 0x0033; - t.threearabic = 0x0663; - t.threebengali = 0x09e9; - t.threecircle = 0x2462; - t.threecircleinversesansserif = 0x278c; - t.threedeva = 0x0969; - t.threeeighths = 0x215c; - t.threegujarati = 0x0ae9; - t.threegurmukhi = 0x0a69; - t.threehackarabic = 0x0663; - t.threehangzhou = 0x3023; - t.threeideographicparen = 0x3222; - t.threeinferior = 0x2083; - t.threemonospace = 0xff13; - t.threenumeratorbengali = 0x09f6; - t.threeoldstyle = 0xf733; - t.threeparen = 0x2476; - t.threeperiod = 0x248a; - t.threepersian = 0x06f3; - t.threequarters = 0x00be; - t.threequartersemdash = 0xf6de; - t.threeroman = 0x2172; - t.threesuperior = 0x00b3; - t.threethai = 0x0e53; - t.thzsquare = 0x3394; - t.tihiragana = 0x3061; - t.tikatakana = 0x30c1; - t.tikatakanahalfwidth = 0xff81; - t.tikeutacirclekorean = 0x3270; - t.tikeutaparenkorean = 0x3210; - t.tikeutcirclekorean = 0x3262; - t.tikeutkorean = 0x3137; - t.tikeutparenkorean = 0x3202; - t.tilde = 0x02dc; - t.tildebelowcmb = 0x0330; - t.tildecmb = 0x0303; - t.tildecomb = 0x0303; - t.tildedoublecmb = 0x0360; - t.tildeoperator = 0x223c; - t.tildeoverlaycmb = 0x0334; - t.tildeverticalcmb = 0x033e; - t.timescircle = 0x2297; - t.tipehahebrew = 0x0596; - t.tipehalefthebrew = 0x0596; - t.tippigurmukhi = 0x0a70; - t.titlocyrilliccmb = 0x0483; - t.tiwnarmenian = 0x057f; - t.tlinebelow = 0x1e6f; - t.tmonospace = 0xff54; - t.toarmenian = 0x0569; - t.tohiragana = 0x3068; - t.tokatakana = 0x30c8; - t.tokatakanahalfwidth = 0xff84; - t.tonebarextrahighmod = 0x02e5; - t.tonebarextralowmod = 0x02e9; - t.tonebarhighmod = 0x02e6; - t.tonebarlowmod = 0x02e8; - t.tonebarmidmod = 0x02e7; - t.tonefive = 0x01bd; - t.tonesix = 0x0185; - t.tonetwo = 0x01a8; - t.tonos = 0x0384; - t.tonsquare = 0x3327; - t.topatakthai = 0x0e0f; - t.tortoiseshellbracketleft = 0x3014; - t.tortoiseshellbracketleftsmall = 0xfe5d; - t.tortoiseshellbracketleftvertical = 0xfe39; - t.tortoiseshellbracketright = 0x3015; - t.tortoiseshellbracketrightsmall = 0xfe5e; - t.tortoiseshellbracketrightvertical = 0xfe3a; - t.totaothai = 0x0e15; - t.tpalatalhook = 0x01ab; - t.tparen = 0x24af; - t.trademark = 0x2122; - t.trademarksans = 0xf8ea; - t.trademarkserif = 0xf6db; - t.tretroflexhook = 0x0288; - t.triagdn = 0x25bc; - t.triaglf = 0x25c4; - t.triagrt = 0x25ba; - t.triagup = 0x25b2; - t.ts = 0x02a6; - t.tsadi = 0x05e6; - t.tsadidagesh = 0xfb46; - t.tsadidageshhebrew = 0xfb46; - t.tsadihebrew = 0x05e6; - t.tsecyrillic = 0x0446; - t.tsere = 0x05b5; - t.tsere12 = 0x05b5; - t.tsere1e = 0x05b5; - t.tsere2b = 0x05b5; - t.tserehebrew = 0x05b5; - t.tserenarrowhebrew = 0x05b5; - t.tserequarterhebrew = 0x05b5; - t.tserewidehebrew = 0x05b5; - t.tshecyrillic = 0x045b; - t.tsuperior = 0xf6f3; - t.ttabengali = 0x099f; - t.ttadeva = 0x091f; - t.ttagujarati = 0x0a9f; - t.ttagurmukhi = 0x0a1f; - t.tteharabic = 0x0679; - t.ttehfinalarabic = 0xfb67; - t.ttehinitialarabic = 0xfb68; - t.ttehmedialarabic = 0xfb69; - t.tthabengali = 0x09a0; - t.tthadeva = 0x0920; - t.tthagujarati = 0x0aa0; - t.tthagurmukhi = 0x0a20; - t.tturned = 0x0287; - t.tuhiragana = 0x3064; - t.tukatakana = 0x30c4; - t.tukatakanahalfwidth = 0xff82; - t.tusmallhiragana = 0x3063; - t.tusmallkatakana = 0x30c3; - t.tusmallkatakanahalfwidth = 0xff6f; - t.twelvecircle = 0x246b; - t.twelveparen = 0x247f; - t.twelveperiod = 0x2493; - t.twelveroman = 0x217b; - t.twentycircle = 0x2473; - t.twentyhangzhou = 0x5344; - t.twentyparen = 0x2487; - t.twentyperiod = 0x249b; - t.two = 0x0032; - t.twoarabic = 0x0662; - t.twobengali = 0x09e8; - t.twocircle = 0x2461; - t.twocircleinversesansserif = 0x278b; - t.twodeva = 0x0968; - t.twodotenleader = 0x2025; - t.twodotleader = 0x2025; - t.twodotleadervertical = 0xfe30; - t.twogujarati = 0x0ae8; - t.twogurmukhi = 0x0a68; - t.twohackarabic = 0x0662; - t.twohangzhou = 0x3022; - t.twoideographicparen = 0x3221; - t.twoinferior = 0x2082; - t.twomonospace = 0xff12; - t.twonumeratorbengali = 0x09f5; - t.twooldstyle = 0xf732; - t.twoparen = 0x2475; - t.twoperiod = 0x2489; - t.twopersian = 0x06f2; - t.tworoman = 0x2171; - t.twostroke = 0x01bb; - t.twosuperior = 0x00b2; - t.twothai = 0x0e52; - t.twothirds = 0x2154; - t.u = 0x0075; - t.uacute = 0x00fa; - t.ubar = 0x0289; - t.ubengali = 0x0989; - t.ubopomofo = 0x3128; - t.ubreve = 0x016d; - t.ucaron = 0x01d4; - t.ucircle = 0x24e4; - t.ucircumflex = 0x00fb; - t.ucircumflexbelow = 0x1e77; - t.ucyrillic = 0x0443; - t.udattadeva = 0x0951; - t.udblacute = 0x0171; - t.udblgrave = 0x0215; - t.udeva = 0x0909; - t.udieresis = 0x00fc; - t.udieresisacute = 0x01d8; - t.udieresisbelow = 0x1e73; - t.udieresiscaron = 0x01da; - t.udieresiscyrillic = 0x04f1; - t.udieresisgrave = 0x01dc; - t.udieresismacron = 0x01d6; - t.udotbelow = 0x1ee5; - t.ugrave = 0x00f9; - t.ugujarati = 0x0a89; - t.ugurmukhi = 0x0a09; - t.uhiragana = 0x3046; - t.uhookabove = 0x1ee7; - t.uhorn = 0x01b0; - t.uhornacute = 0x1ee9; - t.uhorndotbelow = 0x1ef1; - t.uhorngrave = 0x1eeb; - t.uhornhookabove = 0x1eed; - t.uhorntilde = 0x1eef; - t.uhungarumlaut = 0x0171; - t.uhungarumlautcyrillic = 0x04f3; - t.uinvertedbreve = 0x0217; - t.ukatakana = 0x30a6; - t.ukatakanahalfwidth = 0xff73; - t.ukcyrillic = 0x0479; - t.ukorean = 0x315c; - t.umacron = 0x016b; - t.umacroncyrillic = 0x04ef; - t.umacrondieresis = 0x1e7b; - t.umatragurmukhi = 0x0a41; - t.umonospace = 0xff55; - t.underscore = 0x005f; - t.underscoredbl = 0x2017; - t.underscoremonospace = 0xff3f; - t.underscorevertical = 0xfe33; - t.underscorewavy = 0xfe4f; - t.union = 0x222a; - t.universal = 0x2200; - t.uogonek = 0x0173; - t.uparen = 0x24b0; - t.upblock = 0x2580; - t.upperdothebrew = 0x05c4; - t.upsilon = 0x03c5; - t.upsilondieresis = 0x03cb; - t.upsilondieresistonos = 0x03b0; - t.upsilonlatin = 0x028a; - t.upsilontonos = 0x03cd; - t.uptackbelowcmb = 0x031d; - t.uptackmod = 0x02d4; - t.uragurmukhi = 0x0a73; - t.uring = 0x016f; - t.ushortcyrillic = 0x045e; - t.usmallhiragana = 0x3045; - t.usmallkatakana = 0x30a5; - t.usmallkatakanahalfwidth = 0xff69; - t.ustraightcyrillic = 0x04af; - t.ustraightstrokecyrillic = 0x04b1; - t.utilde = 0x0169; - t.utildeacute = 0x1e79; - t.utildebelow = 0x1e75; - t.uubengali = 0x098a; - t.uudeva = 0x090a; - t.uugujarati = 0x0a8a; - t.uugurmukhi = 0x0a0a; - t.uumatragurmukhi = 0x0a42; - t.uuvowelsignbengali = 0x09c2; - t.uuvowelsigndeva = 0x0942; - t.uuvowelsigngujarati = 0x0ac2; - t.uvowelsignbengali = 0x09c1; - t.uvowelsigndeva = 0x0941; - t.uvowelsigngujarati = 0x0ac1; - t.v = 0x0076; - t.vadeva = 0x0935; - t.vagujarati = 0x0ab5; - t.vagurmukhi = 0x0a35; - t.vakatakana = 0x30f7; - t.vav = 0x05d5; - t.vavdagesh = 0xfb35; - t.vavdagesh65 = 0xfb35; - t.vavdageshhebrew = 0xfb35; - t.vavhebrew = 0x05d5; - t.vavholam = 0xfb4b; - t.vavholamhebrew = 0xfb4b; - t.vavvavhebrew = 0x05f0; - t.vavyodhebrew = 0x05f1; - t.vcircle = 0x24e5; - t.vdotbelow = 0x1e7f; - t.vecyrillic = 0x0432; - t.veharabic = 0x06a4; - t.vehfinalarabic = 0xfb6b; - t.vehinitialarabic = 0xfb6c; - t.vehmedialarabic = 0xfb6d; - t.vekatakana = 0x30f9; - t.venus = 0x2640; - t.verticalbar = 0x007c; - t.verticallineabovecmb = 0x030d; - t.verticallinebelowcmb = 0x0329; - t.verticallinelowmod = 0x02cc; - t.verticallinemod = 0x02c8; - t.vewarmenian = 0x057e; - t.vhook = 0x028b; - t.vikatakana = 0x30f8; - t.viramabengali = 0x09cd; - t.viramadeva = 0x094d; - t.viramagujarati = 0x0acd; - t.visargabengali = 0x0983; - t.visargadeva = 0x0903; - t.visargagujarati = 0x0a83; - t.vmonospace = 0xff56; - t.voarmenian = 0x0578; - t.voicediterationhiragana = 0x309e; - t.voicediterationkatakana = 0x30fe; - t.voicedmarkkana = 0x309b; - t.voicedmarkkanahalfwidth = 0xff9e; - t.vokatakana = 0x30fa; - t.vparen = 0x24b1; - t.vtilde = 0x1e7d; - t.vturned = 0x028c; - t.vuhiragana = 0x3094; - t.vukatakana = 0x30f4; - t.w = 0x0077; - t.wacute = 0x1e83; - t.waekorean = 0x3159; - t.wahiragana = 0x308f; - t.wakatakana = 0x30ef; - t.wakatakanahalfwidth = 0xff9c; - t.wakorean = 0x3158; - t.wasmallhiragana = 0x308e; - t.wasmallkatakana = 0x30ee; - t.wattosquare = 0x3357; - t.wavedash = 0x301c; - t.wavyunderscorevertical = 0xfe34; - t.wawarabic = 0x0648; - t.wawfinalarabic = 0xfeee; - t.wawhamzaabovearabic = 0x0624; - t.wawhamzaabovefinalarabic = 0xfe86; - t.wbsquare = 0x33dd; - t.wcircle = 0x24e6; - t.wcircumflex = 0x0175; - t.wdieresis = 0x1e85; - t.wdotaccent = 0x1e87; - t.wdotbelow = 0x1e89; - t.wehiragana = 0x3091; - t.weierstrass = 0x2118; - t.wekatakana = 0x30f1; - t.wekorean = 0x315e; - t.weokorean = 0x315d; - t.wgrave = 0x1e81; - t.whitebullet = 0x25e6; - t.whitecircle = 0x25cb; - t.whitecircleinverse = 0x25d9; - t.whitecornerbracketleft = 0x300e; - t.whitecornerbracketleftvertical = 0xfe43; - t.whitecornerbracketright = 0x300f; - t.whitecornerbracketrightvertical = 0xfe44; - t.whitediamond = 0x25c7; - t.whitediamondcontainingblacksmalldiamond = 0x25c8; - t.whitedownpointingsmalltriangle = 0x25bf; - t.whitedownpointingtriangle = 0x25bd; - t.whiteleftpointingsmalltriangle = 0x25c3; - t.whiteleftpointingtriangle = 0x25c1; - t.whitelenticularbracketleft = 0x3016; - t.whitelenticularbracketright = 0x3017; - t.whiterightpointingsmalltriangle = 0x25b9; - t.whiterightpointingtriangle = 0x25b7; - t.whitesmallsquare = 0x25ab; - t.whitesmilingface = 0x263a; - t.whitesquare = 0x25a1; - t.whitestar = 0x2606; - t.whitetelephone = 0x260f; - t.whitetortoiseshellbracketleft = 0x3018; - t.whitetortoiseshellbracketright = 0x3019; - t.whiteuppointingsmalltriangle = 0x25b5; - t.whiteuppointingtriangle = 0x25b3; - t.wihiragana = 0x3090; - t.wikatakana = 0x30f0; - t.wikorean = 0x315f; - t.wmonospace = 0xff57; - t.wohiragana = 0x3092; - t.wokatakana = 0x30f2; - t.wokatakanahalfwidth = 0xff66; - t.won = 0x20a9; - t.wonmonospace = 0xffe6; - t.wowaenthai = 0x0e27; - t.wparen = 0x24b2; - t.wring = 0x1e98; - t.wsuperior = 0x02b7; - t.wturned = 0x028d; - t.wynn = 0x01bf; - t.x = 0x0078; - t.xabovecmb = 0x033d; - t.xbopomofo = 0x3112; - t.xcircle = 0x24e7; - t.xdieresis = 0x1e8d; - t.xdotaccent = 0x1e8b; - t.xeharmenian = 0x056d; - t.xi = 0x03be; - t.xmonospace = 0xff58; - t.xparen = 0x24b3; - t.xsuperior = 0x02e3; - t.y = 0x0079; - t.yaadosquare = 0x334e; - t.yabengali = 0x09af; - t.yacute = 0x00fd; - t.yadeva = 0x092f; - t.yaekorean = 0x3152; - t.yagujarati = 0x0aaf; - t.yagurmukhi = 0x0a2f; - t.yahiragana = 0x3084; - t.yakatakana = 0x30e4; - t.yakatakanahalfwidth = 0xff94; - t.yakorean = 0x3151; - t.yamakkanthai = 0x0e4e; - t.yasmallhiragana = 0x3083; - t.yasmallkatakana = 0x30e3; - t.yasmallkatakanahalfwidth = 0xff6c; - t.yatcyrillic = 0x0463; - t.ycircle = 0x24e8; - t.ycircumflex = 0x0177; - t.ydieresis = 0x00ff; - t.ydotaccent = 0x1e8f; - t.ydotbelow = 0x1ef5; - t.yeharabic = 0x064a; - t.yehbarreearabic = 0x06d2; - t.yehbarreefinalarabic = 0xfbaf; - t.yehfinalarabic = 0xfef2; - t.yehhamzaabovearabic = 0x0626; - t.yehhamzaabovefinalarabic = 0xfe8a; - t.yehhamzaaboveinitialarabic = 0xfe8b; - t.yehhamzaabovemedialarabic = 0xfe8c; - t.yehinitialarabic = 0xfef3; - t.yehmedialarabic = 0xfef4; - t.yehmeeminitialarabic = 0xfcdd; - t.yehmeemisolatedarabic = 0xfc58; - t.yehnoonfinalarabic = 0xfc94; - t.yehthreedotsbelowarabic = 0x06d1; - t.yekorean = 0x3156; - t.yen = 0x00a5; - t.yenmonospace = 0xffe5; - t.yeokorean = 0x3155; - t.yeorinhieuhkorean = 0x3186; - t.yerahbenyomohebrew = 0x05aa; - t.yerahbenyomolefthebrew = 0x05aa; - t.yericyrillic = 0x044b; - t.yerudieresiscyrillic = 0x04f9; - t.yesieungkorean = 0x3181; - t.yesieungpansioskorean = 0x3183; - t.yesieungsioskorean = 0x3182; - t.yetivhebrew = 0x059a; - t.ygrave = 0x1ef3; - t.yhook = 0x01b4; - t.yhookabove = 0x1ef7; - t.yiarmenian = 0x0575; - t.yicyrillic = 0x0457; - t.yikorean = 0x3162; - t.yinyang = 0x262f; - t.yiwnarmenian = 0x0582; - t.ymonospace = 0xff59; - t.yod = 0x05d9; - t.yoddagesh = 0xfb39; - t.yoddageshhebrew = 0xfb39; - t.yodhebrew = 0x05d9; - t.yodyodhebrew = 0x05f2; - t.yodyodpatahhebrew = 0xfb1f; - t.yohiragana = 0x3088; - t.yoikorean = 0x3189; - t.yokatakana = 0x30e8; - t.yokatakanahalfwidth = 0xff96; - t.yokorean = 0x315b; - t.yosmallhiragana = 0x3087; - t.yosmallkatakana = 0x30e7; - t.yosmallkatakanahalfwidth = 0xff6e; - t.yotgreek = 0x03f3; - t.yoyaekorean = 0x3188; - t.yoyakorean = 0x3187; - t.yoyakthai = 0x0e22; - t.yoyingthai = 0x0e0d; - t.yparen = 0x24b4; - t.ypogegrammeni = 0x037a; - t.ypogegrammenigreekcmb = 0x0345; - t.yr = 0x01a6; - t.yring = 0x1e99; - t.ysuperior = 0x02b8; - t.ytilde = 0x1ef9; - t.yturned = 0x028e; - t.yuhiragana = 0x3086; - t.yuikorean = 0x318c; - t.yukatakana = 0x30e6; - t.yukatakanahalfwidth = 0xff95; - t.yukorean = 0x3160; - t.yusbigcyrillic = 0x046b; - t.yusbigiotifiedcyrillic = 0x046d; - t.yuslittlecyrillic = 0x0467; - t.yuslittleiotifiedcyrillic = 0x0469; - t.yusmallhiragana = 0x3085; - t.yusmallkatakana = 0x30e5; - t.yusmallkatakanahalfwidth = 0xff6d; - t.yuyekorean = 0x318b; - t.yuyeokorean = 0x318a; - t.yyabengali = 0x09df; - t.yyadeva = 0x095f; - t.z = 0x007a; - t.zaarmenian = 0x0566; - t.zacute = 0x017a; - t.zadeva = 0x095b; - t.zagurmukhi = 0x0a5b; - t.zaharabic = 0x0638; - t.zahfinalarabic = 0xfec6; - t.zahinitialarabic = 0xfec7; - t.zahiragana = 0x3056; - t.zahmedialarabic = 0xfec8; - t.zainarabic = 0x0632; - t.zainfinalarabic = 0xfeb0; - t.zakatakana = 0x30b6; - t.zaqefgadolhebrew = 0x0595; - t.zaqefqatanhebrew = 0x0594; - t.zarqahebrew = 0x0598; - t.zayin = 0x05d6; - t.zayindagesh = 0xfb36; - t.zayindageshhebrew = 0xfb36; - t.zayinhebrew = 0x05d6; - t.zbopomofo = 0x3117; - t.zcaron = 0x017e; - t.zcircle = 0x24e9; - t.zcircumflex = 0x1e91; - t.zcurl = 0x0291; - t.zdot = 0x017c; - t.zdotaccent = 0x017c; - t.zdotbelow = 0x1e93; - t.zecyrillic = 0x0437; - t.zedescendercyrillic = 0x0499; - t.zedieresiscyrillic = 0x04df; - t.zehiragana = 0x305c; - t.zekatakana = 0x30bc; - t.zero = 0x0030; - t.zeroarabic = 0x0660; - t.zerobengali = 0x09e6; - t.zerodeva = 0x0966; - t.zerogujarati = 0x0ae6; - t.zerogurmukhi = 0x0a66; - t.zerohackarabic = 0x0660; - t.zeroinferior = 0x2080; - t.zeromonospace = 0xff10; - t.zerooldstyle = 0xf730; - t.zeropersian = 0x06f0; - t.zerosuperior = 0x2070; - t.zerothai = 0x0e50; - t.zerowidthjoiner = 0xfeff; - t.zerowidthnonjoiner = 0x200c; - t.zerowidthspace = 0x200b; - t.zeta = 0x03b6; - t.zhbopomofo = 0x3113; - t.zhearmenian = 0x056a; - t.zhebrevecyrillic = 0x04c2; - t.zhecyrillic = 0x0436; - t.zhedescendercyrillic = 0x0497; - t.zhedieresiscyrillic = 0x04dd; - t.zihiragana = 0x3058; - t.zikatakana = 0x30b8; - t.zinorhebrew = 0x05ae; - t.zlinebelow = 0x1e95; - t.zmonospace = 0xff5a; - t.zohiragana = 0x305e; - t.zokatakana = 0x30be; - t.zparen = 0x24b5; - t.zretroflexhook = 0x0290; - t.zstroke = 0x01b6; - t.zuhiragana = 0x305a; - t.zukatakana = 0x30ba; - t[".notdef"] = 0x0000; - t.angbracketleftbig = 0x2329; - t.angbracketleftBig = 0x2329; - t.angbracketleftbigg = 0x2329; - t.angbracketleftBigg = 0x2329; - t.angbracketrightBig = 0x232a; - t.angbracketrightbig = 0x232a; - t.angbracketrightBigg = 0x232a; - t.angbracketrightbigg = 0x232a; - t.arrowhookleft = 0x21aa; - t.arrowhookright = 0x21a9; - t.arrowlefttophalf = 0x21bc; - t.arrowleftbothalf = 0x21bd; - t.arrownortheast = 0x2197; - t.arrownorthwest = 0x2196; - t.arrowrighttophalf = 0x21c0; - t.arrowrightbothalf = 0x21c1; - t.arrowsoutheast = 0x2198; - t.arrowsouthwest = 0x2199; - t.backslashbig = 0x2216; - t.backslashBig = 0x2216; - t.backslashBigg = 0x2216; - t.backslashbigg = 0x2216; - t.bardbl = 0x2016; - t.bracehtipdownleft = 0xfe37; - t.bracehtipdownright = 0xfe37; - t.bracehtipupleft = 0xfe38; - t.bracehtipupright = 0xfe38; - t.braceleftBig = 0x007b; - t.braceleftbig = 0x007b; - t.braceleftbigg = 0x007b; - t.braceleftBigg = 0x007b; - t.bracerightBig = 0x007d; - t.bracerightbig = 0x007d; - t.bracerightbigg = 0x007d; - t.bracerightBigg = 0x007d; - t.bracketleftbig = 0x005b; - t.bracketleftBig = 0x005b; - t.bracketleftbigg = 0x005b; - t.bracketleftBigg = 0x005b; - t.bracketrightBig = 0x005d; - t.bracketrightbig = 0x005d; - t.bracketrightbigg = 0x005d; - t.bracketrightBigg = 0x005d; - t.ceilingleftbig = 0x2308; - t.ceilingleftBig = 0x2308; - t.ceilingleftBigg = 0x2308; - t.ceilingleftbigg = 0x2308; - t.ceilingrightbig = 0x2309; - t.ceilingrightBig = 0x2309; - t.ceilingrightbigg = 0x2309; - t.ceilingrightBigg = 0x2309; - t.circledotdisplay = 0x2299; - t.circledottext = 0x2299; - t.circlemultiplydisplay = 0x2297; - t.circlemultiplytext = 0x2297; - t.circleplusdisplay = 0x2295; - t.circleplustext = 0x2295; - t.contintegraldisplay = 0x222e; - t.contintegraltext = 0x222e; - t.coproductdisplay = 0x2210; - t.coproducttext = 0x2210; - t.floorleftBig = 0x230a; - t.floorleftbig = 0x230a; - t.floorleftbigg = 0x230a; - t.floorleftBigg = 0x230a; - t.floorrightbig = 0x230b; - t.floorrightBig = 0x230b; - t.floorrightBigg = 0x230b; - t.floorrightbigg = 0x230b; - t.hatwide = 0x0302; - t.hatwider = 0x0302; - t.hatwidest = 0x0302; - t.intercal = 0x1d40; - t.integraldisplay = 0x222b; - t.integraltext = 0x222b; - t.intersectiondisplay = 0x22c2; - t.intersectiontext = 0x22c2; - t.logicalanddisplay = 0x2227; - t.logicalandtext = 0x2227; - t.logicalordisplay = 0x2228; - t.logicalortext = 0x2228; - t.parenleftBig = 0x0028; - t.parenleftbig = 0x0028; - t.parenleftBigg = 0x0028; - t.parenleftbigg = 0x0028; - t.parenrightBig = 0x0029; - t.parenrightbig = 0x0029; - t.parenrightBigg = 0x0029; - t.parenrightbigg = 0x0029; - t.prime = 0x2032; - t.productdisplay = 0x220f; - t.producttext = 0x220f; - t.radicalbig = 0x221a; - t.radicalBig = 0x221a; - t.radicalBigg = 0x221a; - t.radicalbigg = 0x221a; - t.radicalbt = 0x221a; - t.radicaltp = 0x221a; - t.radicalvertex = 0x221a; - t.slashbig = 0x002f; - t.slashBig = 0x002f; - t.slashBigg = 0x002f; - t.slashbigg = 0x002f; - t.summationdisplay = 0x2211; - t.summationtext = 0x2211; - t.tildewide = 0x02dc; - t.tildewider = 0x02dc; - t.tildewidest = 0x02dc; - t.uniondisplay = 0x22c3; - t.unionmultidisplay = 0x228e; - t.unionmultitext = 0x228e; - t.unionsqdisplay = 0x2294; - t.unionsqtext = 0x2294; - t.uniontext = 0x22c3; - t.vextenddouble = 0x2225; - t.vextendsingle = 0x2223; -}); -const getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { - t.space = 0x0020; - t.a1 = 0x2701; - t.a2 = 0x2702; - t.a202 = 0x2703; - t.a3 = 0x2704; - t.a4 = 0x260e; - t.a5 = 0x2706; - t.a119 = 0x2707; - t.a118 = 0x2708; - t.a117 = 0x2709; - t.a11 = 0x261b; - t.a12 = 0x261e; - t.a13 = 0x270c; - t.a14 = 0x270d; - t.a15 = 0x270e; - t.a16 = 0x270f; - t.a105 = 0x2710; - t.a17 = 0x2711; - t.a18 = 0x2712; - t.a19 = 0x2713; - t.a20 = 0x2714; - t.a21 = 0x2715; - t.a22 = 0x2716; - t.a23 = 0x2717; - t.a24 = 0x2718; - t.a25 = 0x2719; - t.a26 = 0x271a; - t.a27 = 0x271b; - t.a28 = 0x271c; - t.a6 = 0x271d; - t.a7 = 0x271e; - t.a8 = 0x271f; - t.a9 = 0x2720; - t.a10 = 0x2721; - t.a29 = 0x2722; - t.a30 = 0x2723; - t.a31 = 0x2724; - t.a32 = 0x2725; - t.a33 = 0x2726; - t.a34 = 0x2727; - t.a35 = 0x2605; - t.a36 = 0x2729; - t.a37 = 0x272a; - t.a38 = 0x272b; - t.a39 = 0x272c; - t.a40 = 0x272d; - t.a41 = 0x272e; - t.a42 = 0x272f; - t.a43 = 0x2730; - t.a44 = 0x2731; - t.a45 = 0x2732; - t.a46 = 0x2733; - t.a47 = 0x2734; - t.a48 = 0x2735; - t.a49 = 0x2736; - t.a50 = 0x2737; - t.a51 = 0x2738; - t.a52 = 0x2739; - t.a53 = 0x273a; - t.a54 = 0x273b; - t.a55 = 0x273c; - t.a56 = 0x273d; - t.a57 = 0x273e; - t.a58 = 0x273f; - t.a59 = 0x2740; - t.a60 = 0x2741; - t.a61 = 0x2742; - t.a62 = 0x2743; - t.a63 = 0x2744; - t.a64 = 0x2745; - t.a65 = 0x2746; - t.a66 = 0x2747; - t.a67 = 0x2748; - t.a68 = 0x2749; - t.a69 = 0x274a; - t.a70 = 0x274b; - t.a71 = 0x25cf; - t.a72 = 0x274d; - t.a73 = 0x25a0; - t.a74 = 0x274f; - t.a203 = 0x2750; - t.a75 = 0x2751; - t.a204 = 0x2752; - t.a76 = 0x25b2; - t.a77 = 0x25bc; - t.a78 = 0x25c6; - t.a79 = 0x2756; - t.a81 = 0x25d7; - t.a82 = 0x2758; - t.a83 = 0x2759; - t.a84 = 0x275a; - t.a97 = 0x275b; - t.a98 = 0x275c; - t.a99 = 0x275d; - t.a100 = 0x275e; - t.a101 = 0x2761; - t.a102 = 0x2762; - t.a103 = 0x2763; - t.a104 = 0x2764; - t.a106 = 0x2765; - t.a107 = 0x2766; - t.a108 = 0x2767; - t.a112 = 0x2663; - t.a111 = 0x2666; - t.a110 = 0x2665; - t.a109 = 0x2660; - t.a120 = 0x2460; - t.a121 = 0x2461; - t.a122 = 0x2462; - t.a123 = 0x2463; - t.a124 = 0x2464; - t.a125 = 0x2465; - t.a126 = 0x2466; - t.a127 = 0x2467; - t.a128 = 0x2468; - t.a129 = 0x2469; - t.a130 = 0x2776; - t.a131 = 0x2777; - t.a132 = 0x2778; - t.a133 = 0x2779; - t.a134 = 0x277a; - t.a135 = 0x277b; - t.a136 = 0x277c; - t.a137 = 0x277d; - t.a138 = 0x277e; - t.a139 = 0x277f; - t.a140 = 0x2780; - t.a141 = 0x2781; - t.a142 = 0x2782; - t.a143 = 0x2783; - t.a144 = 0x2784; - t.a145 = 0x2785; - t.a146 = 0x2786; - t.a147 = 0x2787; - t.a148 = 0x2788; - t.a149 = 0x2789; - t.a150 = 0x278a; - t.a151 = 0x278b; - t.a152 = 0x278c; - t.a153 = 0x278d; - t.a154 = 0x278e; - t.a155 = 0x278f; - t.a156 = 0x2790; - t.a157 = 0x2791; - t.a158 = 0x2792; - t.a159 = 0x2793; - t.a160 = 0x2794; - t.a161 = 0x2192; - t.a163 = 0x2194; - t.a164 = 0x2195; - t.a196 = 0x2798; - t.a165 = 0x2799; - t.a192 = 0x279a; - t.a166 = 0x279b; - t.a167 = 0x279c; - t.a168 = 0x279d; - t.a169 = 0x279e; - t.a170 = 0x279f; - t.a171 = 0x27a0; - t.a172 = 0x27a1; - t.a173 = 0x27a2; - t.a162 = 0x27a3; - t.a174 = 0x27a4; - t.a175 = 0x27a5; - t.a176 = 0x27a6; - t.a177 = 0x27a7; - t.a178 = 0x27a8; - t.a179 = 0x27a9; - t.a193 = 0x27aa; - t.a180 = 0x27ab; - t.a199 = 0x27ac; - t.a181 = 0x27ad; - t.a200 = 0x27ae; - t.a182 = 0x27af; - t.a201 = 0x27b1; - t.a183 = 0x27b2; - t.a184 = 0x27b3; - t.a197 = 0x27b4; - t.a185 = 0x27b5; - t.a194 = 0x27b6; - t.a198 = 0x27b7; - t.a186 = 0x27b8; - t.a195 = 0x27b9; - t.a187 = 0x27ba; - t.a188 = 0x27bb; - t.a189 = 0x27bc; - t.a190 = 0x27bd; - t.a191 = 0x27be; - t.a89 = 0x2768; - t.a90 = 0x2769; - t.a93 = 0x276a; - t.a94 = 0x276b; - t.a91 = 0x276c; - t.a92 = 0x276d; - t.a205 = 0x276e; - t.a85 = 0x276f; - t.a206 = 0x2770; - t.a86 = 0x2771; - t.a87 = 0x2772; - t.a88 = 0x2773; - t.a95 = 0x2774; - t.a96 = 0x2775; - t[".notdef"] = 0x0000; -}); - -;// ./src/core/unicode.js - -const getSpecialPUASymbols = getLookupTableFactory(function (t) { - t[63721] = 0x00a9; - t[63193] = 0x00a9; - t[63720] = 0x00ae; - t[63194] = 0x00ae; - t[63722] = 0x2122; - t[63195] = 0x2122; - t[63729] = 0x23a7; - t[63730] = 0x23a8; - t[63731] = 0x23a9; - t[63740] = 0x23ab; - t[63741] = 0x23ac; - t[63742] = 0x23ad; - t[63726] = 0x23a1; - t[63727] = 0x23a2; - t[63728] = 0x23a3; - t[63737] = 0x23a4; - t[63738] = 0x23a5; - t[63739] = 0x23a6; - t[63723] = 0x239b; - t[63724] = 0x239c; - t[63725] = 0x239d; - t[63734] = 0x239e; - t[63735] = 0x239f; - t[63736] = 0x23a0; -}); -function mapSpecialUnicodeValues(code) { - if (code >= 0xfff0 && code <= 0xffff) { - return 0; - } else if (code >= 0xf600 && code <= 0xf8ff) { - return getSpecialPUASymbols()[code] || code; - } else if (code === 0x00ad) { - return 0x002d; - } - return code; -} -function getUnicodeForGlyph(name, glyphsUnicodeMap) { - let unicode = glyphsUnicodeMap[name]; - if (unicode !== undefined) { - return unicode; - } - if (!name) { - return -1; - } - if (name[0] === "u") { - const nameLen = name.length; - let hexStr; - if (nameLen === 7 && name[1] === "n" && name[2] === "i") { - hexStr = name.substring(3); - } else if (nameLen >= 5 && nameLen <= 7) { - hexStr = name.substring(1); - } else { - return -1; - } - if (hexStr === hexStr.toUpperCase()) { - unicode = parseInt(hexStr, 16); - if (unicode >= 0) { - return unicode; - } - } - } - return -1; -} -const UnicodeRanges = [[0x0000, 0x007f], [0x0080, 0x00ff], [0x0100, 0x017f], [0x0180, 0x024f], [0x0250, 0x02af, 0x1d00, 0x1d7f, 0x1d80, 0x1dbf], [0x02b0, 0x02ff, 0xa700, 0xa71f], [0x0300, 0x036f, 0x1dc0, 0x1dff], [0x0370, 0x03ff], [0x2c80, 0x2cff], [0x0400, 0x04ff, 0x0500, 0x052f, 0x2de0, 0x2dff, 0xa640, 0xa69f], [0x0530, 0x058f], [0x0590, 0x05ff], [0xa500, 0xa63f], [0x0600, 0x06ff, 0x0750, 0x077f], [0x07c0, 0x07ff], [0x0900, 0x097f], [0x0980, 0x09ff], [0x0a00, 0x0a7f], [0x0a80, 0x0aff], [0x0b00, 0x0b7f], [0x0b80, 0x0bff], [0x0c00, 0x0c7f], [0x0c80, 0x0cff], [0x0d00, 0x0d7f], [0x0e00, 0x0e7f], [0x0e80, 0x0eff], [0x10a0, 0x10ff, 0x2d00, 0x2d2f], [0x1b00, 0x1b7f], [0x1100, 0x11ff], [0x1e00, 0x1eff, 0x2c60, 0x2c7f, 0xa720, 0xa7ff], [0x1f00, 0x1fff], [0x2000, 0x206f, 0x2e00, 0x2e7f], [0x2070, 0x209f], [0x20a0, 0x20cf], [0x20d0, 0x20ff], [0x2100, 0x214f], [0x2150, 0x218f], [0x2190, 0x21ff, 0x27f0, 0x27ff, 0x2900, 0x297f, 0x2b00, 0x2bff], [0x2200, 0x22ff, 0x2a00, 0x2aff, 0x27c0, 0x27ef, 0x2980, 0x29ff], [0x2300, 0x23ff], [0x2400, 0x243f], [0x2440, 0x245f], [0x2460, 0x24ff], [0x2500, 0x257f], [0x2580, 0x259f], [0x25a0, 0x25ff], [0x2600, 0x26ff], [0x2700, 0x27bf], [0x3000, 0x303f], [0x3040, 0x309f], [0x30a0, 0x30ff, 0x31f0, 0x31ff], [0x3100, 0x312f, 0x31a0, 0x31bf], [0x3130, 0x318f], [0xa840, 0xa87f], [0x3200, 0x32ff], [0x3300, 0x33ff], [0xac00, 0xd7af], [0xd800, 0xdfff], [0x10900, 0x1091f], [0x4e00, 0x9fff, 0x2e80, 0x2eff, 0x2f00, 0x2fdf, 0x2ff0, 0x2fff, 0x3400, 0x4dbf, 0x20000, 0x2a6df, 0x3190, 0x319f], [0xe000, 0xf8ff], [0x31c0, 0x31ef, 0xf900, 0xfaff, 0x2f800, 0x2fa1f], [0xfb00, 0xfb4f], [0xfb50, 0xfdff], [0xfe20, 0xfe2f], [0xfe10, 0xfe1f], [0xfe50, 0xfe6f], [0xfe70, 0xfeff], [0xff00, 0xffef], [0xfff0, 0xffff], [0x0f00, 0x0fff], [0x0700, 0x074f], [0x0780, 0x07bf], [0x0d80, 0x0dff], [0x1000, 0x109f], [0x1200, 0x137f, 0x1380, 0x139f, 0x2d80, 0x2ddf], [0x13a0, 0x13ff], [0x1400, 0x167f], [0x1680, 0x169f], [0x16a0, 0x16ff], [0x1780, 0x17ff], [0x1800, 0x18af], [0x2800, 0x28ff], [0xa000, 0xa48f], [0x1700, 0x171f, 0x1720, 0x173f, 0x1740, 0x175f, 0x1760, 0x177f], [0x10300, 0x1032f], [0x10330, 0x1034f], [0x10400, 0x1044f], [0x1d000, 0x1d0ff, 0x1d100, 0x1d1ff, 0x1d200, 0x1d24f], [0x1d400, 0x1d7ff], [0xff000, 0xffffd], [0xfe00, 0xfe0f, 0xe0100, 0xe01ef], [0xe0000, 0xe007f], [0x1900, 0x194f], [0x1950, 0x197f], [0x1980, 0x19df], [0x1a00, 0x1a1f], [0x2c00, 0x2c5f], [0x2d30, 0x2d7f], [0x4dc0, 0x4dff], [0xa800, 0xa82f], [0x10000, 0x1007f, 0x10080, 0x100ff, 0x10100, 0x1013f], [0x10140, 0x1018f], [0x10380, 0x1039f], [0x103a0, 0x103df], [0x10450, 0x1047f], [0x10480, 0x104af], [0x10800, 0x1083f], [0x10a00, 0x10a5f], [0x1d300, 0x1d35f], [0x12000, 0x123ff, 0x12400, 0x1247f], [0x1d360, 0x1d37f], [0x1b80, 0x1bbf], [0x1c00, 0x1c4f], [0x1c50, 0x1c7f], [0xa880, 0xa8df], [0xa900, 0xa92f], [0xa930, 0xa95f], [0xaa00, 0xaa5f], [0x10190, 0x101cf], [0x101d0, 0x101ff], [0x102a0, 0x102df, 0x10280, 0x1029f, 0x10920, 0x1093f], [0x1f030, 0x1f09f, 0x1f000, 0x1f02f]]; -function getUnicodeRangeFor(value, lastPosition = -1) { - if (lastPosition !== -1) { - const range = UnicodeRanges[lastPosition]; - for (let i = 0, ii = range.length; i < ii; i += 2) { - if (value >= range[i] && value <= range[i + 1]) { - return lastPosition; - } - } - } - for (let i = 0, ii = UnicodeRanges.length; i < ii; i++) { - const range = UnicodeRanges[i]; - for (let j = 0, jj = range.length; j < jj; j += 2) { - if (value >= range[j] && value <= range[j + 1]) { - return i; - } - } - } - return -1; -} -const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); -const CategoryCache = new Map(); -function getCharUnicodeCategory(char) { - const cachedCategory = CategoryCache.get(char); - if (cachedCategory) { - return cachedCategory; - } - const groups = char.match(SpecialCharRegExp); - const category = { - isWhitespace: !!groups?.[1], - isZeroWidthDiacritic: !!groups?.[2], - isInvisibleFormatMark: !!groups?.[3] - }; - CategoryCache.set(char, category); - return category; -} -function clearUnicodeCaches() { - CategoryCache.clear(); -} - -;// ./src/core/fonts_utils.js - - - - - -const SEAC_ANALYSIS_ENABLED = true; -const FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; -const MacStandardGlyphOrdering = [".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron", "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute", "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters", "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"]; -function recoverGlyphName(name, glyphsUnicodeMap) { - if (glyphsUnicodeMap[name] !== undefined) { - return name; - } - const unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); - if (unicode !== -1) { - for (const key in glyphsUnicodeMap) { - if (glyphsUnicodeMap[key] === unicode) { - return key; - } - } - } - info("Unable to recover a standard glyph name for: " + name); - return name; -} -function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { - const charCodeToGlyphId = Object.create(null); - let glyphId, charCode, baseEncoding; - const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - if (properties.isInternalFont) { - baseEncoding = builtInEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; - } - } else if (properties.baseEncodingName) { - baseEncoding = getEncoding(properties.baseEncodingName); - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; - } - } else if (isSymbolicFont) { - for (charCode in builtInEncoding) { - charCodeToGlyphId[charCode] = builtInEncoding[charCode]; - } - } else { - baseEncoding = StandardEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; - } - } - const differences = properties.differences; - let glyphsUnicodeMap; - if (differences) { - for (charCode in differences) { - const glyphName = differences[charCode]; - glyphId = glyphNames.indexOf(glyphName); - if (glyphId === -1) { - if (!glyphsUnicodeMap) { - glyphsUnicodeMap = getGlyphsUnicode(); - } - const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); - if (standardGlyphName !== glyphName) { - glyphId = glyphNames.indexOf(standardGlyphName); - } - } - charCodeToGlyphId[charCode] = glyphId >= 0 ? glyphId : 0; - } - } - return charCodeToGlyphId; -} -function normalizeFontName(name) { - return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); -} -const getVerticalPresentationForm = getLookupTableFactory(t => { - t[0x2013] = 0xfe32; - t[0x2014] = 0xfe31; - t[0x2025] = 0xfe30; - t[0x2026] = 0xfe19; - t[0x3001] = 0xfe11; - t[0x3002] = 0xfe12; - t[0x3008] = 0xfe3f; - t[0x3009] = 0xfe40; - t[0x300a] = 0xfe3d; - t[0x300b] = 0xfe3e; - t[0x300c] = 0xfe41; - t[0x300d] = 0xfe42; - t[0x300e] = 0xfe43; - t[0x300f] = 0xfe44; - t[0x3010] = 0xfe3b; - t[0x3011] = 0xfe3c; - t[0x3014] = 0xfe39; - t[0x3015] = 0xfe3a; - t[0x3016] = 0xfe17; - t[0x3017] = 0xfe18; - t[0xfe4f] = 0xfe34; - t[0xff01] = 0xfe15; - t[0xff08] = 0xfe35; - t[0xff09] = 0xfe36; - t[0xff0c] = 0xfe10; - t[0xff1a] = 0xfe13; - t[0xff1b] = 0xfe14; - t[0xff1f] = 0xfe16; - t[0xff3b] = 0xfe47; - t[0xff3d] = 0xfe48; - t[0xff3f] = 0xfe33; - t[0xff5b] = 0xfe37; - t[0xff5d] = 0xfe38; -}); -const MAX_SIZE_TO_COMPILE = 1000; -function compileType3Glyph({ - data: img, - width, - height -}) { - if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { - return null; - } - const POINT_TO_PROCESS_LIMIT = 1000; - const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); - const width1 = width + 1; - const points = new Uint8Array(width1 * (height + 1)); - let i, j, j0; - const lineSize = width + 7 & ~7; - const data = new Uint8Array(lineSize * height); - let pos = 0; - for (const elem of img) { - let mask = 128; - while (mask > 0) { - data[pos++] = elem & mask ? 0 : 255; - mask >>= 1; - } - } - let count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - j0 = i * width1; - if (data[pos - lineSize] !== data[pos]) { - points[j0] = data[pos] ? 1 : 8; - ++count; - } - let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); - for (j = 1; j < width; j++) { - sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j0 + j] = 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); - const pathBuf = []; - const { - a, - b, - c, - d, - e, - f - } = new DOMMatrix().scaleSelf(1 / width, -1 / height).translateSelf(0, -height); - for (i = 0; count && i <= height; i++) { - let p = i * width1; - const end = p + width; - while (p < end && !points[p]) { - p++; - } - if (p === end) { - continue; - } - let x = p % width1; - let y = i; - pathBuf.push(DrawOPS.moveTo, a * x + c * y + e, b * x + d * y + f); - const p0 = p; - let type = points[p]; - do { - const step = steps[type]; - do { - p += step; - } while (!points[p]); - const pp = points[p]; - if (pp !== 5 && pp !== 10) { - type = pp; - points[p] = 0; - } else { - type = pp & 0x33 * type >> 4; - points[p] &= type >> 2 | type << 2; - } - x = p % width1; - y = p / width1 | 0; - pathBuf.push(DrawOPS.lineTo, a * x + c * y + e, b * x + d * y + f); - if (!points[p]) { - --count; - } - } while (p0 !== p); - --i; - } - return [OPS.rawFillPath, [new Float32Array(pathBuf)], new Float32Array([0, 0, width, height])]; -} - -;// ./src/core/charsets.js -const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; -const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; -const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; - -;// ./src/core/cff_parser.js - - - - -const MAX_SUBR_NESTING = 10; -const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; -const NUM_STANDARD_CFF_STRINGS = 391; -const CharstringValidationData = [null, { - id: "hstem", - min: 2, - stackClearing: true, - stem: true -}, null, { - id: "vstem", - min: 2, - stackClearing: true, - stem: true -}, { - id: "vmoveto", - min: 1, - stackClearing: true -}, { - id: "rlineto", - min: 2, - resetStack: true -}, { - id: "hlineto", - min: 1, - resetStack: true -}, { - id: "vlineto", - min: 1, - resetStack: true -}, { - id: "rrcurveto", - min: 6, - resetStack: true -}, null, { - id: "callsubr", - min: 1, - undefStack: true -}, { - id: "return", - min: 0, - undefStack: true -}, null, null, { - id: "endchar", - min: 0, - stackClearing: true -}, null, null, null, { - id: "hstemhm", - min: 2, - stackClearing: true, - stem: true -}, { - id: "hintmask", - min: 0, - stackClearing: true -}, { - id: "cntrmask", - min: 0, - stackClearing: true -}, { - id: "rmoveto", - min: 2, - stackClearing: true -}, { - id: "hmoveto", - min: 1, - stackClearing: true -}, { - id: "vstemhm", - min: 2, - stackClearing: true, - stem: true -}, { - id: "rcurveline", - min: 8, - resetStack: true -}, { - id: "rlinecurve", - min: 8, - resetStack: true -}, { - id: "vvcurveto", - min: 4, - resetStack: true -}, { - id: "hhcurveto", - min: 4, - resetStack: true -}, null, { - id: "callgsubr", - min: 1, - undefStack: true -}, { - id: "vhcurveto", - min: 4, - resetStack: true -}, { - id: "hvcurveto", - min: 4, - resetStack: true -}]; -const CharstringValidationData12 = [null, null, null, { - id: "and", - min: 2, - stackDelta: -1 -}, { - id: "or", - min: 2, - stackDelta: -1 -}, { - id: "not", - min: 1, - stackDelta: 0 -}, null, null, null, { - id: "abs", - min: 1, - stackDelta: 0 -}, { - id: "add", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } -}, { - id: "sub", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } -}, { - id: "div", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } -}, null, { - id: "neg", - min: 1, - stackDelta: 0, - stackFn(stack, index) { - stack[index - 1] = -stack[index - 1]; - } -}, { - id: "eq", - min: 2, - stackDelta: -1 -}, null, null, { - id: "drop", - min: 1, - stackDelta: -1 -}, null, { - id: "put", - min: 2, - stackDelta: -2 -}, { - id: "get", - min: 1, - stackDelta: 0 -}, { - id: "ifelse", - min: 4, - stackDelta: -3 -}, { - id: "random", - min: 0, - stackDelta: 1 -}, { - id: "mul", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } -}, null, { - id: "sqrt", - min: 1, - stackDelta: 0 -}, { - id: "dup", - min: 1, - stackDelta: 1 -}, { - id: "exch", - min: 2, - stackDelta: 0 -}, { - id: "index", - min: 2, - stackDelta: 0 -}, { - id: "roll", - min: 3, - stackDelta: -2 -}, null, null, null, { - id: "hflex", - min: 7, - resetStack: true -}, { - id: "flex", - min: 13, - resetStack: true -}, { - id: "hflex1", - min: 9, - resetStack: true -}, { - id: "flex1", - min: 11, - resetStack: true -}]; -class CFFParser { - constructor(file, properties, seacAnalysisEnabled) { - this.bytes = file.getBytes(); - this.properties = properties; - this.seacAnalysisEnabled = !!seacAnalysisEnabled; - } - parse() { - const properties = this.properties; - const cff = new CFF(); - this.cff = cff; - const header = this.parseHeader(); - const nameIndex = this.parseIndex(header.endPos); - const topDictIndex = this.parseIndex(nameIndex.endPos); - const stringIndex = this.parseIndex(topDictIndex.endPos); - const globalSubrIndex = this.parseIndex(stringIndex.endPos); - const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - this.parsePrivateDict(cff.topDict); - cff.isCIDFont = topDict.hasName("ROS"); - const charStringOffset = topDict.getByName("CharStrings"); - const charStringIndex = this.parseIndex(charStringOffset).obj; - const fontMatrix = topDict.getByName("FontMatrix"); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - const fontBBox = topDict.getByName("FontBBox"); - if (fontBBox) { - properties.ascent = Math.max(fontBBox[3], fontBBox[1]); - properties.descent = Math.min(fontBBox[1], fontBBox[3]); - properties.ascentScaled = true; - } - let charset, encoding; - if (cff.isCIDFont) { - const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; - for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - const dictRaw = fdArrayIndex.get(i); - const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - encoding = null; - charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); - } else { - charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); - } - cff.charset = charset; - cff.encoding = encoding; - const charStringsAndSeacs = this.parseCharStrings({ - charStrings: charStringIndex, - localSubrIndex: topDict.privateDict.subrsIndex, - globalSubrIndex: globalSubrIndex.obj, - fdSelect: cff.fdSelect, - fdArray: cff.fdArray, - privateDict: topDict.privateDict - }); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - return cff; - } - parseHeader() { - let bytes = this.bytes; - const bytesLength = bytes.length; - let offset = 0; - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - throw new FormatError("Invalid CFF header"); - } - if (offset !== 0) { - info("cff data is shifted"); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - const major = bytes[0]; - const minor = bytes[1]; - const hdrSize = bytes[2]; - const offSize = bytes[3]; - const header = new CFFHeader(major, minor, hdrSize, offSize); - return { - obj: header, - endPos: hdrSize - }; - } - parseDict(dict) { - let pos = 0; - function parseOperand() { - let value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(); - } else if (value === 28) { - value = readInt16(dict, pos); - pos += 2; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = value << 8 | dict[pos++]; - value = value << 8 | dict[pos++]; - value = value << 8 | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return (value - 247) * 256 + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } - warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); - return NaN; - } - function parseFloatOperand() { - let str = ""; - const eof = 15; - const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; - const length = dict.length; - while (pos < length) { - const b = dict[pos++]; - const b1 = b >> 4; - const b2 = b & 15; - if (b1 === eof) { - break; - } - str += lookup[b1]; - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - let operands = []; - const entries = []; - pos = 0; - const end = dict.length; - while (pos < end) { - let b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = b << 8 | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - } - parseIndex(pos) { - const cffIndex = new CFFIndex(); - const bytes = this.bytes; - const count = bytes[pos++] << 8 | bytes[pos++]; - const offsets = []; - let end = pos; - let i, ii; - if (count !== 0) { - const offsetSize = bytes[pos++]; - const startPos = pos + (count + 1) * offsetSize - 1; - for (i = 0, ii = count + 1; i < ii; ++i) { - let offset = 0; - for (let j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - const offsetStart = offsets[i]; - const offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return { - obj: cffIndex, - endPos: end - }; - } - parseNameIndex(index) { - const names = []; - for (let i = 0, ii = index.count; i < ii; ++i) { - const name = index.get(i); - names.push(bytesToString(name)); - } - return names; - } - parseStringIndex(index) { - const strings = new CFFStrings(); - for (let i = 0, ii = index.count; i < ii; ++i) { - const data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - } - createDict(Type, dict, strings) { - const cffDict = new Type(strings); - for (const [key, value] of dict) { - cffDict.setByKey(key, value); - } - return cffDict; - } - parseCharString(state, data, localSubrIndex, globalSubrIndex) { - if (!data || state.callDepth > MAX_SUBR_NESTING) { - return false; - } - let stackSize = state.stackSize; - const stack = state.stack; - let length = data.length; - for (let j = 0; j < length;) { - const value = data[j++]; - let validationCommand = null; - if (value === 12) { - const q = data[j++]; - if (q === 0) { - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { - stack[stackSize] = readInt16(data, j); - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (this.seacAnalysisEnabled) { - state.seac = stack.slice(stackSize, stackSize + 4); - return false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { - stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; - j++; - stackSize++; - } else if (value === 255) { - stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - state.hints += stackSize >> 1; - if (state.hints === 0) { - data.copyWithin(j - 1, j, -1); - j -= 1; - length -= 1; - continue; - } - j += state.hints + 7 >> 3; - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else if (value === 10 || value === 29) { - const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; - if (!subrsIndex) { - validationCommand = CharstringValidationData[value]; - warn("Missing subrsIndex for " + validationCommand.id); - return false; - } - let bias = 32768; - if (subrsIndex.count < 1240) { - bias = 107; - } else if (subrsIndex.count < 33900) { - bias = 1131; - } - const subrNumber = stack[--stackSize] + bias; - if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { - validationCommand = CharstringValidationData[value]; - warn("Out of bounds subrIndex for " + validationCommand.id); - return false; - } - state.stackSize = stackSize; - state.callDepth++; - const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); - if (!valid) { - return false; - } - state.callDepth--; - stackSize = state.stackSize; - continue; - } else if (value === 11) { - state.stackSize = stackSize; - return true; - } else if (value === 0 && j === data.length) { - data[j - 1] = 14; - validationCommand = CharstringValidationData[14]; - } else if (value === 9) { - data.copyWithin(j - 1, j, -1); - j -= 1; - length -= 1; - continue; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - state.hints += stackSize >> 1; - if (value === 3 || value === 23) { - state.hasVStems = true; - } else if (state.hasVStems && (value === 1 || value === 18)) { - warn("CFF stem hints are in wrong order"); - data[j - 1] = value === 1 ? 3 : 23; - } - } - if ("min" in validationCommand) { - if (!state.undefStack && stackSize < validationCommand.min) { - warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); - if (stackSize === 0) { - data[j - 1] = 14; - return true; - } - return false; - } - } - if (state.firstStackClearing && validationCommand.stackClearing) { - state.firstStackClearing = false; - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - stackSize %= 2; - } else if (stackSize > 1) { - warn("Found too many parameters for stack-clearing command"); - } - if (stackSize > 0) { - state.width = stack[stackSize - 1]; - } - } - if ("stackDelta" in validationCommand) { - if ("stackFn" in validationCommand) { - validationCommand.stackFn(stack, stackSize); - } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - state.undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - state.undefStack = true; - state.firstStackClearing = false; - } - } - } - if (length < data.length) { - data.fill(14, length); - } - state.stackSize = stackSize; - return true; - } - parseCharStrings({ - charStrings, - localSubrIndex, - globalSubrIndex, - fdSelect, - fdArray, - privateDict - }) { - const seacs = []; - const widths = []; - const count = charStrings.count; - for (let i = 0; i < count; i++) { - const charstring = charStrings.get(i); - const state = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: true, - hints: 0, - firstStackClearing: true, - seac: null, - width: null, - hasVStems: false - }; - let valid = true; - let localSubrToUse = null; - let privateDictToUse = privateDict; - if (fdSelect && fdArray.length) { - const fdIndex = fdSelect.getFDIndex(i); - if (fdIndex === -1) { - warn("Glyph index is not in fd select."); - valid = false; - } - if (fdIndex >= fdArray.length) { - warn("Invalid fd index for glyph index."); - valid = false; - } - if (valid) { - privateDictToUse = fdArray[fdIndex].privateDict; - localSubrToUse = privateDictToUse.subrsIndex; - } - } else if (localSubrIndex) { - localSubrToUse = localSubrIndex; - } - if (valid) { - valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); - } - if (state.width !== null) { - const nominalWidth = privateDictToUse.getByName("nominalWidthX"); - widths[i] = nominalWidth + state.width; - } else { - const defaultWidth = privateDictToUse.getByName("defaultWidthX"); - widths[i] = defaultWidth; - } - if (state.seac !== null) { - seacs[i] = state.seac; - } - if (!valid) { - charStrings.set(i, new Uint8Array([14])); - } - } - return { - charStrings, - seacs, - widths - }; - } - emptyPrivateDictionary(parentDict) { - const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - } - parsePrivateDict(parentDict) { - if (!parentDict.hasName("Private")) { - this.emptyPrivateDictionary(parentDict); - return; - } - const privateOffset = parentDict.getByName("Private"); - if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName("Private"); - return; - } - const size = privateOffset[0]; - const offset = privateOffset[1]; - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - const privateDictEnd = offset + size; - const dictData = this.bytes.subarray(offset, privateDictEnd); - const dict = this.parseDict(dictData); - const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); - parentDict.privateDict = privateDict; - if (privateDict.getByName("ExpansionFactor") === 0) { - privateDict.setByName("ExpansionFactor", 0.06); - } - if (!privateDict.getByName("Subrs")) { - return; - } - const subrsOffset = privateDict.getByName("Subrs"); - const relativeOffset = offset + subrsOffset; - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - const subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; - } - parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); - } - const bytes = this.bytes; - const start = pos; - const format = bytes[pos++]; - const charset = [cid ? 0 : ".notdef"]; - let id, count, i; - length -= 1; - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = bytes[pos++] << 8 | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } - break; - case 1: - while (charset.length <= length) { - id = bytes[pos++] << 8 | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - case 2: - while (charset.length <= length) { - id = bytes[pos++] << 8 | bytes[pos++]; - count = bytes[pos++] << 8 | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - default: - throw new FormatError("Unknown charset format"); - } - const end = pos; - const raw = bytes.subarray(start, end); - return new CFFCharset(false, format, charset, raw); - } - parseEncoding(pos, properties, strings, charset) { - const encoding = Object.create(null); - const bytes = this.bytes; - let predefined = false; - let format, i, ii; - let raw = null; - function readSupplement() { - const supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - const code = bytes[pos++]; - const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); - } - } - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - const baseEncoding = pos ? ExpertEncoding : StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - const index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; - } - } - } else { - const dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - const glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - case 1: - const rangesCount = bytes[pos++]; - let gid = 1; - for (i = 0; i < rangesCount; i++) { - const start = bytes[pos++]; - const left = bytes[pos++]; - for (let j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - default: - throw new FormatError(`Unknown encoding format: ${format} in CFF`); - } - const dataEnd = pos; - if (format & 0x80) { - bytes[dataStart] &= 0x7f; - readSupplement(); - } - raw = bytes.subarray(dataStart, dataEnd); - } - format &= 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); - } - parseFDSelect(pos, length) { - const bytes = this.bytes; - const format = bytes[pos++]; - const fdSelect = []; - let i; - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - const id = bytes[pos++]; - fdSelect.push(id); - } - break; - case 3: - const rangesCount = bytes[pos++] << 8 | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - let first = bytes[pos++] << 8 | bytes[pos++]; - if (i === 0 && first !== 0) { - warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); - first = 0; - } - const fdIndex = bytes[pos++]; - const next = bytes[pos] << 8 | bytes[pos + 1]; - for (let j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - pos += 2; - break; - default: - throw new FormatError(`parseFDSelect: Unknown format "${format}".`); - } - if (fdSelect.length !== length) { - throw new FormatError("parseFDSelect: Invalid font data."); - } - return new CFFFDSelect(format, fdSelect); - } -} -class CFF { - constructor() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - this.isCIDFont = false; - } - duplicateFirstGlyph() { - if (this.charStrings.count >= 65535) { - warn("Not enough space in charstrings to duplicate first glyph."); - return; - } - const glyphZero = this.charStrings.get(0); - this.charStrings.add(glyphZero); - if (this.isCIDFont) { - this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); - } - } - hasGlyphId(id) { - if (id < 0 || id >= this.charStrings.count) { - return false; - } - const glyph = this.charStrings.get(id); - return glyph.length > 0; - } -} -class CFFHeader { - constructor(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; - } -} -class CFFStrings { - constructor() { - this.strings = []; - } - get(index) { - if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { - return CFFStandardStrings[index]; - } - if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { - return this.strings[index - NUM_STANDARD_CFF_STRINGS]; - } - return CFFStandardStrings[0]; - } - getSID(str) { - let index = CFFStandardStrings.indexOf(str); - if (index !== -1) { - return index; - } - index = this.strings.indexOf(str); - if (index !== -1) { - return index + NUM_STANDARD_CFF_STRINGS; - } - return -1; - } - add(value) { - this.strings.push(value); - } - get count() { - return this.strings.length; - } -} -class CFFIndex { - constructor() { - this.objects = []; - this.length = 0; - } - add(data) { - this.length += data.length; - this.objects.push(data); - } - set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; - } - get(index) { - return this.objects[index]; - } - get count() { - return this.objects.length; - } -} -class CFFDict { - constructor(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = Object.create(null); - } - setByKey(key, value) { - if (!(key in this.keyToNameMap)) { - return false; - } - if (value.length === 0) { - return true; - } - for (const val of value) { - if (isNaN(val)) { - warn(`Invalid CFFDict value: "${value}" for key "${key}".`); - return true; - } - } - const type = this.types[key]; - if (type === "num" || type === "sid" || type === "offset") { - value = value[0]; - } - this.values[key] = value; - return true; - } - setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - throw new FormatError(`Invalid dictionary name "${name}"`); - } - this.values[this.nameToKeyMap[name]] = value; - } - hasName(name) { - return this.nameToKeyMap[name] in this.values; - } - getByName(name) { - if (!(name in this.nameToKeyMap)) { - throw new FormatError(`Invalid dictionary name ${name}"`); - } - const key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; - } - removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; - } - static createTables(layout) { - const tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (const entry of layout) { - const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); - } - return tables; - } -} -const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; -class CFFTopDict extends CFFDict { - static get tables() { - return shadow(this, "tables", this.createTables(CFFTopDictLayout)); - } - constructor(strings) { - super(CFFTopDict.tables, strings); - this.privateDict = null; - } -} -const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; -class CFFPrivateDict extends CFFDict { - static get tables() { - return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); - } - constructor(strings) { - super(CFFPrivateDict.tables, strings); - this.subrsIndex = null; - } -} -const CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -class CFFCharset { - constructor(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; - } -} -class CFFEncoding { - constructor(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; - } -} -class CFFFDSelect { - constructor(format, fdSelect) { - this.format = format; - this.fdSelect = fdSelect; - } - getFDIndex(glyphIndex) { - if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { - return -1; - } - return this.fdSelect[glyphIndex]; - } -} -class CFFOffsetTracker { - constructor() { - this.offsets = Object.create(null); - } - isTracking(key) { - return key in this.offsets; - } - track(key, location) { - if (key in this.offsets) { - throw new FormatError(`Already tracking location of ${key}`); - } - this.offsets[key] = location; - } - offset(value) { - for (const key in this.offsets) { - this.offsets[key] += value; - } - } - setEntryLocation(key, values, output) { - if (!(key in this.offsets)) { - throw new FormatError(`Not tracking location of ${key}`); - } - const data = output.data; - const dataOffset = this.offsets[key]; - const size = 5; - for (let i = 0, ii = values.length; i < ii; ++i) { - const offset0 = i * size + dataOffset; - const offset1 = offset0 + 1; - const offset2 = offset0 + 2; - const offset3 = offset0 + 3; - const offset4 = offset0 + 4; - if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - throw new FormatError("writing to an offset that is not empty"); - } - const value = values[i]; - data[offset0] = 0x1d; - data[offset1] = value >> 24 & 0xff; - data[offset2] = value >> 16 & 0xff; - data[offset3] = value >> 8 & 0xff; - data[offset4] = value & 0xff; - } - } -} -class CFFCompiler { - constructor(cff) { - this.cff = cff; - } - compile() { - const cff = this.cff; - const output = { - data: [], - length: 0, - add(data) { - try { - this.data.push(...data); - } catch { - this.data = this.data.concat(data); - } - this.length = this.data.length; - } - }; - const header = this.compileHeader(cff.header); - output.add(header); - const nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - if (cff.isCIDFont) { - if (cff.topDict.hasName("FontMatrix")) { - const base = cff.topDict.getByName("FontMatrix"); - cff.topDict.removeByName("FontMatrix"); - for (const subDict of cff.fdArray) { - let matrix = base.slice(0); - if (subDict.hasName("FontMatrix")) { - matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); - } - subDict.setByName("FontMatrix", matrix); - } - } - } - const xuid = cff.topDict.getByName("XUID"); - if (xuid?.length > 16) { - cff.topDict.removeByName("XUID"); - } - cff.topDict.setByName("charset", 0); - let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); - output.add(compiled.output); - const topDictTracker = compiled.trackers[0]; - const stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - if (cff.encoding && cff.topDict.hasName("Encoding")) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); - } else { - const encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation("Encoding", [output.length], output); - output.add(encoding); - } - } - const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); - topDictTracker.setEntryLocation("charset", [output.length], output); - output.add(charset); - const charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation("CharStrings", [output.length], output); - output.add(charStrings); - if (cff.isCIDFont) { - topDictTracker.setEntryLocation("FDSelect", [output.length], output); - const fdSelect = this.compileFDSelect(cff.fdSelect); - output.add(fdSelect); - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation("FDArray", [output.length], output); - output.add(compiled.output); - const fontDictTrackers = compiled.trackers; - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); - } - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - output.add([0]); - return output.data; - } - encodeNumber(value) { - if (Number.isInteger(value)) { - return this.encodeInteger(value); - } - return this.encodeFloat(value); - } - static get EncodeFloatRegExp() { - return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); - } - encodeFloat(num) { - let value = num.toString(); - const m = CFFCompiler.EncodeFloatRegExp.exec(value); - if (m) { - const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); - } - let nibbles = ""; - let i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - const a = value[i]; - if (a === "e") { - nibbles += value[++i] === "-" ? "c" : "b"; - } else if (a === ".") { - nibbles += "a"; - } else if (a === "-") { - nibbles += "e"; - } else { - nibbles += a; - } - } - nibbles += nibbles.length & 1 ? "f" : "ff"; - const out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substring(i, i + 2), 16)); - } - return out; - } - encodeInteger(value) { - let code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value -= 108; - code = [(value >> 8) + 247, value & 0xff]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xff]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, value >> 8 & 0xff, value & 0xff]; - } else { - code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; - } - return code; - } - compileHeader(header) { - return [header.major, header.minor, 4, header.offSize]; - } - compileNameIndex(names) { - const nameIndex = new CFFIndex(); - for (const name of names) { - const length = Math.min(name.length, 127); - let sanitizedName = new Array(length); - for (let j = 0; j < length; j++) { - let char = name[j]; - if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { - char = "_"; - } - sanitizedName[j] = char; - } - sanitizedName = sanitizedName.join(""); - if (sanitizedName === "") { - sanitizedName = "Bad_Font_Name"; - } - nameIndex.add(stringToBytes(sanitizedName)); - } - return this.compileIndex(nameIndex); - } - compileTopDicts(dicts, length, removeCidKeys) { - const fontDictTrackers = []; - let fdArrayIndex = new CFFIndex(); - for (const fontDict of dicts) { - if (removeCidKeys) { - fontDict.removeByName("CIDFontVersion"); - fontDict.removeByName("CIDFontRevision"); - fontDict.removeByName("CIDFontType"); - fontDict.removeByName("CIDCount"); - fontDict.removeByName("UIDBase"); - } - const fontDictTracker = new CFFOffsetTracker(); - const fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - } - compilePrivateDicts(dicts, trackers, output) { - for (let i = 0, ii = dicts.length; i < ii; ++i) { - const fontDict = dicts[i]; - const privateDict = fontDict.privateDict; - if (!privateDict || !fontDict.hasName("Private")) { - throw new FormatError("There must be a private dictionary."); - } - const privateDictTracker = new CFFOffsetTracker(); - const privateDictData = this.compileDict(privateDict, privateDictTracker); - let outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - outputLength = 0; - } - trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); - output.add(privateDictData); - if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { - const subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); - output.add(subrs); - } - } - } - compileDict(dict, offsetTracker) { - const out = []; - for (const key of dict.order) { - if (!(key in dict.values)) { - continue; - } - let values = dict.values[key]; - let types = dict.types[key]; - if (!Array.isArray(types)) { - types = [types]; - } - if (!Array.isArray(values)) { - values = [values]; - } - if (values.length === 0) { - continue; - } - for (let j = 0, jj = types.length; j < jj; ++j) { - const type = types[j]; - const value = values[j]; - switch (type) { - case "num": - case "sid": - out.push(...this.encodeNumber(value)); - break; - case "offset": - const name = dict.keyToNameMap[key]; - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); - } - out.push(0x1d, 0, 0, 0, 0); - break; - case "array": - case "delta": - out.push(...this.encodeNumber(value)); - for (let k = 1, kk = values.length; k < kk; ++k) { - out.push(...this.encodeNumber(values[k])); - } - break; - default: - throw new FormatError(`Unknown data type of ${type}`); - } - } - out.push(...dict.opcodes[key]); - } - return out; - } - compileStringIndex(strings) { - const stringIndex = new CFFIndex(); - for (const string of strings) { - stringIndex.add(stringToBytes(string)); - } - return this.compileIndex(stringIndex); - } - compileCharStrings(charStrings) { - const charStringsIndex = new CFFIndex(); - for (let i = 0; i < charStrings.count; i++) { - const glyph = charStrings.get(i); - if (glyph.length === 0) { - charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); - continue; - } - charStringsIndex.add(glyph); - } - return this.compileIndex(charStringsIndex); - } - compileCharset(charset, numGlyphs, strings, isCIDFont) { - let out; - const numGlyphsLessNotDef = numGlyphs - 1; - if (isCIDFont) { - const nLeft = numGlyphsLessNotDef - 1; - out = new Uint8Array([2, 0, 1, nLeft >> 8 & 0xff, nLeft & 0xff]); - } else { - const length = 1 + numGlyphsLessNotDef * 2; - out = new Uint8Array(length); - out[0] = 0; - let charsetIndex = 0; - const numCharsets = charset.charset.length; - let warned = false; - for (let i = 1; i < out.length; i += 2) { - let sid = 0; - if (charsetIndex < numCharsets) { - const name = charset.charset[charsetIndex++]; - sid = strings.getSID(name); - if (sid === -1) { - sid = 0; - if (!warned) { - warned = true; - warn(`Couldn't find ${name} in CFF strings`); - } - } - } - out[i] = sid >> 8 & 0xff; - out[i + 1] = sid & 0xff; - } - } - return this.compileTypedArray(out); - } - compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); - } - compileFDSelect(fdSelect) { - const format = fdSelect.format; - let out, i; - switch (format) { - case 0: - out = new Uint8Array(1 + fdSelect.fdSelect.length); - out[0] = format; - for (i = 0; i < fdSelect.fdSelect.length; i++) { - out[i + 1] = fdSelect.fdSelect[i]; - } - break; - case 3: - const start = 0; - let lastFD = fdSelect.fdSelect[0]; - const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; - for (i = 1; i < fdSelect.fdSelect.length; i++) { - const currentFD = fdSelect.fdSelect[i]; - if (currentFD !== lastFD) { - ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); - lastFD = currentFD; - } - } - const numRanges = (ranges.length - 3) / 3; - ranges[1] = numRanges >> 8 & 0xff; - ranges[2] = numRanges & 0xff; - ranges.push(i >> 8 & 0xff, i & 0xff); - out = new Uint8Array(ranges); - break; - } - return this.compileTypedArray(out); - } - compileTypedArray(data) { - return Array.from(data); - } - compileIndex(index, trackers = []) { - const objects = index.objects; - const count = objects.length; - if (count === 0) { - return [0, 0]; - } - const data = [count >> 8 & 0xff, count & 0xff]; - let lastOffset = 1, - i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; - } - let offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; - } - data.push(offsetSize); - let relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xff); - } else if (offsetSize === 2) { - data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); - } else if (offsetSize === 3) { - data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); - } else { - data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); - } - if (objects[i]) { - relativeOffset += objects[i].length; - } - } - for (i = 0; i < count; i++) { - if (trackers[i]) { - trackers[i].offset(data.length); - } - data.push(...objects[i]); - } - return data; - } -} - -;// ./src/core/standard_fonts.js - - -const getStdFontMap = getLookupTableFactory(function (t) { - t["Times-Roman"] = "Times-Roman"; - t.Helvetica = "Helvetica"; - t.Courier = "Courier"; - t.Symbol = "Symbol"; - t["Times-Bold"] = "Times-Bold"; - t["Helvetica-Bold"] = "Helvetica-Bold"; - t["Courier-Bold"] = "Courier-Bold"; - t.ZapfDingbats = "ZapfDingbats"; - t["Times-Italic"] = "Times-Italic"; - t["Helvetica-Oblique"] = "Helvetica-Oblique"; - t["Courier-Oblique"] = "Courier-Oblique"; - t["Times-BoldItalic"] = "Times-BoldItalic"; - t["Helvetica-BoldOblique"] = "Helvetica-BoldOblique"; - t["Courier-BoldOblique"] = "Courier-BoldOblique"; - t.ArialNarrow = "Helvetica"; - t["ArialNarrow-Bold"] = "Helvetica-Bold"; - t["ArialNarrow-BoldItalic"] = "Helvetica-BoldOblique"; - t["ArialNarrow-Italic"] = "Helvetica-Oblique"; - t.ArialBlack = "Helvetica"; - t["ArialBlack-Bold"] = "Helvetica-Bold"; - t["ArialBlack-BoldItalic"] = "Helvetica-BoldOblique"; - t["ArialBlack-Italic"] = "Helvetica-Oblique"; - t["Arial-Black"] = "Helvetica"; - t["Arial-Black-Bold"] = "Helvetica-Bold"; - t["Arial-Black-BoldItalic"] = "Helvetica-BoldOblique"; - t["Arial-Black-Italic"] = "Helvetica-Oblique"; - t.Arial = "Helvetica"; - t["Arial-Bold"] = "Helvetica-Bold"; - t["Arial-BoldItalic"] = "Helvetica-BoldOblique"; - t["Arial-Italic"] = "Helvetica-Oblique"; - t.ArialMT = "Helvetica"; - t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; - t["Arial-BoldMT"] = "Helvetica-Bold"; - t["Arial-ItalicMT"] = "Helvetica-Oblique"; - t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; - t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; - t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; - t.ArialUnicodeMS = "Helvetica"; - t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; - t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; - t["ArialUnicodeMS-Italic"] = "Helvetica-Oblique"; - t["Courier-BoldItalic"] = "Courier-BoldOblique"; - t["Courier-Italic"] = "Courier-Oblique"; - t.CourierNew = "Courier"; - t["CourierNew-Bold"] = "Courier-Bold"; - t["CourierNew-BoldItalic"] = "Courier-BoldOblique"; - t["CourierNew-Italic"] = "Courier-Oblique"; - t["CourierNewPS-BoldItalicMT"] = "Courier-BoldOblique"; - t["CourierNewPS-BoldMT"] = "Courier-Bold"; - t["CourierNewPS-ItalicMT"] = "Courier-Oblique"; - t.CourierNewPSMT = "Courier"; - t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; - t["Helvetica-Italic"] = "Helvetica-Oblique"; - t["HelveticaLTStd-Bold"] = "Helvetica-Bold"; - t["Symbol-Bold"] = "Symbol"; - t["Symbol-BoldItalic"] = "Symbol"; - t["Symbol-Italic"] = "Symbol"; - t.TimesNewRoman = "Times-Roman"; - t["TimesNewRoman-Bold"] = "Times-Bold"; - t["TimesNewRoman-BoldItalic"] = "Times-BoldItalic"; - t["TimesNewRoman-Italic"] = "Times-Italic"; - t.TimesNewRomanPS = "Times-Roman"; - t["TimesNewRomanPS-Bold"] = "Times-Bold"; - t["TimesNewRomanPS-BoldItalic"] = "Times-BoldItalic"; - t["TimesNewRomanPS-BoldItalicMT"] = "Times-BoldItalic"; - t["TimesNewRomanPS-BoldMT"] = "Times-Bold"; - t["TimesNewRomanPS-Italic"] = "Times-Italic"; - t["TimesNewRomanPS-ItalicMT"] = "Times-Italic"; - t.TimesNewRomanPSMT = "Times-Roman"; - t["TimesNewRomanPSMT-Bold"] = "Times-Bold"; - t["TimesNewRomanPSMT-BoldItalic"] = "Times-BoldItalic"; - t["TimesNewRomanPSMT-Italic"] = "Times-Italic"; -}); -const getFontNameToFileMap = getLookupTableFactory(function (t) { - t.Courier = "FoxitFixed.pfb"; - t["Courier-Bold"] = "FoxitFixedBold.pfb"; - t["Courier-BoldOblique"] = "FoxitFixedBoldItalic.pfb"; - t["Courier-Oblique"] = "FoxitFixedItalic.pfb"; - t.Helvetica = "LiberationSans-Regular.ttf"; - t["Helvetica-Bold"] = "LiberationSans-Bold.ttf"; - t["Helvetica-BoldOblique"] = "LiberationSans-BoldItalic.ttf"; - t["Helvetica-Oblique"] = "LiberationSans-Italic.ttf"; - t["Times-Roman"] = "FoxitSerif.pfb"; - t["Times-Bold"] = "FoxitSerifBold.pfb"; - t["Times-BoldItalic"] = "FoxitSerifBoldItalic.pfb"; - t["Times-Italic"] = "FoxitSerifItalic.pfb"; - t.Symbol = "FoxitSymbol.pfb"; - t.ZapfDingbats = "FoxitDingbats.pfb"; - t["LiberationSans-Regular"] = "LiberationSans-Regular.ttf"; - t["LiberationSans-Bold"] = "LiberationSans-Bold.ttf"; - t["LiberationSans-Italic"] = "LiberationSans-Italic.ttf"; - t["LiberationSans-BoldItalic"] = "LiberationSans-BoldItalic.ttf"; -}); -const getNonStdFontMap = getLookupTableFactory(function (t) { - t.Calibri = "Helvetica"; - t["Calibri-Bold"] = "Helvetica-Bold"; - t["Calibri-BoldItalic"] = "Helvetica-BoldOblique"; - t["Calibri-Italic"] = "Helvetica-Oblique"; - t.CenturyGothic = "Helvetica"; - t["CenturyGothic-Bold"] = "Helvetica-Bold"; - t["CenturyGothic-BoldItalic"] = "Helvetica-BoldOblique"; - t["CenturyGothic-Italic"] = "Helvetica-Oblique"; - t.ComicSansMS = "Comic Sans MS"; - t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; - t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; - t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; - t.GillSansMT = "Helvetica"; - t["GillSansMT-Bold"] = "Helvetica-Bold"; - t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; - t["GillSansMT-Italic"] = "Helvetica-Oblique"; - t.Impact = "Helvetica"; - t["ItcSymbol-Bold"] = "Helvetica-Bold"; - t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; - t["ItcSymbol-Book"] = "Helvetica"; - t["ItcSymbol-BookItalic"] = "Helvetica-Oblique"; - t["ItcSymbol-Medium"] = "Helvetica"; - t["ItcSymbol-MediumItalic"] = "Helvetica-Oblique"; - t.LucidaConsole = "Courier"; - t["LucidaConsole-Bold"] = "Courier-Bold"; - t["LucidaConsole-BoldItalic"] = "Courier-BoldOblique"; - t["LucidaConsole-Italic"] = "Courier-Oblique"; - t["LucidaSans-Demi"] = "Helvetica-Bold"; - t["MS-Gothic"] = "MS Gothic"; - t["MS-Gothic-Bold"] = "MS Gothic-Bold"; - t["MS-Gothic-BoldItalic"] = "MS Gothic-BoldItalic"; - t["MS-Gothic-Italic"] = "MS Gothic-Italic"; - t["MS-Mincho"] = "MS Mincho"; - t["MS-Mincho-Bold"] = "MS Mincho-Bold"; - t["MS-Mincho-BoldItalic"] = "MS Mincho-BoldItalic"; - t["MS-Mincho-Italic"] = "MS Mincho-Italic"; - t["MS-PGothic"] = "MS PGothic"; - t["MS-PGothic-Bold"] = "MS PGothic-Bold"; - t["MS-PGothic-BoldItalic"] = "MS PGothic-BoldItalic"; - t["MS-PGothic-Italic"] = "MS PGothic-Italic"; - t["MS-PMincho"] = "MS PMincho"; - t["MS-PMincho-Bold"] = "MS PMincho-Bold"; - t["MS-PMincho-BoldItalic"] = "MS PMincho-BoldItalic"; - t["MS-PMincho-Italic"] = "MS PMincho-Italic"; - t.NuptialScript = "Times-Italic"; - t.SegoeUISymbol = "Helvetica"; -}); -const getSerifFonts = getLookupTableFactory(function (t) { - t["Adobe Jenson"] = true; - t["Adobe Text"] = true; - t.Albertus = true; - t.Aldus = true; - t.Alexandria = true; - t.Algerian = true; - t["American Typewriter"] = true; - t.Antiqua = true; - t.Apex = true; - t.Arno = true; - t.Aster = true; - t.Aurora = true; - t.Baskerville = true; - t.Bell = true; - t.Bembo = true; - t["Bembo Schoolbook"] = true; - t.Benguiat = true; - t["Berkeley Old Style"] = true; - t["Bernhard Modern"] = true; - t["Berthold City"] = true; - t.Bodoni = true; - t["Bauer Bodoni"] = true; - t["Book Antiqua"] = true; - t.Bookman = true; - t["Bordeaux Roman"] = true; - t["Californian FB"] = true; - t.Calisto = true; - t.Calvert = true; - t.Capitals = true; - t.Cambria = true; - t.Cartier = true; - t.Caslon = true; - t.Catull = true; - t.Centaur = true; - t["Century Old Style"] = true; - t["Century Schoolbook"] = true; - t.Chaparral = true; - t["Charis SIL"] = true; - t.Cheltenham = true; - t["Cholla Slab"] = true; - t.Clarendon = true; - t.Clearface = true; - t.Cochin = true; - t.Colonna = true; - t["Computer Modern"] = true; - t["Concrete Roman"] = true; - t.Constantia = true; - t["Cooper Black"] = true; - t.Corona = true; - t.Ecotype = true; - t.Egyptienne = true; - t.Elephant = true; - t.Excelsior = true; - t.Fairfield = true; - t["FF Scala"] = true; - t.Folkard = true; - t.Footlight = true; - t.FreeSerif = true; - t["Friz Quadrata"] = true; - t.Garamond = true; - t.Gentium = true; - t.Georgia = true; - t.Gloucester = true; - t["Goudy Old Style"] = true; - t["Goudy Schoolbook"] = true; - t["Goudy Pro Font"] = true; - t.Granjon = true; - t["Guardian Egyptian"] = true; - t.Heather = true; - t.Hercules = true; - t["High Tower Text"] = true; - t.Hiroshige = true; - t["Hoefler Text"] = true; - t["Humana Serif"] = true; - t.Imprint = true; - t["Ionic No. 5"] = true; - t.Janson = true; - t.Joanna = true; - t.Korinna = true; - t.Lexicon = true; - t.LiberationSerif = true; - t["Liberation Serif"] = true; - t["Linux Libertine"] = true; - t.Literaturnaya = true; - t.Lucida = true; - t["Lucida Bright"] = true; - t.Melior = true; - t.Memphis = true; - t.Miller = true; - t.Minion = true; - t.Modern = true; - t["Mona Lisa"] = true; - t["Mrs Eaves"] = true; - t["MS Serif"] = true; - t["Museo Slab"] = true; - t["New York"] = true; - t["Nimbus Roman"] = true; - t["NPS Rawlinson Roadway"] = true; - t.NuptialScript = true; - t.Palatino = true; - t.Perpetua = true; - t.Plantin = true; - t["Plantin Schoolbook"] = true; - t.Playbill = true; - t["Poor Richard"] = true; - t["Rawlinson Roadway"] = true; - t.Renault = true; - t.Requiem = true; - t.Rockwell = true; - t.Roman = true; - t["Rotis Serif"] = true; - t.Sabon = true; - t.Scala = true; - t.Seagull = true; - t.Sistina = true; - t.Souvenir = true; - t.STIX = true; - t["Stone Informal"] = true; - t["Stone Serif"] = true; - t.Sylfaen = true; - t.Times = true; - t.Trajan = true; - t["Trinité"] = true; - t["Trump Mediaeval"] = true; - t.Utopia = true; - t["Vale Type"] = true; - t["Bitstream Vera"] = true; - t["Vera Serif"] = true; - t.Versailles = true; - t.Wanted = true; - t.Weiss = true; - t["Wide Latin"] = true; - t.Windsor = true; - t.XITS = true; -}); -const getSymbolsFonts = getLookupTableFactory(function (t) { - t.Dingbats = true; - t.Symbol = true; - t.ZapfDingbats = true; - t.Wingdings = true; - t["Wingdings-Bold"] = true; - t["Wingdings-Regular"] = true; -}); -const getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { - t[2] = 10; - t[3] = 32; - t[4] = 33; - t[5] = 34; - t[6] = 35; - t[7] = 36; - t[8] = 37; - t[9] = 38; - t[10] = 39; - t[11] = 40; - t[12] = 41; - t[13] = 42; - t[14] = 43; - t[15] = 44; - t[16] = 45; - t[17] = 46; - t[18] = 47; - t[19] = 48; - t[20] = 49; - t[21] = 50; - t[22] = 51; - t[23] = 52; - t[24] = 53; - t[25] = 54; - t[26] = 55; - t[27] = 56; - t[28] = 57; - t[29] = 58; - t[30] = 894; - t[31] = 60; - t[32] = 61; - t[33] = 62; - t[34] = 63; - t[35] = 64; - t[36] = 65; - t[37] = 66; - t[38] = 67; - t[39] = 68; - t[40] = 69; - t[41] = 70; - t[42] = 71; - t[43] = 72; - t[44] = 73; - t[45] = 74; - t[46] = 75; - t[47] = 76; - t[48] = 77; - t[49] = 78; - t[50] = 79; - t[51] = 80; - t[52] = 81; - t[53] = 82; - t[54] = 83; - t[55] = 84; - t[56] = 85; - t[57] = 86; - t[58] = 87; - t[59] = 88; - t[60] = 89; - t[61] = 90; - t[62] = 91; - t[63] = 92; - t[64] = 93; - t[65] = 94; - t[66] = 95; - t[67] = 96; - t[68] = 97; - t[69] = 98; - t[70] = 99; - t[71] = 100; - t[72] = 101; - t[73] = 102; - t[74] = 103; - t[75] = 104; - t[76] = 105; - t[77] = 106; - t[78] = 107; - t[79] = 108; - t[80] = 109; - t[81] = 110; - t[82] = 111; - t[83] = 112; - t[84] = 113; - t[85] = 114; - t[86] = 115; - t[87] = 116; - t[88] = 117; - t[89] = 118; - t[90] = 119; - t[91] = 120; - t[92] = 121; - t[93] = 122; - t[94] = 123; - t[95] = 124; - t[96] = 125; - t[97] = 126; - t[98] = 196; - t[99] = 197; - t[100] = 199; - t[101] = 201; - t[102] = 209; - t[103] = 214; - t[104] = 220; - t[105] = 225; - t[106] = 224; - t[107] = 226; - t[108] = 228; - t[109] = 227; - t[110] = 229; - t[111] = 231; - t[112] = 233; - t[113] = 232; - t[114] = 234; - t[115] = 235; - t[116] = 237; - t[117] = 236; - t[118] = 238; - t[119] = 239; - t[120] = 241; - t[121] = 243; - t[122] = 242; - t[123] = 244; - t[124] = 246; - t[125] = 245; - t[126] = 250; - t[127] = 249; - t[128] = 251; - t[129] = 252; - t[130] = 8224; - t[131] = 176; - t[132] = 162; - t[133] = 163; - t[134] = 167; - t[135] = 8226; - t[136] = 182; - t[137] = 223; - t[138] = 174; - t[139] = 169; - t[140] = 8482; - t[141] = 180; - t[142] = 168; - t[143] = 8800; - t[144] = 198; - t[145] = 216; - t[146] = 8734; - t[147] = 177; - t[148] = 8804; - t[149] = 8805; - t[150] = 165; - t[151] = 181; - t[152] = 8706; - t[153] = 8721; - t[154] = 8719; - t[156] = 8747; - t[157] = 170; - t[158] = 186; - t[159] = 8486; - t[160] = 230; - t[161] = 248; - t[162] = 191; - t[163] = 161; - t[164] = 172; - t[165] = 8730; - t[166] = 402; - t[167] = 8776; - t[168] = 8710; - t[169] = 171; - t[170] = 187; - t[171] = 8230; - t[179] = 8220; - t[180] = 8221; - t[181] = 8216; - t[182] = 8217; - t[200] = 193; - t[203] = 205; - t[207] = 211; - t[210] = 218; - t[223] = 711; - t[224] = 321; - t[225] = 322; - t[226] = 352; - t[227] = 353; - t[228] = 381; - t[229] = 382; - t[233] = 221; - t[234] = 253; - t[252] = 263; - t[253] = 268; - t[254] = 269; - t[258] = 258; - t[260] = 260; - t[261] = 261; - t[265] = 280; - t[266] = 281; - t[267] = 282; - t[268] = 283; - t[269] = 313; - t[275] = 323; - t[276] = 324; - t[278] = 328; - t[283] = 344; - t[284] = 345; - t[285] = 346; - t[286] = 347; - t[292] = 367; - t[295] = 377; - t[296] = 378; - t[298] = 380; - t[305] = 963; - t[306] = 964; - t[307] = 966; - t[308] = 8215; - t[309] = 8252; - t[310] = 8319; - t[311] = 8359; - t[312] = 8592; - t[313] = 8593; - t[337] = 9552; - t[493] = 1039; - t[494] = 1040; - t[570] = 1040; - t[571] = 1041; - t[572] = 1042; - t[573] = 1043; - t[574] = 1044; - t[575] = 1045; - t[576] = 1046; - t[577] = 1047; - t[578] = 1048; - t[579] = 1049; - t[580] = 1050; - t[581] = 1051; - t[582] = 1052; - t[583] = 1053; - t[584] = 1054; - t[585] = 1055; - t[586] = 1056; - t[587] = 1057; - t[588] = 1058; - t[589] = 1059; - t[590] = 1060; - t[591] = 1061; - t[592] = 1062; - t[593] = 1063; - t[594] = 1064; - t[595] = 1065; - t[596] = 1066; - t[597] = 1067; - t[598] = 1068; - t[599] = 1069; - t[600] = 1070; - t[672] = 1488; - t[673] = 1489; - t[674] = 1490; - t[675] = 1491; - t[676] = 1492; - t[677] = 1493; - t[678] = 1494; - t[679] = 1495; - t[680] = 1496; - t[681] = 1497; - t[682] = 1498; - t[683] = 1499; - t[684] = 1500; - t[685] = 1501; - t[686] = 1502; - t[687] = 1503; - t[688] = 1504; - t[689] = 1505; - t[690] = 1506; - t[691] = 1507; - t[692] = 1508; - t[693] = 1509; - t[694] = 1510; - t[695] = 1511; - t[696] = 1512; - t[697] = 1513; - t[698] = 1514; - t[705] = 1524; - t[706] = 8362; - t[710] = 64288; - t[711] = 64298; - t[759] = 1617; - t[761] = 1776; - t[763] = 1778; - t[775] = 1652; - t[777] = 1764; - t[778] = 1780; - t[779] = 1781; - t[780] = 1782; - t[782] = 771; - t[783] = 64726; - t[786] = 8363; - t[788] = 8532; - t[790] = 768; - t[791] = 769; - t[792] = 768; - t[795] = 803; - t[797] = 64336; - t[798] = 64337; - t[799] = 64342; - t[800] = 64343; - t[801] = 64344; - t[802] = 64345; - t[803] = 64362; - t[804] = 64363; - t[805] = 64364; - t[2424] = 7821; - t[2425] = 7822; - t[2426] = 7823; - t[2427] = 7824; - t[2428] = 7825; - t[2429] = 7826; - t[2430] = 7827; - t[2433] = 7682; - t[2678] = 8045; - t[2679] = 8046; - t[2830] = 1552; - t[2838] = 686; - t[2840] = 751; - t[2842] = 753; - t[2843] = 754; - t[2844] = 755; - t[2846] = 757; - t[2856] = 767; - t[2857] = 848; - t[2858] = 849; - t[2862] = 853; - t[2863] = 854; - t[2864] = 855; - t[2865] = 861; - t[2866] = 862; - t[2906] = 7460; - t[2908] = 7462; - t[2909] = 7463; - t[2910] = 7464; - t[2912] = 7466; - t[2913] = 7467; - t[2914] = 7468; - t[2916] = 7470; - t[2917] = 7471; - t[2918] = 7472; - t[2920] = 7474; - t[2921] = 7475; - t[2922] = 7476; - t[2924] = 7478; - t[2925] = 7479; - t[2926] = 7480; - t[2928] = 7482; - t[2929] = 7483; - t[2930] = 7484; - t[2932] = 7486; - t[2933] = 7487; - t[2934] = 7488; - t[2936] = 7490; - t[2937] = 7491; - t[2938] = 7492; - t[2940] = 7494; - t[2941] = 7495; - t[2942] = 7496; - t[2944] = 7498; - t[2946] = 7500; - t[2948] = 7502; - t[2950] = 7504; - t[2951] = 7505; - t[2952] = 7506; - t[2954] = 7508; - t[2955] = 7509; - t[2956] = 7510; - t[2958] = 7512; - t[2959] = 7513; - t[2960] = 7514; - t[2962] = 7516; - t[2963] = 7517; - t[2964] = 7518; - t[2966] = 7520; - t[2967] = 7521; - t[2968] = 7522; - t[2970] = 7524; - t[2971] = 7525; - t[2972] = 7526; - t[2974] = 7528; - t[2975] = 7529; - t[2976] = 7530; - t[2978] = 1537; - t[2979] = 1538; - t[2980] = 1539; - t[2982] = 1549; - t[2983] = 1551; - t[2984] = 1552; - t[2986] = 1554; - t[2987] = 1555; - t[2988] = 1556; - t[2990] = 1623; - t[2991] = 1624; - t[2995] = 1775; - t[2999] = 1791; - t[3002] = 64290; - t[3003] = 64291; - t[3004] = 64292; - t[3006] = 64294; - t[3007] = 64295; - t[3008] = 64296; - t[3011] = 1900; - t[3014] = 8223; - t[3015] = 8244; - t[3017] = 7532; - t[3018] = 7533; - t[3019] = 7534; - t[3075] = 7590; - t[3076] = 7591; - t[3079] = 7594; - t[3080] = 7595; - t[3083] = 7598; - t[3084] = 7599; - t[3087] = 7602; - t[3088] = 7603; - t[3091] = 7606; - t[3092] = 7607; - t[3095] = 7610; - t[3096] = 7611; - t[3099] = 7614; - t[3100] = 7615; - t[3103] = 7618; - t[3104] = 7619; - t[3107] = 8337; - t[3108] = 8338; - t[3116] = 1884; - t[3119] = 1885; - t[3120] = 1885; - t[3123] = 1886; - t[3124] = 1886; - t[3127] = 1887; - t[3128] = 1887; - t[3131] = 1888; - t[3132] = 1888; - t[3135] = 1889; - t[3136] = 1889; - t[3139] = 1890; - t[3140] = 1890; - t[3143] = 1891; - t[3144] = 1891; - t[3147] = 1892; - t[3148] = 1892; - t[3153] = 580; - t[3154] = 581; - t[3157] = 584; - t[3158] = 585; - t[3161] = 588; - t[3162] = 589; - t[3165] = 891; - t[3166] = 892; - t[3169] = 1274; - t[3170] = 1275; - t[3173] = 1278; - t[3174] = 1279; - t[3181] = 7622; - t[3182] = 7623; - t[3282] = 11799; - t[3316] = 578; - t[3379] = 42785; - t[3393] = 1159; - t[3416] = 8377; -}); -const getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { - t[227] = 322; - t[264] = 261; - t[291] = 346; -}); -const getSupplementalGlyphMapForCalibri = getLookupTableFactory(function (t) { - t[1] = 32; - t[4] = 65; - t[5] = 192; - t[6] = 193; - t[9] = 196; - t[17] = 66; - t[18] = 67; - t[21] = 268; - t[24] = 68; - t[28] = 69; - t[29] = 200; - t[30] = 201; - t[32] = 282; - t[38] = 70; - t[39] = 71; - t[44] = 72; - t[47] = 73; - t[48] = 204; - t[49] = 205; - t[58] = 74; - t[60] = 75; - t[62] = 76; - t[68] = 77; - t[69] = 78; - t[75] = 79; - t[76] = 210; - t[80] = 214; - t[87] = 80; - t[89] = 81; - t[90] = 82; - t[92] = 344; - t[94] = 83; - t[97] = 352; - t[100] = 84; - t[104] = 85; - t[109] = 220; - t[115] = 86; - t[116] = 87; - t[121] = 88; - t[122] = 89; - t[124] = 221; - t[127] = 90; - t[129] = 381; - t[258] = 97; - t[259] = 224; - t[260] = 225; - t[263] = 228; - t[268] = 261; - t[271] = 98; - t[272] = 99; - t[273] = 263; - t[275] = 269; - t[282] = 100; - t[286] = 101; - t[287] = 232; - t[288] = 233; - t[290] = 283; - t[295] = 281; - t[296] = 102; - t[336] = 103; - t[346] = 104; - t[349] = 105; - t[350] = 236; - t[351] = 237; - t[361] = 106; - t[364] = 107; - t[367] = 108; - t[371] = 322; - t[373] = 109; - t[374] = 110; - t[381] = 111; - t[382] = 242; - t[383] = 243; - t[386] = 246; - t[393] = 112; - t[395] = 113; - t[396] = 114; - t[398] = 345; - t[400] = 115; - t[401] = 347; - t[403] = 353; - t[410] = 116; - t[437] = 117; - t[442] = 252; - t[448] = 118; - t[449] = 119; - t[454] = 120; - t[455] = 121; - t[457] = 253; - t[460] = 122; - t[462] = 382; - t[463] = 380; - t[853] = 44; - t[855] = 58; - t[856] = 46; - t[876] = 47; - t[878] = 45; - t[882] = 45; - t[894] = 40; - t[895] = 41; - t[896] = 91; - t[897] = 93; - t[923] = 64; - t[940] = 163; - t[1004] = 48; - t[1005] = 49; - t[1006] = 50; - t[1007] = 51; - t[1008] = 52; - t[1009] = 53; - t[1010] = 54; - t[1011] = 55; - t[1012] = 56; - t[1013] = 57; - t[1081] = 37; - t[1085] = 43; - t[1086] = 45; -}); -function getStandardFontName(name) { - const fontName = normalizeFontName(name); - const stdFontMap = getStdFontMap(); - return stdFontMap[fontName]; -} -function isKnownFontName(name) { - const fontName = normalizeFontName(name); - return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]); -} - -;// ./src/core/to_unicode_map.js - -class ToUnicodeMap { - constructor(cmap = []) { - this._map = cmap; - } - get length() { - return this._map.length; - } - forEach(callback) { - for (const charCode in this._map) { - callback(charCode, this._map[charCode].codePointAt(0)); - } - } - has(i) { - return this._map[i] !== undefined; - } - get(i) { - return this._map[i]; - } - charCodeOf(value) { - const map = this._map; - if (map.length <= 0x10000) { - return map.indexOf(value); - } - for (const charCode in map) { - if (map[charCode] === value) { - return charCode | 0; - } - } - return -1; - } - amend(map) { - for (const charCode in map) { - this._map[charCode] = map[charCode]; - } - } -} -class IdentityToUnicodeMap { - constructor(firstChar, lastChar) { - this.firstChar = firstChar; - this.lastChar = lastChar; - } - get length() { - return this.lastChar + 1 - this.firstChar; - } - forEach(callback) { - for (let i = this.firstChar, ii = this.lastChar; i <= ii; i++) { - callback(i, i); - } - } - has(i) { - return this.firstChar <= i && i <= this.lastChar; - } - get(i) { - if (this.firstChar <= i && i <= this.lastChar) { - return String.fromCharCode(i); - } - return undefined; - } - charCodeOf(v) { - return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; - } - amend(map) { - unreachable("Should not call amend()"); - } -} - -;// ./src/core/cff_font.js - - - -class CFFFont { - constructor(file, properties) { - this.properties = properties; - const parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); - this.cff = parser.parse(); - this.cff.duplicateFirstGlyph(); - const compiler = new CFFCompiler(this.cff); - this.seacs = this.cff.seacs; - try { - this.data = compiler.compile(); - } catch { - warn("Failed to compile font " + properties.loadedName); - this.data = file; - } - this._createBuiltInEncoding(); - } - get numGlyphs() { - return this.cff.charStrings.count; - } - getCharset() { - return this.cff.charset.charset; - } - getGlyphMapping() { - const cff = this.cff; - const properties = this.properties; - const { - cidToGidMap, - cMap - } = properties; - const charsets = cff.charset.charset; - let charCodeToGlyphId; - let glyphId; - if (properties.composite) { - let invCidToGidMap; - if (cidToGidMap?.length > 0) { - invCidToGidMap = Object.create(null); - for (let i = 0, ii = cidToGidMap.length; i < ii; i++) { - const gid = cidToGidMap[i]; - if (gid !== undefined) { - invCidToGidMap[gid] = i; - } - } - } - charCodeToGlyphId = Object.create(null); - let charCode; - if (cff.isCIDFont) { - for (glyphId = 0; glyphId < charsets.length; glyphId++) { - const cid = charsets[glyphId]; - charCode = cMap.charCodeOf(cid); - if (invCidToGidMap?.[charCode] !== undefined) { - charCode = invCidToGidMap[charCode]; - } - charCodeToGlyphId[charCode] = glyphId; - } - } else { - for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCode = cMap.charCodeOf(glyphId); - charCodeToGlyphId[charCode] = glyphId; - } - } - return charCodeToGlyphId; - } - let encoding = cff.encoding ? cff.encoding.encoding : null; - if (properties.isInternalFont) { - encoding = properties.defaultEncoding; - } - charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); - return charCodeToGlyphId; - } - hasGlyphId(id) { - return this.cff.hasGlyphId(id); - } - _createBuiltInEncoding() { - const { - charset, - encoding - } = this.cff; - if (!charset || !encoding) { - return; - } - const charsets = charset.charset, - encodings = encoding.encoding; - const map = []; - for (const charCode in encodings) { - const glyphId = encodings[charCode]; - if (glyphId >= 0) { - const glyphName = charsets[glyphId]; - if (glyphName) { - map[charCode] = glyphName; - } - } - } - if (map.length > 0) { - this.properties.builtInEncoding = map; - } - } -} - -;// ./src/core/font_renderer.js - - - - - - -function getFloat214(data, offset) { - return readInt16(data, offset) / 16384; -} -function getSubroutineBias(subrs) { - const numSubrs = subrs.length; - let bias = 32768; - if (numSubrs < 1240) { - bias = 107; - } else if (numSubrs < 33900) { - bias = 1131; - } - return bias; -} -function parseCmap(data, start, end) { - const offset = readUint16(data, start + 2) === 1 ? readUint32(data, start + 8) : readUint32(data, start + 16); - const format = readUint16(data, start + offset); - let ranges, p, i; - if (format === 4) { - readUint16(data, start + offset + 2); - const segCount = readUint16(data, start + offset + 6) >> 1; - p = start + offset + 14; - ranges = []; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i] = { - end: readUint16(data, p) - }; - } - p += 2; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = readUint16(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = readUint16(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - let idOffset = readUint16(data, p); - if (idOffset === 0) { - continue; - } - ranges[i].ids = []; - for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = readUint16(data, p + idOffset); - idOffset += 2; - } - } - return ranges; - } else if (format === 12) { - const groups = readUint32(data, start + offset + 12); - p = start + offset + 16; - ranges = []; - for (i = 0; i < groups; i++) { - start = readUint32(data, p); - ranges.push({ - start, - end: readUint32(data, p + 4), - idDelta: readUint32(data, p + 8) - start - }); - p += 12; - } - return ranges; - } - throw new FormatError(`unsupported cmap: ${format}`); -} -function parseCff(data, start, end, seacAnalysisEnabled) { - const properties = {}; - const parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); - const cff = parser.parse(); - return { - glyphs: cff.charStrings.objects, - subrs: cff.topDict.privateDict?.subrsIndex?.objects, - gsubrs: cff.globalSubrIndex?.objects, - isCFFCIDFont: cff.isCIDFont, - fdSelect: cff.fdSelect, - fdArray: cff.fdArray - }; -} -function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { - let itemSize, itemDecode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = readUint32; - } else { - itemSize = 2; - itemDecode = (data, offset) => 2 * readUint16(data, offset); - } - const glyphs = []; - let startOffset = itemDecode(loca, 0); - for (let j = itemSize; j < loca.length; j += itemSize) { - const endOffset = itemDecode(loca, j); - glyphs.push(glyf.subarray(startOffset, endOffset)); - startOffset = endOffset; - } - return glyphs; -} -function lookupCmap(ranges, unicode) { - const code = unicode.codePointAt(0); - let gid = 0, - l = 0, - r = ranges.length - 1; - while (l < r) { - const c = l + r + 1 >> 1; - if (code < ranges[c].start) { - r = c - 1; - } else { - l = c; - } - } - if (ranges[l].start <= code && code <= ranges[l].end) { - gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xffff; - } - return { - charCode: code, - glyphId: gid - }; -} -function compileGlyf(code, cmds, font) { - function moveTo(x, y) { - if (firstPoint) { - cmds.add("L", firstPoint); - } - firstPoint = [x, y]; - cmds.add("M", [x, y]); - } - function lineTo(x, y) { - cmds.add("L", [x, y]); - } - function quadraticCurveTo(xa, ya, x, y) { - cmds.add("Q", [xa, ya, x, y]); - } - let i = 0; - const numberOfContours = readInt16(code, i); - let flags; - let firstPoint = null; - let x = 0, - y = 0; - i += 10; - if (numberOfContours < 0) { - do { - flags = readUint16(code, i); - const glyphIndex = readUint16(code, i + 2); - i += 4; - let arg1, arg2; - if (flags & 0x01) { - if (flags & 0x02) { - arg1 = readInt16(code, i); - arg2 = readInt16(code, i + 2); - } else { - arg1 = readUint16(code, i); - arg2 = readUint16(code, i + 2); - } - i += 4; - } else if (flags & 0x02) { - arg1 = readInt8(code, i++); - arg2 = readInt8(code, i++); - } else { - arg1 = code[i++]; - arg2 = code[i++]; - } - if (flags & 0x02) { - x = arg1; - y = arg2; - } else { - x = 0; - y = 0; - } - let scaleX = 1, - scaleY = 1, - scale01 = 0, - scale10 = 0; - if (flags & 0x08) { - scaleX = scaleY = getFloat214(code, i); - i += 2; - } else if (flags & 0x40) { - scaleX = getFloat214(code, i); - scaleY = getFloat214(code, i + 2); - i += 4; - } else if (flags & 0x80) { - scaleX = getFloat214(code, i); - scale01 = getFloat214(code, i + 2); - scale10 = getFloat214(code, i + 4); - scaleY = getFloat214(code, i + 6); - i += 8; - } - const subglyph = font.glyphs[glyphIndex]; - if (subglyph) { - cmds.save(); - cmds.transform([scaleX, scale01, scale10, scaleY, x, y]); - if (!(flags & 0x02)) {} - compileGlyf(subglyph, cmds, font); - cmds.restore(); - } - } while (flags & 0x20); - } else { - const endPtsOfContours = []; - let j, jj; - for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push(readUint16(code, i)); - i += 2; - } - const instructionLength = readUint16(code, i); - i += 2 + instructionLength; - const numberOfPoints = endPtsOfContours.at(-1) + 1; - const points = []; - while (points.length < numberOfPoints) { - flags = code[i++]; - let repeat = 1; - if (flags & 0x08) { - repeat += code[i++]; - } - while (repeat-- > 0) { - points.push({ - flags - }); - } - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x12) { - case 0x00: - x += readInt16(code, i); - i += 2; - break; - case 0x02: - x -= code[i++]; - break; - case 0x12: - x += code[i++]; - break; - } - points[j].x = x; - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x24) { - case 0x00: - y += readInt16(code, i); - i += 2; - break; - case 0x04: - y -= code[i++]; - break; - case 0x24: - y += code[i++]; - break; - } - points[j].y = y; - } - let startPoint = 0; - for (i = 0; i < numberOfContours; i++) { - const endPoint = endPtsOfContours[i]; - const contour = points.slice(startPoint, endPoint + 1); - if (contour[0].flags & 1) { - contour.push(contour[0]); - } else if (contour.at(-1).flags & 1) { - contour.unshift(contour.at(-1)); - } else { - const p = { - flags: 1, - x: (contour[0].x + contour.at(-1).x) / 2, - y: (contour[0].y + contour.at(-1).y) / 2 - }; - contour.unshift(p); - contour.push(p); - } - moveTo(contour[0].x, contour[0].y); - for (j = 1, jj = contour.length; j < jj; j++) { - if (contour[j].flags & 1) { - lineTo(contour[j].x, contour[j].y); - } else if (contour[j + 1].flags & 1) { - quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); - j++; - } else { - quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); - } - } - startPoint = endPoint + 1; - } - } -} -function compileCharString(charStringCode, cmds, font, glyphId) { - function moveTo(x, y) { - if (firstPoint) { - cmds.add("L", firstPoint); - } - firstPoint = [x, y]; - cmds.add("M", [x, y]); - } - function lineTo(x, y) { - cmds.add("L", [x, y]); - } - function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.add("C", [x1, y1, x2, y2, x, y]); - } - const stack = []; - let x = 0, - y = 0; - let stems = 0; - let firstPoint = null; - function parse(code) { - let i = 0; - while (i < code.length) { - let stackClean = false; - let v = code[i++]; - let xa, xb, ya, yb, y1, y2, y3, n, subrCode; - switch (v) { - case 1: - stems += stack.length >> 1; - stackClean = true; - break; - case 3: - stems += stack.length >> 1; - stackClean = true; - break; - case 4: - y += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 5: - while (stack.length > 0) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - break; - case 6: - while (stack.length > 0) { - x += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - y += stack.shift(); - lineTo(x, y); - } - break; - case 7: - while (stack.length > 0) { - y += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - x += stack.shift(); - lineTo(x, y); - } - break; - case 8: - while (stack.length > 0) { - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 10: - n = stack.pop(); - subrCode = null; - if (font.isCFFCIDFont) { - const fdIndex = font.fdSelect.getFDIndex(glyphId); - if (fdIndex >= 0 && fdIndex < font.fdArray.length) { - const fontDict = font.fdArray[fdIndex]; - let subrs; - if (fontDict.privateDict?.subrsIndex) { - subrs = fontDict.privateDict.subrsIndex.objects; - } - if (subrs) { - n += getSubroutineBias(subrs); - subrCode = subrs[n]; - } - } else { - warn("Invalid fd index for glyph index."); - } - } else { - subrCode = font.subrs[n + font.subrsBias]; - } - if (subrCode) { - parse(subrCode); - } - break; - case 11: - return; - case 12: - v = code[i++]; - switch (v) { - case 34: - xa = x + stack.shift(); - xb = xa + stack.shift(); - y1 = y + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y, xb, y1, x, y1); - xa = x + stack.shift(); - xb = xa + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y, x, y); - break; - case 35: - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - stack.pop(); - break; - case 36: - xa = x + stack.shift(); - y1 = y + stack.shift(); - xb = xa + stack.shift(); - y2 = y1 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y2, x, y2); - xa = x + stack.shift(); - xb = xa + stack.shift(); - y3 = y2 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y2, xb, y3, x, y); - break; - case 37: - const x0 = x, - y0 = y; - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb; - y = yb; - if (Math.abs(x - x0) > Math.abs(y - y0)) { - x += stack.shift(); - } else { - y += stack.shift(); - } - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - default: - throw new FormatError(`unknown operator: 12 ${v}`); - } - break; - case 14: - if (stack.length >= 4) { - const achar = stack.pop(); - const bchar = stack.pop(); - y = stack.pop(); - x = stack.pop(); - cmds.save(); - cmds.translate(x, y); - let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); - compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); - cmds.restore(); - cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); - compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); - } - return; - case 18: - stems += stack.length >> 1; - stackClean = true; - break; - case 19: - stems += stack.length >> 1; - i += stems + 7 >> 3; - stackClean = true; - break; - case 20: - stems += stack.length >> 1; - i += stems + 7 >> 3; - stackClean = true; - break; - case 21: - y += stack.pop(); - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 22: - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 23: - stems += stack.length >> 1; - stackClean = true; - break; - case 24: - while (stack.length > 2) { - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - break; - case 25: - while (stack.length > 6) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - xa = x + stack.shift(); - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - case 26: - if (stack.length % 2) { - x += stack.shift(); - } - while (stack.length > 0) { - xa = x; - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb; - y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 27: - if (stack.length % 2) { - y += stack.shift(); - } - while (stack.length > 0) { - xa = x + stack.shift(); - ya = y; - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb; - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 28: - stack.push(readInt16(code, i)); - i += 2; - break; - case 29: - n = stack.pop() + font.gsubrsBias; - subrCode = font.gsubrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 30: - while (stack.length > 0) { - xa = x; - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - xa = x + stack.shift(); - ya = y; - xb = xa + stack.shift(); - yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 31: - while (stack.length > 0) { - xa = x + stack.shift(); - ya = y; - xb = xa + stack.shift(); - yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - xa = x; - ya = y + stack.shift(); - xb = xa + stack.shift(); - yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - default: - if (v < 32) { - throw new FormatError(`unknown operator: ${v}`); - } - if (v < 247) { - stack.push(v - 139); - } else if (v < 251) { - stack.push((v - 247) * 256 + code[i++] + 108); - } else if (v < 255) { - stack.push(-(v - 251) * 256 - code[i++] - 108); - } else { - stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); - i += 4; - } - break; - } - if (stackClean) { - stack.length = 0; - } - } - } - parse(charStringCode); -} -const NOOP = ""; -class Commands { - cmds = []; - transformStack = []; - currentTransform = [1, 0, 0, 1, 0, 0]; - add(cmd, args) { - if (args) { - const { - currentTransform - } = this; - for (let i = 0, ii = args.length; i < ii; i += 2) { - Util.applyTransform(args, currentTransform, i); - } - this.cmds.push(`${cmd}${args.join(" ")}`); - } else { - this.cmds.push(cmd); - } - } - transform(transf) { - this.currentTransform = Util.transform(this.currentTransform, transf); - } - translate(x, y) { - this.transform([1, 0, 0, 1, x, y]); - } - save() { - this.transformStack.push(this.currentTransform.slice()); - } - restore() { - this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; - } - getSVG() { - return this.cmds.join(""); - } -} -class CompiledFont { - constructor(fontMatrix) { - this.fontMatrix = fontMatrix; - this.compiledGlyphs = Object.create(null); - this.compiledCharCodeToGlyphId = Object.create(null); - } - getPathJs(unicode) { - const { - charCode, - glyphId - } = lookupCmap(this.cmap, unicode); - let fn = this.compiledGlyphs[glyphId], - compileEx; - if (fn === undefined) { - try { - fn = this.compileGlyph(this.glyphs[glyphId], glyphId); - } catch (ex) { - fn = NOOP; - compileEx = ex; - } - this.compiledGlyphs[glyphId] = fn; - } - this.compiledCharCodeToGlyphId[charCode] ??= glyphId; - if (compileEx) { - throw compileEx; - } - return fn; - } - compileGlyph(code, glyphId) { - if (!code?.length || code[0] === 14) { - return NOOP; - } - let fontMatrix = this.fontMatrix; - if (this.isCFFCIDFont) { - const fdIndex = this.fdSelect.getFDIndex(glyphId); - if (fdIndex >= 0 && fdIndex < this.fdArray.length) { - const fontDict = this.fdArray[fdIndex]; - fontMatrix = fontDict.getByName("FontMatrix") || FONT_IDENTITY_MATRIX; - } else { - warn("Invalid fd index for glyph index."); - } - } - assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix."); - const cmds = new Commands(); - cmds.transform(fontMatrix.slice()); - this.compileGlyphImpl(code, cmds, glyphId); - cmds.add("Z"); - return cmds.getSVG(); - } - compileGlyphImpl() { - unreachable("Children classes should implement this."); - } - hasBuiltPath(unicode) { - const { - charCode, - glyphId - } = lookupCmap(this.cmap, unicode); - return this.compiledGlyphs[glyphId] !== undefined && this.compiledCharCodeToGlyphId[charCode] !== undefined; - } -} -class TrueTypeCompiled extends CompiledFont { - constructor(glyphs, cmap, fontMatrix) { - super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]); - this.glyphs = glyphs; - this.cmap = cmap; - } - compileGlyphImpl(code, cmds) { - compileGlyf(code, cmds, this); - } -} -class Type2Compiled extends CompiledFont { - constructor(cffInfo, cmap, fontMatrix) { - super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); - this.glyphs = cffInfo.glyphs; - this.gsubrs = cffInfo.gsubrs || []; - this.subrs = cffInfo.subrs || []; - this.cmap = cmap; - this.glyphNameMap = getGlyphsUnicode(); - this.gsubrsBias = getSubroutineBias(this.gsubrs); - this.subrsBias = getSubroutineBias(this.subrs); - this.isCFFCIDFont = cffInfo.isCFFCIDFont; - this.fdSelect = cffInfo.fdSelect; - this.fdArray = cffInfo.fdArray; - } - compileGlyphImpl(code, cmds, glyphId) { - compileCharString(code, cmds, this, glyphId); - } -} -class FontRendererFactory { - static create(font, seacAnalysisEnabled) { - const data = new Uint8Array(font.data); - let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - const numTables = readUint16(data, 4); - for (let i = 0, p = 12; i < numTables; i++, p += 16) { - const tag = bytesToString(data.subarray(p, p + 4)); - const offset = readUint32(data, p + 8); - const length = readUint32(data, p + 12); - switch (tag) { - case "cmap": - cmap = parseCmap(data, offset, offset + length); - break; - case "glyf": - glyf = data.subarray(offset, offset + length); - break; - case "loca": - loca = data.subarray(offset, offset + length); - break; - case "head": - unitsPerEm = readUint16(data, offset + 18); - indexToLocFormat = readUint16(data, offset + 50); - break; - case "CFF ": - cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); - break; - } - } - if (glyf) { - const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; - return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); - } - return new Type2Compiled(cff, cmap, font.fontMatrix); - } -} - -;// ./src/core/metrics.js - -const getMetrics = getLookupTableFactory(function (t) { - t.Courier = 600; - t["Courier-Bold"] = 600; - t["Courier-BoldOblique"] = 600; - t["Courier-Oblique"] = 600; - t.Helvetica = getLookupTableFactory(function (t) { - t.space = 278; - t.exclam = 278; - t.quotedbl = 355; - t.numbersign = 556; - t.dollar = 556; - t.percent = 889; - t.ampersand = 667; - t.quoteright = 222; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 389; - t.plus = 584; - t.comma = 278; - t.hyphen = 333; - t.period = 278; - t.slash = 278; - t.zero = 556; - t.one = 556; - t.two = 556; - t.three = 556; - t.four = 556; - t.five = 556; - t.six = 556; - t.seven = 556; - t.eight = 556; - t.nine = 556; - t.colon = 278; - t.semicolon = 278; - t.less = 584; - t.equal = 584; - t.greater = 584; - t.question = 556; - t.at = 1015; - t.A = 667; - t.B = 667; - t.C = 722; - t.D = 722; - t.E = 667; - t.F = 611; - t.G = 778; - t.H = 722; - t.I = 278; - t.J = 500; - t.K = 667; - t.L = 556; - t.M = 833; - t.N = 722; - t.O = 778; - t.P = 667; - t.Q = 778; - t.R = 722; - t.S = 667; - t.T = 611; - t.U = 722; - t.V = 667; - t.W = 944; - t.X = 667; - t.Y = 667; - t.Z = 611; - t.bracketleft = 278; - t.backslash = 278; - t.bracketright = 278; - t.asciicircum = 469; - t.underscore = 556; - t.quoteleft = 222; - t.a = 556; - t.b = 556; - t.c = 500; - t.d = 556; - t.e = 556; - t.f = 278; - t.g = 556; - t.h = 556; - t.i = 222; - t.j = 222; - t.k = 500; - t.l = 222; - t.m = 833; - t.n = 556; - t.o = 556; - t.p = 556; - t.q = 556; - t.r = 333; - t.s = 500; - t.t = 278; - t.u = 556; - t.v = 500; - t.w = 722; - t.x = 500; - t.y = 500; - t.z = 500; - t.braceleft = 334; - t.bar = 260; - t.braceright = 334; - t.asciitilde = 584; - t.exclamdown = 333; - t.cent = 556; - t.sterling = 556; - t.fraction = 167; - t.yen = 556; - t.florin = 556; - t.section = 556; - t.currency = 556; - t.quotesingle = 191; - t.quotedblleft = 333; - t.guillemotleft = 556; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 500; - t.fl = 500; - t.endash = 556; - t.dagger = 556; - t.daggerdbl = 556; - t.periodcentered = 278; - t.paragraph = 537; - t.bullet = 350; - t.quotesinglbase = 222; - t.quotedblbase = 333; - t.quotedblright = 333; - t.guillemotright = 556; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 611; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 1000; - t.ordfeminine = 370; - t.Lslash = 556; - t.Oslash = 778; - t.OE = 1000; - t.ordmasculine = 365; - t.ae = 889; - t.dotlessi = 278; - t.lslash = 222; - t.oslash = 611; - t.oe = 944; - t.germandbls = 611; - t.Idieresis = 278; - t.eacute = 556; - t.abreve = 556; - t.uhungarumlaut = 556; - t.ecaron = 556; - t.Ydieresis = 667; - t.divide = 584; - t.Yacute = 667; - t.Acircumflex = 667; - t.aacute = 556; - t.Ucircumflex = 722; - t.yacute = 500; - t.scommaaccent = 500; - t.ecircumflex = 556; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 556; - t.Uacute = 722; - t.uogonek = 556; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 737; - t.Emacron = 667; - t.ccaron = 500; - t.aring = 556; - t.Ncommaaccent = 722; - t.lacute = 222; - t.agrave = 556; - t.Tcommaaccent = 611; - t.Cacute = 722; - t.atilde = 556; - t.Edotaccent = 667; - t.scaron = 500; - t.scedilla = 500; - t.iacute = 278; - t.lozenge = 471; - t.Rcaron = 722; - t.Gcommaaccent = 778; - t.ucircumflex = 556; - t.acircumflex = 556; - t.Amacron = 667; - t.rcaron = 333; - t.ccedilla = 500; - t.Zdotaccent = 611; - t.Thorn = 667; - t.Omacron = 778; - t.Racute = 722; - t.Sacute = 667; - t.dcaron = 643; - t.Umacron = 722; - t.uring = 556; - t.threesuperior = 333; - t.Ograve = 778; - t.Agrave = 667; - t.Abreve = 667; - t.multiply = 584; - t.uacute = 556; - t.Tcaron = 611; - t.partialdiff = 476; - t.ydieresis = 500; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 556; - t.edieresis = 556; - t.cacute = 500; - t.nacute = 556; - t.umacron = 556; - t.Ncaron = 722; - t.Iacute = 278; - t.plusminus = 584; - t.brokenbar = 260; - t.registered = 737; - t.Gbreve = 778; - t.Idotaccent = 278; - t.summation = 600; - t.Egrave = 667; - t.racute = 333; - t.omacron = 556; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 722; - t.lcommaaccent = 222; - t.tcaron = 317; - t.eogonek = 556; - t.Uogonek = 722; - t.Aacute = 667; - t.Adieresis = 667; - t.egrave = 556; - t.zacute = 500; - t.iogonek = 222; - t.Oacute = 778; - t.oacute = 556; - t.amacron = 556; - t.sacute = 500; - t.idieresis = 278; - t.Ocircumflex = 778; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 556; - t.twosuperior = 333; - t.Odieresis = 778; - t.mu = 556; - t.igrave = 278; - t.ohungarumlaut = 556; - t.Eogonek = 667; - t.dcroat = 556; - t.threequarters = 834; - t.Scedilla = 667; - t.lcaron = 299; - t.Kcommaaccent = 667; - t.Lacute = 556; - t.trademark = 1000; - t.edotaccent = 556; - t.Igrave = 278; - t.Imacron = 278; - t.Lcaron = 556; - t.onehalf = 834; - t.lessequal = 549; - t.ocircumflex = 556; - t.ntilde = 556; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 556; - t.gbreve = 556; - t.onequarter = 834; - t.Scaron = 667; - t.Scommaaccent = 667; - t.Ohungarumlaut = 778; - t.degree = 400; - t.ograve = 556; - t.Ccaron = 722; - t.ugrave = 556; - t.radical = 453; - t.Dcaron = 722; - t.rcommaaccent = 333; - t.Ntilde = 722; - t.otilde = 556; - t.Rcommaaccent = 722; - t.Lcommaaccent = 556; - t.Atilde = 667; - t.Aogonek = 667; - t.Aring = 667; - t.Otilde = 778; - t.zdotaccent = 500; - t.Ecaron = 667; - t.Iogonek = 278; - t.kcommaaccent = 500; - t.minus = 584; - t.Icircumflex = 278; - t.ncaron = 556; - t.tcommaaccent = 278; - t.logicalnot = 584; - t.odieresis = 556; - t.udieresis = 556; - t.notequal = 549; - t.gcommaaccent = 556; - t.eth = 556; - t.zcaron = 500; - t.ncommaaccent = 556; - t.onesuperior = 333; - t.imacron = 278; - t.Euro = 556; - }); - t["Helvetica-Bold"] = getLookupTableFactory(function (t) { - t.space = 278; - t.exclam = 333; - t.quotedbl = 474; - t.numbersign = 556; - t.dollar = 556; - t.percent = 889; - t.ampersand = 722; - t.quoteright = 278; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 389; - t.plus = 584; - t.comma = 278; - t.hyphen = 333; - t.period = 278; - t.slash = 278; - t.zero = 556; - t.one = 556; - t.two = 556; - t.three = 556; - t.four = 556; - t.five = 556; - t.six = 556; - t.seven = 556; - t.eight = 556; - t.nine = 556; - t.colon = 333; - t.semicolon = 333; - t.less = 584; - t.equal = 584; - t.greater = 584; - t.question = 611; - t.at = 975; - t.A = 722; - t.B = 722; - t.C = 722; - t.D = 722; - t.E = 667; - t.F = 611; - t.G = 778; - t.H = 722; - t.I = 278; - t.J = 556; - t.K = 722; - t.L = 611; - t.M = 833; - t.N = 722; - t.O = 778; - t.P = 667; - t.Q = 778; - t.R = 722; - t.S = 667; - t.T = 611; - t.U = 722; - t.V = 667; - t.W = 944; - t.X = 667; - t.Y = 667; - t.Z = 611; - t.bracketleft = 333; - t.backslash = 278; - t.bracketright = 333; - t.asciicircum = 584; - t.underscore = 556; - t.quoteleft = 278; - t.a = 556; - t.b = 611; - t.c = 556; - t.d = 611; - t.e = 556; - t.f = 333; - t.g = 611; - t.h = 611; - t.i = 278; - t.j = 278; - t.k = 556; - t.l = 278; - t.m = 889; - t.n = 611; - t.o = 611; - t.p = 611; - t.q = 611; - t.r = 389; - t.s = 556; - t.t = 333; - t.u = 611; - t.v = 556; - t.w = 778; - t.x = 556; - t.y = 556; - t.z = 500; - t.braceleft = 389; - t.bar = 280; - t.braceright = 389; - t.asciitilde = 584; - t.exclamdown = 333; - t.cent = 556; - t.sterling = 556; - t.fraction = 167; - t.yen = 556; - t.florin = 556; - t.section = 556; - t.currency = 556; - t.quotesingle = 238; - t.quotedblleft = 500; - t.guillemotleft = 556; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 611; - t.fl = 611; - t.endash = 556; - t.dagger = 556; - t.daggerdbl = 556; - t.periodcentered = 278; - t.paragraph = 556; - t.bullet = 350; - t.quotesinglbase = 278; - t.quotedblbase = 500; - t.quotedblright = 500; - t.guillemotright = 556; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 611; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 1000; - t.ordfeminine = 370; - t.Lslash = 611; - t.Oslash = 778; - t.OE = 1000; - t.ordmasculine = 365; - t.ae = 889; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 611; - t.oe = 944; - t.germandbls = 611; - t.Idieresis = 278; - t.eacute = 556; - t.abreve = 556; - t.uhungarumlaut = 611; - t.ecaron = 556; - t.Ydieresis = 667; - t.divide = 584; - t.Yacute = 667; - t.Acircumflex = 722; - t.aacute = 556; - t.Ucircumflex = 722; - t.yacute = 556; - t.scommaaccent = 556; - t.ecircumflex = 556; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 556; - t.Uacute = 722; - t.uogonek = 611; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 737; - t.Emacron = 667; - t.ccaron = 556; - t.aring = 556; - t.Ncommaaccent = 722; - t.lacute = 278; - t.agrave = 556; - t.Tcommaaccent = 611; - t.Cacute = 722; - t.atilde = 556; - t.Edotaccent = 667; - t.scaron = 556; - t.scedilla = 556; - t.iacute = 278; - t.lozenge = 494; - t.Rcaron = 722; - t.Gcommaaccent = 778; - t.ucircumflex = 611; - t.acircumflex = 556; - t.Amacron = 722; - t.rcaron = 389; - t.ccedilla = 556; - t.Zdotaccent = 611; - t.Thorn = 667; - t.Omacron = 778; - t.Racute = 722; - t.Sacute = 667; - t.dcaron = 743; - t.Umacron = 722; - t.uring = 611; - t.threesuperior = 333; - t.Ograve = 778; - t.Agrave = 722; - t.Abreve = 722; - t.multiply = 584; - t.uacute = 611; - t.Tcaron = 611; - t.partialdiff = 494; - t.ydieresis = 556; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 556; - t.edieresis = 556; - t.cacute = 556; - t.nacute = 611; - t.umacron = 611; - t.Ncaron = 722; - t.Iacute = 278; - t.plusminus = 584; - t.brokenbar = 280; - t.registered = 737; - t.Gbreve = 778; - t.Idotaccent = 278; - t.summation = 600; - t.Egrave = 667; - t.racute = 389; - t.omacron = 611; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 722; - t.lcommaaccent = 278; - t.tcaron = 389; - t.eogonek = 556; - t.Uogonek = 722; - t.Aacute = 722; - t.Adieresis = 722; - t.egrave = 556; - t.zacute = 500; - t.iogonek = 278; - t.Oacute = 778; - t.oacute = 611; - t.amacron = 556; - t.sacute = 556; - t.idieresis = 278; - t.Ocircumflex = 778; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 611; - t.twosuperior = 333; - t.Odieresis = 778; - t.mu = 611; - t.igrave = 278; - t.ohungarumlaut = 611; - t.Eogonek = 667; - t.dcroat = 611; - t.threequarters = 834; - t.Scedilla = 667; - t.lcaron = 400; - t.Kcommaaccent = 722; - t.Lacute = 611; - t.trademark = 1000; - t.edotaccent = 556; - t.Igrave = 278; - t.Imacron = 278; - t.Lcaron = 611; - t.onehalf = 834; - t.lessequal = 549; - t.ocircumflex = 611; - t.ntilde = 611; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 556; - t.gbreve = 611; - t.onequarter = 834; - t.Scaron = 667; - t.Scommaaccent = 667; - t.Ohungarumlaut = 778; - t.degree = 400; - t.ograve = 611; - t.Ccaron = 722; - t.ugrave = 611; - t.radical = 549; - t.Dcaron = 722; - t.rcommaaccent = 389; - t.Ntilde = 722; - t.otilde = 611; - t.Rcommaaccent = 722; - t.Lcommaaccent = 611; - t.Atilde = 722; - t.Aogonek = 722; - t.Aring = 722; - t.Otilde = 778; - t.zdotaccent = 500; - t.Ecaron = 667; - t.Iogonek = 278; - t.kcommaaccent = 556; - t.minus = 584; - t.Icircumflex = 278; - t.ncaron = 611; - t.tcommaaccent = 333; - t.logicalnot = 584; - t.odieresis = 611; - t.udieresis = 611; - t.notequal = 549; - t.gcommaaccent = 611; - t.eth = 611; - t.zcaron = 500; - t.ncommaaccent = 611; - t.onesuperior = 333; - t.imacron = 278; - t.Euro = 556; - }); - t["Helvetica-BoldOblique"] = getLookupTableFactory(function (t) { - t.space = 278; - t.exclam = 333; - t.quotedbl = 474; - t.numbersign = 556; - t.dollar = 556; - t.percent = 889; - t.ampersand = 722; - t.quoteright = 278; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 389; - t.plus = 584; - t.comma = 278; - t.hyphen = 333; - t.period = 278; - t.slash = 278; - t.zero = 556; - t.one = 556; - t.two = 556; - t.three = 556; - t.four = 556; - t.five = 556; - t.six = 556; - t.seven = 556; - t.eight = 556; - t.nine = 556; - t.colon = 333; - t.semicolon = 333; - t.less = 584; - t.equal = 584; - t.greater = 584; - t.question = 611; - t.at = 975; - t.A = 722; - t.B = 722; - t.C = 722; - t.D = 722; - t.E = 667; - t.F = 611; - t.G = 778; - t.H = 722; - t.I = 278; - t.J = 556; - t.K = 722; - t.L = 611; - t.M = 833; - t.N = 722; - t.O = 778; - t.P = 667; - t.Q = 778; - t.R = 722; - t.S = 667; - t.T = 611; - t.U = 722; - t.V = 667; - t.W = 944; - t.X = 667; - t.Y = 667; - t.Z = 611; - t.bracketleft = 333; - t.backslash = 278; - t.bracketright = 333; - t.asciicircum = 584; - t.underscore = 556; - t.quoteleft = 278; - t.a = 556; - t.b = 611; - t.c = 556; - t.d = 611; - t.e = 556; - t.f = 333; - t.g = 611; - t.h = 611; - t.i = 278; - t.j = 278; - t.k = 556; - t.l = 278; - t.m = 889; - t.n = 611; - t.o = 611; - t.p = 611; - t.q = 611; - t.r = 389; - t.s = 556; - t.t = 333; - t.u = 611; - t.v = 556; - t.w = 778; - t.x = 556; - t.y = 556; - t.z = 500; - t.braceleft = 389; - t.bar = 280; - t.braceright = 389; - t.asciitilde = 584; - t.exclamdown = 333; - t.cent = 556; - t.sterling = 556; - t.fraction = 167; - t.yen = 556; - t.florin = 556; - t.section = 556; - t.currency = 556; - t.quotesingle = 238; - t.quotedblleft = 500; - t.guillemotleft = 556; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 611; - t.fl = 611; - t.endash = 556; - t.dagger = 556; - t.daggerdbl = 556; - t.periodcentered = 278; - t.paragraph = 556; - t.bullet = 350; - t.quotesinglbase = 278; - t.quotedblbase = 500; - t.quotedblright = 500; - t.guillemotright = 556; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 611; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 1000; - t.ordfeminine = 370; - t.Lslash = 611; - t.Oslash = 778; - t.OE = 1000; - t.ordmasculine = 365; - t.ae = 889; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 611; - t.oe = 944; - t.germandbls = 611; - t.Idieresis = 278; - t.eacute = 556; - t.abreve = 556; - t.uhungarumlaut = 611; - t.ecaron = 556; - t.Ydieresis = 667; - t.divide = 584; - t.Yacute = 667; - t.Acircumflex = 722; - t.aacute = 556; - t.Ucircumflex = 722; - t.yacute = 556; - t.scommaaccent = 556; - t.ecircumflex = 556; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 556; - t.Uacute = 722; - t.uogonek = 611; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 737; - t.Emacron = 667; - t.ccaron = 556; - t.aring = 556; - t.Ncommaaccent = 722; - t.lacute = 278; - t.agrave = 556; - t.Tcommaaccent = 611; - t.Cacute = 722; - t.atilde = 556; - t.Edotaccent = 667; - t.scaron = 556; - t.scedilla = 556; - t.iacute = 278; - t.lozenge = 494; - t.Rcaron = 722; - t.Gcommaaccent = 778; - t.ucircumflex = 611; - t.acircumflex = 556; - t.Amacron = 722; - t.rcaron = 389; - t.ccedilla = 556; - t.Zdotaccent = 611; - t.Thorn = 667; - t.Omacron = 778; - t.Racute = 722; - t.Sacute = 667; - t.dcaron = 743; - t.Umacron = 722; - t.uring = 611; - t.threesuperior = 333; - t.Ograve = 778; - t.Agrave = 722; - t.Abreve = 722; - t.multiply = 584; - t.uacute = 611; - t.Tcaron = 611; - t.partialdiff = 494; - t.ydieresis = 556; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 556; - t.edieresis = 556; - t.cacute = 556; - t.nacute = 611; - t.umacron = 611; - t.Ncaron = 722; - t.Iacute = 278; - t.plusminus = 584; - t.brokenbar = 280; - t.registered = 737; - t.Gbreve = 778; - t.Idotaccent = 278; - t.summation = 600; - t.Egrave = 667; - t.racute = 389; - t.omacron = 611; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 722; - t.lcommaaccent = 278; - t.tcaron = 389; - t.eogonek = 556; - t.Uogonek = 722; - t.Aacute = 722; - t.Adieresis = 722; - t.egrave = 556; - t.zacute = 500; - t.iogonek = 278; - t.Oacute = 778; - t.oacute = 611; - t.amacron = 556; - t.sacute = 556; - t.idieresis = 278; - t.Ocircumflex = 778; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 611; - t.twosuperior = 333; - t.Odieresis = 778; - t.mu = 611; - t.igrave = 278; - t.ohungarumlaut = 611; - t.Eogonek = 667; - t.dcroat = 611; - t.threequarters = 834; - t.Scedilla = 667; - t.lcaron = 400; - t.Kcommaaccent = 722; - t.Lacute = 611; - t.trademark = 1000; - t.edotaccent = 556; - t.Igrave = 278; - t.Imacron = 278; - t.Lcaron = 611; - t.onehalf = 834; - t.lessequal = 549; - t.ocircumflex = 611; - t.ntilde = 611; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 556; - t.gbreve = 611; - t.onequarter = 834; - t.Scaron = 667; - t.Scommaaccent = 667; - t.Ohungarumlaut = 778; - t.degree = 400; - t.ograve = 611; - t.Ccaron = 722; - t.ugrave = 611; - t.radical = 549; - t.Dcaron = 722; - t.rcommaaccent = 389; - t.Ntilde = 722; - t.otilde = 611; - t.Rcommaaccent = 722; - t.Lcommaaccent = 611; - t.Atilde = 722; - t.Aogonek = 722; - t.Aring = 722; - t.Otilde = 778; - t.zdotaccent = 500; - t.Ecaron = 667; - t.Iogonek = 278; - t.kcommaaccent = 556; - t.minus = 584; - t.Icircumflex = 278; - t.ncaron = 611; - t.tcommaaccent = 333; - t.logicalnot = 584; - t.odieresis = 611; - t.udieresis = 611; - t.notequal = 549; - t.gcommaaccent = 611; - t.eth = 611; - t.zcaron = 500; - t.ncommaaccent = 611; - t.onesuperior = 333; - t.imacron = 278; - t.Euro = 556; - }); - t["Helvetica-Oblique"] = getLookupTableFactory(function (t) { - t.space = 278; - t.exclam = 278; - t.quotedbl = 355; - t.numbersign = 556; - t.dollar = 556; - t.percent = 889; - t.ampersand = 667; - t.quoteright = 222; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 389; - t.plus = 584; - t.comma = 278; - t.hyphen = 333; - t.period = 278; - t.slash = 278; - t.zero = 556; - t.one = 556; - t.two = 556; - t.three = 556; - t.four = 556; - t.five = 556; - t.six = 556; - t.seven = 556; - t.eight = 556; - t.nine = 556; - t.colon = 278; - t.semicolon = 278; - t.less = 584; - t.equal = 584; - t.greater = 584; - t.question = 556; - t.at = 1015; - t.A = 667; - t.B = 667; - t.C = 722; - t.D = 722; - t.E = 667; - t.F = 611; - t.G = 778; - t.H = 722; - t.I = 278; - t.J = 500; - t.K = 667; - t.L = 556; - t.M = 833; - t.N = 722; - t.O = 778; - t.P = 667; - t.Q = 778; - t.R = 722; - t.S = 667; - t.T = 611; - t.U = 722; - t.V = 667; - t.W = 944; - t.X = 667; - t.Y = 667; - t.Z = 611; - t.bracketleft = 278; - t.backslash = 278; - t.bracketright = 278; - t.asciicircum = 469; - t.underscore = 556; - t.quoteleft = 222; - t.a = 556; - t.b = 556; - t.c = 500; - t.d = 556; - t.e = 556; - t.f = 278; - t.g = 556; - t.h = 556; - t.i = 222; - t.j = 222; - t.k = 500; - t.l = 222; - t.m = 833; - t.n = 556; - t.o = 556; - t.p = 556; - t.q = 556; - t.r = 333; - t.s = 500; - t.t = 278; - t.u = 556; - t.v = 500; - t.w = 722; - t.x = 500; - t.y = 500; - t.z = 500; - t.braceleft = 334; - t.bar = 260; - t.braceright = 334; - t.asciitilde = 584; - t.exclamdown = 333; - t.cent = 556; - t.sterling = 556; - t.fraction = 167; - t.yen = 556; - t.florin = 556; - t.section = 556; - t.currency = 556; - t.quotesingle = 191; - t.quotedblleft = 333; - t.guillemotleft = 556; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 500; - t.fl = 500; - t.endash = 556; - t.dagger = 556; - t.daggerdbl = 556; - t.periodcentered = 278; - t.paragraph = 537; - t.bullet = 350; - t.quotesinglbase = 222; - t.quotedblbase = 333; - t.quotedblright = 333; - t.guillemotright = 556; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 611; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 1000; - t.ordfeminine = 370; - t.Lslash = 556; - t.Oslash = 778; - t.OE = 1000; - t.ordmasculine = 365; - t.ae = 889; - t.dotlessi = 278; - t.lslash = 222; - t.oslash = 611; - t.oe = 944; - t.germandbls = 611; - t.Idieresis = 278; - t.eacute = 556; - t.abreve = 556; - t.uhungarumlaut = 556; - t.ecaron = 556; - t.Ydieresis = 667; - t.divide = 584; - t.Yacute = 667; - t.Acircumflex = 667; - t.aacute = 556; - t.Ucircumflex = 722; - t.yacute = 500; - t.scommaaccent = 500; - t.ecircumflex = 556; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 556; - t.Uacute = 722; - t.uogonek = 556; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 737; - t.Emacron = 667; - t.ccaron = 500; - t.aring = 556; - t.Ncommaaccent = 722; - t.lacute = 222; - t.agrave = 556; - t.Tcommaaccent = 611; - t.Cacute = 722; - t.atilde = 556; - t.Edotaccent = 667; - t.scaron = 500; - t.scedilla = 500; - t.iacute = 278; - t.lozenge = 471; - t.Rcaron = 722; - t.Gcommaaccent = 778; - t.ucircumflex = 556; - t.acircumflex = 556; - t.Amacron = 667; - t.rcaron = 333; - t.ccedilla = 500; - t.Zdotaccent = 611; - t.Thorn = 667; - t.Omacron = 778; - t.Racute = 722; - t.Sacute = 667; - t.dcaron = 643; - t.Umacron = 722; - t.uring = 556; - t.threesuperior = 333; - t.Ograve = 778; - t.Agrave = 667; - t.Abreve = 667; - t.multiply = 584; - t.uacute = 556; - t.Tcaron = 611; - t.partialdiff = 476; - t.ydieresis = 500; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 556; - t.edieresis = 556; - t.cacute = 500; - t.nacute = 556; - t.umacron = 556; - t.Ncaron = 722; - t.Iacute = 278; - t.plusminus = 584; - t.brokenbar = 260; - t.registered = 737; - t.Gbreve = 778; - t.Idotaccent = 278; - t.summation = 600; - t.Egrave = 667; - t.racute = 333; - t.omacron = 556; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 722; - t.lcommaaccent = 222; - t.tcaron = 317; - t.eogonek = 556; - t.Uogonek = 722; - t.Aacute = 667; - t.Adieresis = 667; - t.egrave = 556; - t.zacute = 500; - t.iogonek = 222; - t.Oacute = 778; - t.oacute = 556; - t.amacron = 556; - t.sacute = 500; - t.idieresis = 278; - t.Ocircumflex = 778; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 556; - t.twosuperior = 333; - t.Odieresis = 778; - t.mu = 556; - t.igrave = 278; - t.ohungarumlaut = 556; - t.Eogonek = 667; - t.dcroat = 556; - t.threequarters = 834; - t.Scedilla = 667; - t.lcaron = 299; - t.Kcommaaccent = 667; - t.Lacute = 556; - t.trademark = 1000; - t.edotaccent = 556; - t.Igrave = 278; - t.Imacron = 278; - t.Lcaron = 556; - t.onehalf = 834; - t.lessequal = 549; - t.ocircumflex = 556; - t.ntilde = 556; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 556; - t.gbreve = 556; - t.onequarter = 834; - t.Scaron = 667; - t.Scommaaccent = 667; - t.Ohungarumlaut = 778; - t.degree = 400; - t.ograve = 556; - t.Ccaron = 722; - t.ugrave = 556; - t.radical = 453; - t.Dcaron = 722; - t.rcommaaccent = 333; - t.Ntilde = 722; - t.otilde = 556; - t.Rcommaaccent = 722; - t.Lcommaaccent = 556; - t.Atilde = 667; - t.Aogonek = 667; - t.Aring = 667; - t.Otilde = 778; - t.zdotaccent = 500; - t.Ecaron = 667; - t.Iogonek = 278; - t.kcommaaccent = 500; - t.minus = 584; - t.Icircumflex = 278; - t.ncaron = 556; - t.tcommaaccent = 278; - t.logicalnot = 584; - t.odieresis = 556; - t.udieresis = 556; - t.notequal = 549; - t.gcommaaccent = 556; - t.eth = 556; - t.zcaron = 500; - t.ncommaaccent = 556; - t.onesuperior = 333; - t.imacron = 278; - t.Euro = 556; - }); - t.Symbol = getLookupTableFactory(function (t) { - t.space = 250; - t.exclam = 333; - t.universal = 713; - t.numbersign = 500; - t.existential = 549; - t.percent = 833; - t.ampersand = 778; - t.suchthat = 439; - t.parenleft = 333; - t.parenright = 333; - t.asteriskmath = 500; - t.plus = 549; - t.comma = 250; - t.minus = 549; - t.period = 250; - t.slash = 278; - t.zero = 500; - t.one = 500; - t.two = 500; - t.three = 500; - t.four = 500; - t.five = 500; - t.six = 500; - t.seven = 500; - t.eight = 500; - t.nine = 500; - t.colon = 278; - t.semicolon = 278; - t.less = 549; - t.equal = 549; - t.greater = 549; - t.question = 444; - t.congruent = 549; - t.Alpha = 722; - t.Beta = 667; - t.Chi = 722; - t.Delta = 612; - t.Epsilon = 611; - t.Phi = 763; - t.Gamma = 603; - t.Eta = 722; - t.Iota = 333; - t.theta1 = 631; - t.Kappa = 722; - t.Lambda = 686; - t.Mu = 889; - t.Nu = 722; - t.Omicron = 722; - t.Pi = 768; - t.Theta = 741; - t.Rho = 556; - t.Sigma = 592; - t.Tau = 611; - t.Upsilon = 690; - t.sigma1 = 439; - t.Omega = 768; - t.Xi = 645; - t.Psi = 795; - t.Zeta = 611; - t.bracketleft = 333; - t.therefore = 863; - t.bracketright = 333; - t.perpendicular = 658; - t.underscore = 500; - t.radicalex = 500; - t.alpha = 631; - t.beta = 549; - t.chi = 549; - t.delta = 494; - t.epsilon = 439; - t.phi = 521; - t.gamma = 411; - t.eta = 603; - t.iota = 329; - t.phi1 = 603; - t.kappa = 549; - t.lambda = 549; - t.mu = 576; - t.nu = 521; - t.omicron = 549; - t.pi = 549; - t.theta = 521; - t.rho = 549; - t.sigma = 603; - t.tau = 439; - t.upsilon = 576; - t.omega1 = 713; - t.omega = 686; - t.xi = 493; - t.psi = 686; - t.zeta = 494; - t.braceleft = 480; - t.bar = 200; - t.braceright = 480; - t.similar = 549; - t.Euro = 750; - t.Upsilon1 = 620; - t.minute = 247; - t.lessequal = 549; - t.fraction = 167; - t.infinity = 713; - t.florin = 500; - t.club = 753; - t.diamond = 753; - t.heart = 753; - t.spade = 753; - t.arrowboth = 1042; - t.arrowleft = 987; - t.arrowup = 603; - t.arrowright = 987; - t.arrowdown = 603; - t.degree = 400; - t.plusminus = 549; - t.second = 411; - t.greaterequal = 549; - t.multiply = 549; - t.proportional = 713; - t.partialdiff = 494; - t.bullet = 460; - t.divide = 549; - t.notequal = 549; - t.equivalence = 549; - t.approxequal = 549; - t.ellipsis = 1000; - t.arrowvertex = 603; - t.arrowhorizex = 1000; - t.carriagereturn = 658; - t.aleph = 823; - t.Ifraktur = 686; - t.Rfraktur = 795; - t.weierstrass = 987; - t.circlemultiply = 768; - t.circleplus = 768; - t.emptyset = 823; - t.intersection = 768; - t.union = 768; - t.propersuperset = 713; - t.reflexsuperset = 713; - t.notsubset = 713; - t.propersubset = 713; - t.reflexsubset = 713; - t.element = 713; - t.notelement = 713; - t.angle = 768; - t.gradient = 713; - t.registerserif = 790; - t.copyrightserif = 790; - t.trademarkserif = 890; - t.product = 823; - t.radical = 549; - t.dotmath = 250; - t.logicalnot = 713; - t.logicaland = 603; - t.logicalor = 603; - t.arrowdblboth = 1042; - t.arrowdblleft = 987; - t.arrowdblup = 603; - t.arrowdblright = 987; - t.arrowdbldown = 603; - t.lozenge = 494; - t.angleleft = 329; - t.registersans = 790; - t.copyrightsans = 790; - t.trademarksans = 786; - t.summation = 713; - t.parenlefttp = 384; - t.parenleftex = 384; - t.parenleftbt = 384; - t.bracketlefttp = 384; - t.bracketleftex = 384; - t.bracketleftbt = 384; - t.bracelefttp = 494; - t.braceleftmid = 494; - t.braceleftbt = 494; - t.braceex = 494; - t.angleright = 329; - t.integral = 274; - t.integraltp = 686; - t.integralex = 686; - t.integralbt = 686; - t.parenrighttp = 384; - t.parenrightex = 384; - t.parenrightbt = 384; - t.bracketrighttp = 384; - t.bracketrightex = 384; - t.bracketrightbt = 384; - t.bracerighttp = 494; - t.bracerightmid = 494; - t.bracerightbt = 494; - t.apple = 790; - }); - t["Times-Roman"] = getLookupTableFactory(function (t) { - t.space = 250; - t.exclam = 333; - t.quotedbl = 408; - t.numbersign = 500; - t.dollar = 500; - t.percent = 833; - t.ampersand = 778; - t.quoteright = 333; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 500; - t.plus = 564; - t.comma = 250; - t.hyphen = 333; - t.period = 250; - t.slash = 278; - t.zero = 500; - t.one = 500; - t.two = 500; - t.three = 500; - t.four = 500; - t.five = 500; - t.six = 500; - t.seven = 500; - t.eight = 500; - t.nine = 500; - t.colon = 278; - t.semicolon = 278; - t.less = 564; - t.equal = 564; - t.greater = 564; - t.question = 444; - t.at = 921; - t.A = 722; - t.B = 667; - t.C = 667; - t.D = 722; - t.E = 611; - t.F = 556; - t.G = 722; - t.H = 722; - t.I = 333; - t.J = 389; - t.K = 722; - t.L = 611; - t.M = 889; - t.N = 722; - t.O = 722; - t.P = 556; - t.Q = 722; - t.R = 667; - t.S = 556; - t.T = 611; - t.U = 722; - t.V = 722; - t.W = 944; - t.X = 722; - t.Y = 722; - t.Z = 611; - t.bracketleft = 333; - t.backslash = 278; - t.bracketright = 333; - t.asciicircum = 469; - t.underscore = 500; - t.quoteleft = 333; - t.a = 444; - t.b = 500; - t.c = 444; - t.d = 500; - t.e = 444; - t.f = 333; - t.g = 500; - t.h = 500; - t.i = 278; - t.j = 278; - t.k = 500; - t.l = 278; - t.m = 778; - t.n = 500; - t.o = 500; - t.p = 500; - t.q = 500; - t.r = 333; - t.s = 389; - t.t = 278; - t.u = 500; - t.v = 500; - t.w = 722; - t.x = 500; - t.y = 500; - t.z = 444; - t.braceleft = 480; - t.bar = 200; - t.braceright = 480; - t.asciitilde = 541; - t.exclamdown = 333; - t.cent = 500; - t.sterling = 500; - t.fraction = 167; - t.yen = 500; - t.florin = 500; - t.section = 500; - t.currency = 500; - t.quotesingle = 180; - t.quotedblleft = 444; - t.guillemotleft = 500; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 556; - t.fl = 556; - t.endash = 500; - t.dagger = 500; - t.daggerdbl = 500; - t.periodcentered = 250; - t.paragraph = 453; - t.bullet = 350; - t.quotesinglbase = 333; - t.quotedblbase = 444; - t.quotedblright = 444; - t.guillemotright = 500; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 444; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 889; - t.ordfeminine = 276; - t.Lslash = 611; - t.Oslash = 722; - t.OE = 889; - t.ordmasculine = 310; - t.ae = 667; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 500; - t.oe = 722; - t.germandbls = 500; - t.Idieresis = 333; - t.eacute = 444; - t.abreve = 444; - t.uhungarumlaut = 500; - t.ecaron = 444; - t.Ydieresis = 722; - t.divide = 564; - t.Yacute = 722; - t.Acircumflex = 722; - t.aacute = 444; - t.Ucircumflex = 722; - t.yacute = 500; - t.scommaaccent = 389; - t.ecircumflex = 444; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 444; - t.Uacute = 722; - t.uogonek = 500; - t.Edieresis = 611; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 760; - t.Emacron = 611; - t.ccaron = 444; - t.aring = 444; - t.Ncommaaccent = 722; - t.lacute = 278; - t.agrave = 444; - t.Tcommaaccent = 611; - t.Cacute = 667; - t.atilde = 444; - t.Edotaccent = 611; - t.scaron = 389; - t.scedilla = 389; - t.iacute = 278; - t.lozenge = 471; - t.Rcaron = 667; - t.Gcommaaccent = 722; - t.ucircumflex = 500; - t.acircumflex = 444; - t.Amacron = 722; - t.rcaron = 333; - t.ccedilla = 444; - t.Zdotaccent = 611; - t.Thorn = 556; - t.Omacron = 722; - t.Racute = 667; - t.Sacute = 556; - t.dcaron = 588; - t.Umacron = 722; - t.uring = 500; - t.threesuperior = 300; - t.Ograve = 722; - t.Agrave = 722; - t.Abreve = 722; - t.multiply = 564; - t.uacute = 500; - t.Tcaron = 611; - t.partialdiff = 476; - t.ydieresis = 500; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 611; - t.adieresis = 444; - t.edieresis = 444; - t.cacute = 444; - t.nacute = 500; - t.umacron = 500; - t.Ncaron = 722; - t.Iacute = 333; - t.plusminus = 564; - t.brokenbar = 200; - t.registered = 760; - t.Gbreve = 722; - t.Idotaccent = 333; - t.summation = 600; - t.Egrave = 611; - t.racute = 333; - t.omacron = 500; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 667; - t.lcommaaccent = 278; - t.tcaron = 326; - t.eogonek = 444; - t.Uogonek = 722; - t.Aacute = 722; - t.Adieresis = 722; - t.egrave = 444; - t.zacute = 444; - t.iogonek = 278; - t.Oacute = 722; - t.oacute = 500; - t.amacron = 444; - t.sacute = 389; - t.idieresis = 278; - t.Ocircumflex = 722; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 500; - t.twosuperior = 300; - t.Odieresis = 722; - t.mu = 500; - t.igrave = 278; - t.ohungarumlaut = 500; - t.Eogonek = 611; - t.dcroat = 500; - t.threequarters = 750; - t.Scedilla = 556; - t.lcaron = 344; - t.Kcommaaccent = 722; - t.Lacute = 611; - t.trademark = 980; - t.edotaccent = 444; - t.Igrave = 333; - t.Imacron = 333; - t.Lcaron = 611; - t.onehalf = 750; - t.lessequal = 549; - t.ocircumflex = 500; - t.ntilde = 500; - t.Uhungarumlaut = 722; - t.Eacute = 611; - t.emacron = 444; - t.gbreve = 500; - t.onequarter = 750; - t.Scaron = 556; - t.Scommaaccent = 556; - t.Ohungarumlaut = 722; - t.degree = 400; - t.ograve = 500; - t.Ccaron = 667; - t.ugrave = 500; - t.radical = 453; - t.Dcaron = 722; - t.rcommaaccent = 333; - t.Ntilde = 722; - t.otilde = 500; - t.Rcommaaccent = 667; - t.Lcommaaccent = 611; - t.Atilde = 722; - t.Aogonek = 722; - t.Aring = 722; - t.Otilde = 722; - t.zdotaccent = 444; - t.Ecaron = 611; - t.Iogonek = 333; - t.kcommaaccent = 500; - t.minus = 564; - t.Icircumflex = 333; - t.ncaron = 500; - t.tcommaaccent = 278; - t.logicalnot = 564; - t.odieresis = 500; - t.udieresis = 500; - t.notequal = 549; - t.gcommaaccent = 500; - t.eth = 500; - t.zcaron = 444; - t.ncommaaccent = 500; - t.onesuperior = 300; - t.imacron = 278; - t.Euro = 500; - }); - t["Times-Bold"] = getLookupTableFactory(function (t) { - t.space = 250; - t.exclam = 333; - t.quotedbl = 555; - t.numbersign = 500; - t.dollar = 500; - t.percent = 1000; - t.ampersand = 833; - t.quoteright = 333; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 500; - t.plus = 570; - t.comma = 250; - t.hyphen = 333; - t.period = 250; - t.slash = 278; - t.zero = 500; - t.one = 500; - t.two = 500; - t.three = 500; - t.four = 500; - t.five = 500; - t.six = 500; - t.seven = 500; - t.eight = 500; - t.nine = 500; - t.colon = 333; - t.semicolon = 333; - t.less = 570; - t.equal = 570; - t.greater = 570; - t.question = 500; - t.at = 930; - t.A = 722; - t.B = 667; - t.C = 722; - t.D = 722; - t.E = 667; - t.F = 611; - t.G = 778; - t.H = 778; - t.I = 389; - t.J = 500; - t.K = 778; - t.L = 667; - t.M = 944; - t.N = 722; - t.O = 778; - t.P = 611; - t.Q = 778; - t.R = 722; - t.S = 556; - t.T = 667; - t.U = 722; - t.V = 722; - t.W = 1000; - t.X = 722; - t.Y = 722; - t.Z = 667; - t.bracketleft = 333; - t.backslash = 278; - t.bracketright = 333; - t.asciicircum = 581; - t.underscore = 500; - t.quoteleft = 333; - t.a = 500; - t.b = 556; - t.c = 444; - t.d = 556; - t.e = 444; - t.f = 333; - t.g = 500; - t.h = 556; - t.i = 278; - t.j = 333; - t.k = 556; - t.l = 278; - t.m = 833; - t.n = 556; - t.o = 500; - t.p = 556; - t.q = 556; - t.r = 444; - t.s = 389; - t.t = 333; - t.u = 556; - t.v = 500; - t.w = 722; - t.x = 500; - t.y = 500; - t.z = 444; - t.braceleft = 394; - t.bar = 220; - t.braceright = 394; - t.asciitilde = 520; - t.exclamdown = 333; - t.cent = 500; - t.sterling = 500; - t.fraction = 167; - t.yen = 500; - t.florin = 500; - t.section = 500; - t.currency = 500; - t.quotesingle = 278; - t.quotedblleft = 500; - t.guillemotleft = 500; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 556; - t.fl = 556; - t.endash = 500; - t.dagger = 500; - t.daggerdbl = 500; - t.periodcentered = 250; - t.paragraph = 540; - t.bullet = 350; - t.quotesinglbase = 333; - t.quotedblbase = 500; - t.quotedblright = 500; - t.guillemotright = 500; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 500; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 1000; - t.ordfeminine = 300; - t.Lslash = 667; - t.Oslash = 778; - t.OE = 1000; - t.ordmasculine = 330; - t.ae = 722; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 500; - t.oe = 722; - t.germandbls = 556; - t.Idieresis = 389; - t.eacute = 444; - t.abreve = 500; - t.uhungarumlaut = 556; - t.ecaron = 444; - t.Ydieresis = 722; - t.divide = 570; - t.Yacute = 722; - t.Acircumflex = 722; - t.aacute = 500; - t.Ucircumflex = 722; - t.yacute = 500; - t.scommaaccent = 389; - t.ecircumflex = 444; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 500; - t.Uacute = 722; - t.uogonek = 556; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 747; - t.Emacron = 667; - t.ccaron = 444; - t.aring = 500; - t.Ncommaaccent = 722; - t.lacute = 278; - t.agrave = 500; - t.Tcommaaccent = 667; - t.Cacute = 722; - t.atilde = 500; - t.Edotaccent = 667; - t.scaron = 389; - t.scedilla = 389; - t.iacute = 278; - t.lozenge = 494; - t.Rcaron = 722; - t.Gcommaaccent = 778; - t.ucircumflex = 556; - t.acircumflex = 500; - t.Amacron = 722; - t.rcaron = 444; - t.ccedilla = 444; - t.Zdotaccent = 667; - t.Thorn = 611; - t.Omacron = 778; - t.Racute = 722; - t.Sacute = 556; - t.dcaron = 672; - t.Umacron = 722; - t.uring = 556; - t.threesuperior = 300; - t.Ograve = 778; - t.Agrave = 722; - t.Abreve = 722; - t.multiply = 570; - t.uacute = 556; - t.Tcaron = 667; - t.partialdiff = 494; - t.ydieresis = 500; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 500; - t.edieresis = 444; - t.cacute = 444; - t.nacute = 556; - t.umacron = 556; - t.Ncaron = 722; - t.Iacute = 389; - t.plusminus = 570; - t.brokenbar = 220; - t.registered = 747; - t.Gbreve = 778; - t.Idotaccent = 389; - t.summation = 600; - t.Egrave = 667; - t.racute = 444; - t.omacron = 500; - t.Zacute = 667; - t.Zcaron = 667; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 722; - t.lcommaaccent = 278; - t.tcaron = 416; - t.eogonek = 444; - t.Uogonek = 722; - t.Aacute = 722; - t.Adieresis = 722; - t.egrave = 444; - t.zacute = 444; - t.iogonek = 278; - t.Oacute = 778; - t.oacute = 500; - t.amacron = 500; - t.sacute = 389; - t.idieresis = 278; - t.Ocircumflex = 778; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 556; - t.twosuperior = 300; - t.Odieresis = 778; - t.mu = 556; - t.igrave = 278; - t.ohungarumlaut = 500; - t.Eogonek = 667; - t.dcroat = 556; - t.threequarters = 750; - t.Scedilla = 556; - t.lcaron = 394; - t.Kcommaaccent = 778; - t.Lacute = 667; - t.trademark = 1000; - t.edotaccent = 444; - t.Igrave = 389; - t.Imacron = 389; - t.Lcaron = 667; - t.onehalf = 750; - t.lessequal = 549; - t.ocircumflex = 500; - t.ntilde = 556; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 444; - t.gbreve = 500; - t.onequarter = 750; - t.Scaron = 556; - t.Scommaaccent = 556; - t.Ohungarumlaut = 778; - t.degree = 400; - t.ograve = 500; - t.Ccaron = 722; - t.ugrave = 556; - t.radical = 549; - t.Dcaron = 722; - t.rcommaaccent = 444; - t.Ntilde = 722; - t.otilde = 500; - t.Rcommaaccent = 722; - t.Lcommaaccent = 667; - t.Atilde = 722; - t.Aogonek = 722; - t.Aring = 722; - t.Otilde = 778; - t.zdotaccent = 444; - t.Ecaron = 667; - t.Iogonek = 389; - t.kcommaaccent = 556; - t.minus = 570; - t.Icircumflex = 389; - t.ncaron = 556; - t.tcommaaccent = 333; - t.logicalnot = 570; - t.odieresis = 500; - t.udieresis = 556; - t.notequal = 549; - t.gcommaaccent = 500; - t.eth = 500; - t.zcaron = 444; - t.ncommaaccent = 556; - t.onesuperior = 300; - t.imacron = 278; - t.Euro = 500; - }); - t["Times-BoldItalic"] = getLookupTableFactory(function (t) { - t.space = 250; - t.exclam = 389; - t.quotedbl = 555; - t.numbersign = 500; - t.dollar = 500; - t.percent = 833; - t.ampersand = 778; - t.quoteright = 333; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 500; - t.plus = 570; - t.comma = 250; - t.hyphen = 333; - t.period = 250; - t.slash = 278; - t.zero = 500; - t.one = 500; - t.two = 500; - t.three = 500; - t.four = 500; - t.five = 500; - t.six = 500; - t.seven = 500; - t.eight = 500; - t.nine = 500; - t.colon = 333; - t.semicolon = 333; - t.less = 570; - t.equal = 570; - t.greater = 570; - t.question = 500; - t.at = 832; - t.A = 667; - t.B = 667; - t.C = 667; - t.D = 722; - t.E = 667; - t.F = 667; - t.G = 722; - t.H = 778; - t.I = 389; - t.J = 500; - t.K = 667; - t.L = 611; - t.M = 889; - t.N = 722; - t.O = 722; - t.P = 611; - t.Q = 722; - t.R = 667; - t.S = 556; - t.T = 611; - t.U = 722; - t.V = 667; - t.W = 889; - t.X = 667; - t.Y = 611; - t.Z = 611; - t.bracketleft = 333; - t.backslash = 278; - t.bracketright = 333; - t.asciicircum = 570; - t.underscore = 500; - t.quoteleft = 333; - t.a = 500; - t.b = 500; - t.c = 444; - t.d = 500; - t.e = 444; - t.f = 333; - t.g = 500; - t.h = 556; - t.i = 278; - t.j = 278; - t.k = 500; - t.l = 278; - t.m = 778; - t.n = 556; - t.o = 500; - t.p = 500; - t.q = 500; - t.r = 389; - t.s = 389; - t.t = 278; - t.u = 556; - t.v = 444; - t.w = 667; - t.x = 500; - t.y = 444; - t.z = 389; - t.braceleft = 348; - t.bar = 220; - t.braceright = 348; - t.asciitilde = 570; - t.exclamdown = 389; - t.cent = 500; - t.sterling = 500; - t.fraction = 167; - t.yen = 500; - t.florin = 500; - t.section = 500; - t.currency = 500; - t.quotesingle = 278; - t.quotedblleft = 500; - t.guillemotleft = 500; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 556; - t.fl = 556; - t.endash = 500; - t.dagger = 500; - t.daggerdbl = 500; - t.periodcentered = 250; - t.paragraph = 500; - t.bullet = 350; - t.quotesinglbase = 333; - t.quotedblbase = 500; - t.quotedblright = 500; - t.guillemotright = 500; - t.ellipsis = 1000; - t.perthousand = 1000; - t.questiondown = 500; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 1000; - t.AE = 944; - t.ordfeminine = 266; - t.Lslash = 611; - t.Oslash = 722; - t.OE = 944; - t.ordmasculine = 300; - t.ae = 722; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 500; - t.oe = 722; - t.germandbls = 500; - t.Idieresis = 389; - t.eacute = 444; - t.abreve = 500; - t.uhungarumlaut = 556; - t.ecaron = 444; - t.Ydieresis = 611; - t.divide = 570; - t.Yacute = 611; - t.Acircumflex = 667; - t.aacute = 500; - t.Ucircumflex = 722; - t.yacute = 444; - t.scommaaccent = 389; - t.ecircumflex = 444; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 500; - t.Uacute = 722; - t.uogonek = 556; - t.Edieresis = 667; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 747; - t.Emacron = 667; - t.ccaron = 444; - t.aring = 500; - t.Ncommaaccent = 722; - t.lacute = 278; - t.agrave = 500; - t.Tcommaaccent = 611; - t.Cacute = 667; - t.atilde = 500; - t.Edotaccent = 667; - t.scaron = 389; - t.scedilla = 389; - t.iacute = 278; - t.lozenge = 494; - t.Rcaron = 667; - t.Gcommaaccent = 722; - t.ucircumflex = 556; - t.acircumflex = 500; - t.Amacron = 667; - t.rcaron = 389; - t.ccedilla = 444; - t.Zdotaccent = 611; - t.Thorn = 611; - t.Omacron = 722; - t.Racute = 667; - t.Sacute = 556; - t.dcaron = 608; - t.Umacron = 722; - t.uring = 556; - t.threesuperior = 300; - t.Ograve = 722; - t.Agrave = 667; - t.Abreve = 667; - t.multiply = 570; - t.uacute = 556; - t.Tcaron = 611; - t.partialdiff = 494; - t.ydieresis = 444; - t.Nacute = 722; - t.icircumflex = 278; - t.Ecircumflex = 667; - t.adieresis = 500; - t.edieresis = 444; - t.cacute = 444; - t.nacute = 556; - t.umacron = 556; - t.Ncaron = 722; - t.Iacute = 389; - t.plusminus = 570; - t.brokenbar = 220; - t.registered = 747; - t.Gbreve = 722; - t.Idotaccent = 389; - t.summation = 600; - t.Egrave = 667; - t.racute = 389; - t.omacron = 500; - t.Zacute = 611; - t.Zcaron = 611; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 667; - t.lcommaaccent = 278; - t.tcaron = 366; - t.eogonek = 444; - t.Uogonek = 722; - t.Aacute = 667; - t.Adieresis = 667; - t.egrave = 444; - t.zacute = 389; - t.iogonek = 278; - t.Oacute = 722; - t.oacute = 500; - t.amacron = 500; - t.sacute = 389; - t.idieresis = 278; - t.Ocircumflex = 722; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 500; - t.twosuperior = 300; - t.Odieresis = 722; - t.mu = 576; - t.igrave = 278; - t.ohungarumlaut = 500; - t.Eogonek = 667; - t.dcroat = 500; - t.threequarters = 750; - t.Scedilla = 556; - t.lcaron = 382; - t.Kcommaaccent = 667; - t.Lacute = 611; - t.trademark = 1000; - t.edotaccent = 444; - t.Igrave = 389; - t.Imacron = 389; - t.Lcaron = 611; - t.onehalf = 750; - t.lessequal = 549; - t.ocircumflex = 500; - t.ntilde = 556; - t.Uhungarumlaut = 722; - t.Eacute = 667; - t.emacron = 444; - t.gbreve = 500; - t.onequarter = 750; - t.Scaron = 556; - t.Scommaaccent = 556; - t.Ohungarumlaut = 722; - t.degree = 400; - t.ograve = 500; - t.Ccaron = 667; - t.ugrave = 556; - t.radical = 549; - t.Dcaron = 722; - t.rcommaaccent = 389; - t.Ntilde = 722; - t.otilde = 500; - t.Rcommaaccent = 667; - t.Lcommaaccent = 611; - t.Atilde = 667; - t.Aogonek = 667; - t.Aring = 667; - t.Otilde = 722; - t.zdotaccent = 389; - t.Ecaron = 667; - t.Iogonek = 389; - t.kcommaaccent = 500; - t.minus = 606; - t.Icircumflex = 389; - t.ncaron = 556; - t.tcommaaccent = 278; - t.logicalnot = 606; - t.odieresis = 500; - t.udieresis = 556; - t.notequal = 549; - t.gcommaaccent = 500; - t.eth = 500; - t.zcaron = 389; - t.ncommaaccent = 556; - t.onesuperior = 300; - t.imacron = 278; - t.Euro = 500; - }); - t["Times-Italic"] = getLookupTableFactory(function (t) { - t.space = 250; - t.exclam = 333; - t.quotedbl = 420; - t.numbersign = 500; - t.dollar = 500; - t.percent = 833; - t.ampersand = 778; - t.quoteright = 333; - t.parenleft = 333; - t.parenright = 333; - t.asterisk = 500; - t.plus = 675; - t.comma = 250; - t.hyphen = 333; - t.period = 250; - t.slash = 278; - t.zero = 500; - t.one = 500; - t.two = 500; - t.three = 500; - t.four = 500; - t.five = 500; - t.six = 500; - t.seven = 500; - t.eight = 500; - t.nine = 500; - t.colon = 333; - t.semicolon = 333; - t.less = 675; - t.equal = 675; - t.greater = 675; - t.question = 500; - t.at = 920; - t.A = 611; - t.B = 611; - t.C = 667; - t.D = 722; - t.E = 611; - t.F = 611; - t.G = 722; - t.H = 722; - t.I = 333; - t.J = 444; - t.K = 667; - t.L = 556; - t.M = 833; - t.N = 667; - t.O = 722; - t.P = 611; - t.Q = 722; - t.R = 611; - t.S = 500; - t.T = 556; - t.U = 722; - t.V = 611; - t.W = 833; - t.X = 611; - t.Y = 556; - t.Z = 556; - t.bracketleft = 389; - t.backslash = 278; - t.bracketright = 389; - t.asciicircum = 422; - t.underscore = 500; - t.quoteleft = 333; - t.a = 500; - t.b = 500; - t.c = 444; - t.d = 500; - t.e = 444; - t.f = 278; - t.g = 500; - t.h = 500; - t.i = 278; - t.j = 278; - t.k = 444; - t.l = 278; - t.m = 722; - t.n = 500; - t.o = 500; - t.p = 500; - t.q = 500; - t.r = 389; - t.s = 389; - t.t = 278; - t.u = 500; - t.v = 444; - t.w = 667; - t.x = 444; - t.y = 444; - t.z = 389; - t.braceleft = 400; - t.bar = 275; - t.braceright = 400; - t.asciitilde = 541; - t.exclamdown = 389; - t.cent = 500; - t.sterling = 500; - t.fraction = 167; - t.yen = 500; - t.florin = 500; - t.section = 500; - t.currency = 500; - t.quotesingle = 214; - t.quotedblleft = 556; - t.guillemotleft = 500; - t.guilsinglleft = 333; - t.guilsinglright = 333; - t.fi = 500; - t.fl = 500; - t.endash = 500; - t.dagger = 500; - t.daggerdbl = 500; - t.periodcentered = 250; - t.paragraph = 523; - t.bullet = 350; - t.quotesinglbase = 333; - t.quotedblbase = 556; - t.quotedblright = 556; - t.guillemotright = 500; - t.ellipsis = 889; - t.perthousand = 1000; - t.questiondown = 500; - t.grave = 333; - t.acute = 333; - t.circumflex = 333; - t.tilde = 333; - t.macron = 333; - t.breve = 333; - t.dotaccent = 333; - t.dieresis = 333; - t.ring = 333; - t.cedilla = 333; - t.hungarumlaut = 333; - t.ogonek = 333; - t.caron = 333; - t.emdash = 889; - t.AE = 889; - t.ordfeminine = 276; - t.Lslash = 556; - t.Oslash = 722; - t.OE = 944; - t.ordmasculine = 310; - t.ae = 667; - t.dotlessi = 278; - t.lslash = 278; - t.oslash = 500; - t.oe = 667; - t.germandbls = 500; - t.Idieresis = 333; - t.eacute = 444; - t.abreve = 500; - t.uhungarumlaut = 500; - t.ecaron = 444; - t.Ydieresis = 556; - t.divide = 675; - t.Yacute = 556; - t.Acircumflex = 611; - t.aacute = 500; - t.Ucircumflex = 722; - t.yacute = 444; - t.scommaaccent = 389; - t.ecircumflex = 444; - t.Uring = 722; - t.Udieresis = 722; - t.aogonek = 500; - t.Uacute = 722; - t.uogonek = 500; - t.Edieresis = 611; - t.Dcroat = 722; - t.commaaccent = 250; - t.copyright = 760; - t.Emacron = 611; - t.ccaron = 444; - t.aring = 500; - t.Ncommaaccent = 667; - t.lacute = 278; - t.agrave = 500; - t.Tcommaaccent = 556; - t.Cacute = 667; - t.atilde = 500; - t.Edotaccent = 611; - t.scaron = 389; - t.scedilla = 389; - t.iacute = 278; - t.lozenge = 471; - t.Rcaron = 611; - t.Gcommaaccent = 722; - t.ucircumflex = 500; - t.acircumflex = 500; - t.Amacron = 611; - t.rcaron = 389; - t.ccedilla = 444; - t.Zdotaccent = 556; - t.Thorn = 611; - t.Omacron = 722; - t.Racute = 611; - t.Sacute = 500; - t.dcaron = 544; - t.Umacron = 722; - t.uring = 500; - t.threesuperior = 300; - t.Ograve = 722; - t.Agrave = 611; - t.Abreve = 611; - t.multiply = 675; - t.uacute = 500; - t.Tcaron = 556; - t.partialdiff = 476; - t.ydieresis = 444; - t.Nacute = 667; - t.icircumflex = 278; - t.Ecircumflex = 611; - t.adieresis = 500; - t.edieresis = 444; - t.cacute = 444; - t.nacute = 500; - t.umacron = 500; - t.Ncaron = 667; - t.Iacute = 333; - t.plusminus = 675; - t.brokenbar = 275; - t.registered = 760; - t.Gbreve = 722; - t.Idotaccent = 333; - t.summation = 600; - t.Egrave = 611; - t.racute = 389; - t.omacron = 500; - t.Zacute = 556; - t.Zcaron = 556; - t.greaterequal = 549; - t.Eth = 722; - t.Ccedilla = 667; - t.lcommaaccent = 278; - t.tcaron = 300; - t.eogonek = 444; - t.Uogonek = 722; - t.Aacute = 611; - t.Adieresis = 611; - t.egrave = 444; - t.zacute = 389; - t.iogonek = 278; - t.Oacute = 722; - t.oacute = 500; - t.amacron = 500; - t.sacute = 389; - t.idieresis = 278; - t.Ocircumflex = 722; - t.Ugrave = 722; - t.Delta = 612; - t.thorn = 500; - t.twosuperior = 300; - t.Odieresis = 722; - t.mu = 500; - t.igrave = 278; - t.ohungarumlaut = 500; - t.Eogonek = 611; - t.dcroat = 500; - t.threequarters = 750; - t.Scedilla = 500; - t.lcaron = 300; - t.Kcommaaccent = 667; - t.Lacute = 556; - t.trademark = 980; - t.edotaccent = 444; - t.Igrave = 333; - t.Imacron = 333; - t.Lcaron = 611; - t.onehalf = 750; - t.lessequal = 549; - t.ocircumflex = 500; - t.ntilde = 500; - t.Uhungarumlaut = 722; - t.Eacute = 611; - t.emacron = 444; - t.gbreve = 500; - t.onequarter = 750; - t.Scaron = 500; - t.Scommaaccent = 500; - t.Ohungarumlaut = 722; - t.degree = 400; - t.ograve = 500; - t.Ccaron = 667; - t.ugrave = 500; - t.radical = 453; - t.Dcaron = 722; - t.rcommaaccent = 389; - t.Ntilde = 667; - t.otilde = 500; - t.Rcommaaccent = 611; - t.Lcommaaccent = 556; - t.Atilde = 611; - t.Aogonek = 611; - t.Aring = 611; - t.Otilde = 722; - t.zdotaccent = 389; - t.Ecaron = 611; - t.Iogonek = 333; - t.kcommaaccent = 444; - t.minus = 675; - t.Icircumflex = 333; - t.ncaron = 500; - t.tcommaaccent = 278; - t.logicalnot = 675; - t.odieresis = 500; - t.udieresis = 500; - t.notequal = 549; - t.gcommaaccent = 500; - t.eth = 500; - t.zcaron = 389; - t.ncommaaccent = 500; - t.onesuperior = 300; - t.imacron = 278; - t.Euro = 500; - }); - t.ZapfDingbats = getLookupTableFactory(function (t) { - t.space = 278; - t.a1 = 974; - t.a2 = 961; - t.a202 = 974; - t.a3 = 980; - t.a4 = 719; - t.a5 = 789; - t.a119 = 790; - t.a118 = 791; - t.a117 = 690; - t.a11 = 960; - t.a12 = 939; - t.a13 = 549; - t.a14 = 855; - t.a15 = 911; - t.a16 = 933; - t.a105 = 911; - t.a17 = 945; - t.a18 = 974; - t.a19 = 755; - t.a20 = 846; - t.a21 = 762; - t.a22 = 761; - t.a23 = 571; - t.a24 = 677; - t.a25 = 763; - t.a26 = 760; - t.a27 = 759; - t.a28 = 754; - t.a6 = 494; - t.a7 = 552; - t.a8 = 537; - t.a9 = 577; - t.a10 = 692; - t.a29 = 786; - t.a30 = 788; - t.a31 = 788; - t.a32 = 790; - t.a33 = 793; - t.a34 = 794; - t.a35 = 816; - t.a36 = 823; - t.a37 = 789; - t.a38 = 841; - t.a39 = 823; - t.a40 = 833; - t.a41 = 816; - t.a42 = 831; - t.a43 = 923; - t.a44 = 744; - t.a45 = 723; - t.a46 = 749; - t.a47 = 790; - t.a48 = 792; - t.a49 = 695; - t.a50 = 776; - t.a51 = 768; - t.a52 = 792; - t.a53 = 759; - t.a54 = 707; - t.a55 = 708; - t.a56 = 682; - t.a57 = 701; - t.a58 = 826; - t.a59 = 815; - t.a60 = 789; - t.a61 = 789; - t.a62 = 707; - t.a63 = 687; - t.a64 = 696; - t.a65 = 689; - t.a66 = 786; - t.a67 = 787; - t.a68 = 713; - t.a69 = 791; - t.a70 = 785; - t.a71 = 791; - t.a72 = 873; - t.a73 = 761; - t.a74 = 762; - t.a203 = 762; - t.a75 = 759; - t.a204 = 759; - t.a76 = 892; - t.a77 = 892; - t.a78 = 788; - t.a79 = 784; - t.a81 = 438; - t.a82 = 138; - t.a83 = 277; - t.a84 = 415; - t.a97 = 392; - t.a98 = 392; - t.a99 = 668; - t.a100 = 668; - t.a89 = 390; - t.a90 = 390; - t.a93 = 317; - t.a94 = 317; - t.a91 = 276; - t.a92 = 276; - t.a205 = 509; - t.a85 = 509; - t.a206 = 410; - t.a86 = 410; - t.a87 = 234; - t.a88 = 234; - t.a95 = 334; - t.a96 = 334; - t.a101 = 732; - t.a102 = 544; - t.a103 = 544; - t.a104 = 910; - t.a106 = 667; - t.a107 = 760; - t.a108 = 760; - t.a112 = 776; - t.a111 = 595; - t.a110 = 694; - t.a109 = 626; - t.a120 = 788; - t.a121 = 788; - t.a122 = 788; - t.a123 = 788; - t.a124 = 788; - t.a125 = 788; - t.a126 = 788; - t.a127 = 788; - t.a128 = 788; - t.a129 = 788; - t.a130 = 788; - t.a131 = 788; - t.a132 = 788; - t.a133 = 788; - t.a134 = 788; - t.a135 = 788; - t.a136 = 788; - t.a137 = 788; - t.a138 = 788; - t.a139 = 788; - t.a140 = 788; - t.a141 = 788; - t.a142 = 788; - t.a143 = 788; - t.a144 = 788; - t.a145 = 788; - t.a146 = 788; - t.a147 = 788; - t.a148 = 788; - t.a149 = 788; - t.a150 = 788; - t.a151 = 788; - t.a152 = 788; - t.a153 = 788; - t.a154 = 788; - t.a155 = 788; - t.a156 = 788; - t.a157 = 788; - t.a158 = 788; - t.a159 = 788; - t.a160 = 894; - t.a161 = 838; - t.a163 = 1016; - t.a164 = 458; - t.a196 = 748; - t.a165 = 924; - t.a192 = 748; - t.a166 = 918; - t.a167 = 927; - t.a168 = 928; - t.a169 = 928; - t.a170 = 834; - t.a171 = 873; - t.a172 = 828; - t.a173 = 924; - t.a162 = 924; - t.a174 = 917; - t.a175 = 930; - t.a176 = 931; - t.a177 = 463; - t.a178 = 883; - t.a179 = 836; - t.a193 = 836; - t.a180 = 867; - t.a199 = 867; - t.a181 = 696; - t.a200 = 696; - t.a182 = 874; - t.a201 = 874; - t.a183 = 760; - t.a184 = 946; - t.a197 = 771; - t.a185 = 865; - t.a194 = 771; - t.a198 = 888; - t.a186 = 967; - t.a195 = 888; - t.a187 = 831; - t.a188 = 873; - t.a189 = 927; - t.a190 = 970; - t.a191 = 918; - }); -}); -const getFontBasicMetrics = getLookupTableFactory(function (t) { - t.Courier = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: -426 - }; - t["Courier-Bold"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 439 - }; - t["Courier-Oblique"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 426 - }; - t["Courier-BoldOblique"] = { - ascent: 629, - descent: -157, - capHeight: 562, - xHeight: 426 - }; - t.Helvetica = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 523 - }; - t["Helvetica-Bold"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 532 - }; - t["Helvetica-Oblique"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 523 - }; - t["Helvetica-BoldOblique"] = { - ascent: 718, - descent: -207, - capHeight: 718, - xHeight: 532 - }; - t["Times-Roman"] = { - ascent: 683, - descent: -217, - capHeight: 662, - xHeight: 450 - }; - t["Times-Bold"] = { - ascent: 683, - descent: -217, - capHeight: 676, - xHeight: 461 - }; - t["Times-Italic"] = { - ascent: 683, - descent: -217, - capHeight: 653, - xHeight: 441 - }; - t["Times-BoldItalic"] = { - ascent: 683, - descent: -217, - capHeight: 669, - xHeight: 462 - }; - t.Symbol = { - ascent: Math.NaN, - descent: Math.NaN, - capHeight: Math.NaN, - xHeight: Math.NaN - }; - t.ZapfDingbats = { - ascent: Math.NaN, - descent: Math.NaN, - capHeight: Math.NaN, - xHeight: Math.NaN - }; -}); - -;// ./src/core/glyf.js -const ON_CURVE_POINT = 1 << 0; -const X_SHORT_VECTOR = 1 << 1; -const Y_SHORT_VECTOR = 1 << 2; -const REPEAT_FLAG = 1 << 3; -const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; -const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; -const OVERLAP_SIMPLE = 1 << 6; -const ARG_1_AND_2_ARE_WORDS = 1 << 0; -const ARGS_ARE_XY_VALUES = 1 << 1; -const WE_HAVE_A_SCALE = 1 << 3; -const MORE_COMPONENTS = 1 << 5; -const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; -const WE_HAVE_A_TWO_BY_TWO = 1 << 7; -const WE_HAVE_INSTRUCTIONS = 1 << 8; -class GlyfTable { - constructor({ - glyfTable, - isGlyphLocationsLong, - locaTable, - numGlyphs - }) { - this.glyphs = []; - const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); - const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); - const offsetSize = isGlyphLocationsLong ? 4 : 2; - let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); - let pos = 0; - for (let i = 0; i < numGlyphs; i++) { - pos += offsetSize; - const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); - if (next === prev) { - this.glyphs.push(new Glyph({})); - continue; - } - const glyph = Glyph.parse(prev, glyf); - this.glyphs.push(glyph); - prev = next; - } - } - getSize() { - return Math.sumPrecise(this.glyphs.map(g => g.getSize() + 3 & ~3)); - } - write() { - const totalSize = this.getSize(); - const glyfTable = new DataView(new ArrayBuffer(totalSize)); - const isLocationLong = totalSize > 0x1fffe; - const offsetSize = isLocationLong ? 4 : 2; - const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); - if (isLocationLong) { - locaTable.setUint32(0, 0); - } else { - locaTable.setUint16(0, 0); - } - let pos = 0; - let locaIndex = 0; - for (const glyph of this.glyphs) { - pos += glyph.write(pos, glyfTable); - pos = pos + 3 & ~3; - locaIndex += offsetSize; - if (isLocationLong) { - locaTable.setUint32(locaIndex, pos); - } else { - locaTable.setUint16(locaIndex, pos >> 1); - } - } - return { - isLocationLong, - loca: new Uint8Array(locaTable.buffer), - glyf: new Uint8Array(glyfTable.buffer) - }; - } - scale(factors) { - for (let i = 0, ii = this.glyphs.length; i < ii; i++) { - this.glyphs[i].scale(factors[i]); - } - } -} -class Glyph { - constructor({ - header = null, - simple = null, - composites = null - }) { - this.header = header; - this.simple = simple; - this.composites = composites; - } - static parse(pos, glyf) { - const [read, header] = GlyphHeader.parse(pos, glyf); - pos += read; - if (header.numberOfContours < 0) { - const composites = []; - while (true) { - const [n, composite] = CompositeGlyph.parse(pos, glyf); - pos += n; - composites.push(composite); - if (!(composite.flags & MORE_COMPONENTS)) { - break; - } - } - return new Glyph({ - header, - composites - }); - } - const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); - return new Glyph({ - header, - simple - }); - } - getSize() { - if (!this.header) { - return 0; - } - const size = this.simple ? this.simple.getSize() : Math.sumPrecise(this.composites.map(c => c.getSize())); - return this.header.getSize() + size; - } - write(pos, buf) { - if (!this.header) { - return 0; - } - const spos = pos; - pos += this.header.write(pos, buf); - if (this.simple) { - pos += this.simple.write(pos, buf); - } else { - for (const composite of this.composites) { - pos += composite.write(pos, buf); - } - } - return pos - spos; - } - scale(factor) { - if (!this.header) { - return; - } - const xMiddle = (this.header.xMin + this.header.xMax) / 2; - this.header.scale(xMiddle, factor); - if (this.simple) { - this.simple.scale(xMiddle, factor); - } else { - for (const composite of this.composites) { - composite.scale(xMiddle, factor); - } - } - } -} -class GlyphHeader { - constructor({ - numberOfContours, - xMin, - yMin, - xMax, - yMax - }) { - this.numberOfContours = numberOfContours; - this.xMin = xMin; - this.yMin = yMin; - this.xMax = xMax; - this.yMax = yMax; - } - static parse(pos, glyf) { - return [10, new GlyphHeader({ - numberOfContours: glyf.getInt16(pos), - xMin: glyf.getInt16(pos + 2), - yMin: glyf.getInt16(pos + 4), - xMax: glyf.getInt16(pos + 6), - yMax: glyf.getInt16(pos + 8) - })]; - } - getSize() { - return 10; - } - write(pos, buf) { - buf.setInt16(pos, this.numberOfContours); - buf.setInt16(pos + 2, this.xMin); - buf.setInt16(pos + 4, this.yMin); - buf.setInt16(pos + 6, this.xMax); - buf.setInt16(pos + 8, this.yMax); - return 10; - } - scale(x, factor) { - this.xMin = Math.round(x + (this.xMin - x) * factor); - this.xMax = Math.round(x + (this.xMax - x) * factor); - } -} -class Contour { - constructor({ - flags, - xCoordinates, - yCoordinates - }) { - this.xCoordinates = xCoordinates; - this.yCoordinates = yCoordinates; - this.flags = flags; - } -} -class SimpleGlyph { - constructor({ - contours, - instructions - }) { - this.contours = contours; - this.instructions = instructions; - } - static parse(pos, glyf, numberOfContours) { - const endPtsOfContours = []; - for (let i = 0; i < numberOfContours; i++) { - const endPt = glyf.getUint16(pos); - pos += 2; - endPtsOfContours.push(endPt); - } - const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; - const instructionLength = glyf.getUint16(pos); - pos += 2; - const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); - pos += instructionLength; - const flags = []; - for (let i = 0; i < numberOfPt; pos++, i++) { - let flag = glyf.getUint8(pos); - flags.push(flag); - if (flag & REPEAT_FLAG) { - const count = glyf.getUint8(++pos); - flag ^= REPEAT_FLAG; - for (let m = 0; m < count; m++) { - flags.push(flag); - } - i += count; - } - } - const allXCoordinates = []; - let xCoordinates = []; - let yCoordinates = []; - let pointFlags = []; - const contours = []; - let endPtsOfContoursIndex = 0; - let lastCoordinate = 0; - for (let i = 0; i < numberOfPt; i++) { - const flag = flags[i]; - if (flag & X_SHORT_VECTOR) { - const x = glyf.getUint8(pos++); - lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; - xCoordinates.push(lastCoordinate); - } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { - xCoordinates.push(lastCoordinate); - } else { - lastCoordinate += glyf.getInt16(pos); - pos += 2; - xCoordinates.push(lastCoordinate); - } - if (endPtsOfContours[endPtsOfContoursIndex] === i) { - endPtsOfContoursIndex++; - allXCoordinates.push(xCoordinates); - xCoordinates = []; - } - } - lastCoordinate = 0; - endPtsOfContoursIndex = 0; - for (let i = 0; i < numberOfPt; i++) { - const flag = flags[i]; - if (flag & Y_SHORT_VECTOR) { - const y = glyf.getUint8(pos++); - lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; - yCoordinates.push(lastCoordinate); - } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { - yCoordinates.push(lastCoordinate); - } else { - lastCoordinate += glyf.getInt16(pos); - pos += 2; - yCoordinates.push(lastCoordinate); - } - pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); - if (endPtsOfContours[endPtsOfContoursIndex] === i) { - xCoordinates = allXCoordinates[endPtsOfContoursIndex]; - endPtsOfContoursIndex++; - contours.push(new Contour({ - flags: pointFlags, - xCoordinates, - yCoordinates - })); - yCoordinates = []; - pointFlags = []; - } - } - return new SimpleGlyph({ - contours, - instructions - }); - } - getSize() { - let size = this.contours.length * 2 + 2 + this.instructions.length; - let lastX = 0; - let lastY = 0; - for (const contour of this.contours) { - size += contour.flags.length; - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - const x = contour.xCoordinates[i]; - const y = contour.yCoordinates[i]; - let abs = Math.abs(x - lastX); - if (abs > 255) { - size += 2; - } else if (abs > 0) { - size += 1; - } - lastX = x; - abs = Math.abs(y - lastY); - if (abs > 255) { - size += 2; - } else if (abs > 0) { - size += 1; - } - lastY = y; - } - } - return size; - } - write(pos, buf) { - const spos = pos; - const xCoordinates = []; - const yCoordinates = []; - const flags = []; - let lastX = 0; - let lastY = 0; - for (const contour of this.contours) { - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - let flag = contour.flags[i]; - const x = contour.xCoordinates[i]; - let delta = x - lastX; - if (delta === 0) { - flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; - xCoordinates.push(0); - } else { - const abs = Math.abs(delta); - if (abs <= 255) { - flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; - xCoordinates.push(abs); - } else { - xCoordinates.push(delta); - } - } - lastX = x; - const y = contour.yCoordinates[i]; - delta = y - lastY; - if (delta === 0) { - flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; - yCoordinates.push(0); - } else { - const abs = Math.abs(delta); - if (abs <= 255) { - flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; - yCoordinates.push(abs); - } else { - yCoordinates.push(delta); - } - } - lastY = y; - flags.push(flag); - } - buf.setUint16(pos, xCoordinates.length - 1); - pos += 2; - } - buf.setUint16(pos, this.instructions.length); - pos += 2; - if (this.instructions.length) { - new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); - pos += this.instructions.length; - } - for (const flag of flags) { - buf.setUint8(pos++, flag); - } - for (let i = 0, ii = xCoordinates.length; i < ii; i++) { - const x = xCoordinates[i]; - const flag = flags[i]; - if (flag & X_SHORT_VECTOR) { - buf.setUint8(pos++, x); - } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { - buf.setInt16(pos, x); - pos += 2; - } - } - for (let i = 0, ii = yCoordinates.length; i < ii; i++) { - const y = yCoordinates[i]; - const flag = flags[i]; - if (flag & Y_SHORT_VECTOR) { - buf.setUint8(pos++, y); - } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { - buf.setInt16(pos, y); - pos += 2; - } - } - return pos - spos; - } - scale(x, factor) { - for (const contour of this.contours) { - if (contour.xCoordinates.length === 0) { - continue; - } - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); - } - } - } -} -class CompositeGlyph { - constructor({ - flags, - glyphIndex, - argument1, - argument2, - transf, - instructions - }) { - this.flags = flags; - this.glyphIndex = glyphIndex; - this.argument1 = argument1; - this.argument2 = argument2; - this.transf = transf; - this.instructions = instructions; - } - static parse(pos, glyf) { - const spos = pos; - const transf = []; - let flags = glyf.getUint16(pos); - const glyphIndex = glyf.getUint16(pos + 2); - pos += 4; - let argument1, argument2; - if (flags & ARG_1_AND_2_ARE_WORDS) { - if (flags & ARGS_ARE_XY_VALUES) { - argument1 = glyf.getInt16(pos); - argument2 = glyf.getInt16(pos + 2); - } else { - argument1 = glyf.getUint16(pos); - argument2 = glyf.getUint16(pos + 2); - } - pos += 4; - flags ^= ARG_1_AND_2_ARE_WORDS; - } else { - if (flags & ARGS_ARE_XY_VALUES) { - argument1 = glyf.getInt8(pos); - argument2 = glyf.getInt8(pos + 1); - } else { - argument1 = glyf.getUint8(pos); - argument2 = glyf.getUint8(pos + 1); - } - pos += 2; - } - if (flags & WE_HAVE_A_SCALE) { - transf.push(glyf.getUint16(pos)); - pos += 2; - } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { - transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); - pos += 4; - } else if (flags & WE_HAVE_A_TWO_BY_TWO) { - transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); - pos += 8; - } - let instructions = null; - if (flags & WE_HAVE_INSTRUCTIONS) { - const instructionLength = glyf.getUint16(pos); - pos += 2; - instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); - pos += instructionLength; - } - return [pos - spos, new CompositeGlyph({ - flags, - glyphIndex, - argument1, - argument2, - transf, - instructions - })]; - } - getSize() { - let size = 2 + 2 + this.transf.length * 2; - if (this.flags & WE_HAVE_INSTRUCTIONS) { - size += 2 + this.instructions.length; - } - size += 2; - if (this.flags & 2) { - if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { - size += 2; - } - } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { - size += 2; - } - return size; - } - write(pos, buf) { - const spos = pos; - if (this.flags & ARGS_ARE_XY_VALUES) { - if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { - this.flags |= ARG_1_AND_2_ARE_WORDS; - } - } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { - this.flags |= ARG_1_AND_2_ARE_WORDS; - } - buf.setUint16(pos, this.flags); - buf.setUint16(pos + 2, this.glyphIndex); - pos += 4; - if (this.flags & ARG_1_AND_2_ARE_WORDS) { - if (this.flags & ARGS_ARE_XY_VALUES) { - buf.setInt16(pos, this.argument1); - buf.setInt16(pos + 2, this.argument2); - } else { - buf.setUint16(pos, this.argument1); - buf.setUint16(pos + 2, this.argument2); - } - pos += 4; - } else { - buf.setUint8(pos, this.argument1); - buf.setUint8(pos + 1, this.argument2); - pos += 2; - } - if (this.flags & WE_HAVE_INSTRUCTIONS) { - buf.setUint16(pos, this.instructions.length); - pos += 2; - if (this.instructions.length) { - new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); - pos += this.instructions.length; - } - } - return pos - spos; - } - scale(x, factor) {} -} - -;// ./src/core/opentype_file_builder.js - - -function writeInt16(dest, offset, num) { - dest[offset] = num >> 8 & 0xff; - dest[offset + 1] = num & 0xff; -} -function writeInt32(dest, offset, num) { - dest[offset] = num >> 24 & 0xff; - dest[offset + 1] = num >> 16 & 0xff; - dest[offset + 2] = num >> 8 & 0xff; - dest[offset + 3] = num & 0xff; -} -function writeData(dest, offset, data) { - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === "string") { - for (let i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xff; - } - } else { - for (const num of data) { - dest[offset++] = num & 0xff; - } - } -} -const OTF_HEADER_SIZE = 12; -const OTF_TABLE_ENTRY_SIZE = 16; -class OpenTypeFileBuilder { - constructor(sfnt) { - this.sfnt = sfnt; - this.tables = Object.create(null); - } - static getSearchParams(entriesCount, entrySize) { - let maxPower2 = 1, - log2 = 0; - while ((maxPower2 ^ entriesCount) > maxPower2) { - maxPower2 <<= 1; - log2++; - } - const searchRange = maxPower2 * entrySize; - return { - range: searchRange, - entry: log2, - rangeShift: entrySize * entriesCount - searchRange - }; - } - toArray() { - let sfnt = this.sfnt; - const tables = this.tables; - const tablesNames = Object.keys(tables); - tablesNames.sort(); - const numTables = tablesNames.length; - let i, j, jj, table, tableName; - let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; - const tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - const paddedLength = (table.length + 3 & ~3) >>> 0; - offset += paddedLength; - tableOffsets.push(offset); - } - const file = new Uint8Array(offset); - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); - } - if (sfnt === "true") { - sfnt = string32(0x00010000); - } - file[0] = sfnt.charCodeAt(0) & 0xff; - file[1] = sfnt.charCodeAt(1) & 0xff; - file[2] = sfnt.charCodeAt(2) & 0xff; - file[3] = sfnt.charCodeAt(3) & 0xff; - writeInt16(file, 4, numTables); - const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - writeInt16(file, 6, searchParams.range); - writeInt16(file, 8, searchParams.entry); - writeInt16(file, 10, searchParams.rangeShift); - offset = OTF_HEADER_SIZE; - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xff; - file[offset + 1] = tableName.charCodeAt(1) & 0xff; - file[offset + 2] = tableName.charCodeAt(2) & 0xff; - file[offset + 3] = tableName.charCodeAt(3) & 0xff; - let checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - const quad = readUint32(file, j); - checksum = checksum + quad >>> 0; - } - writeInt32(file, offset + 4, checksum); - writeInt32(file, offset + 8, tableOffsets[i]); - writeInt32(file, offset + 12, tables[tableName].length); - offset += OTF_TABLE_ENTRY_SIZE; - } - return file; - } - addTable(tag, data) { - if (tag in this.tables) { - throw new Error("Table " + tag + " already exists"); - } - this.tables[tag] = data; - } -} - -;// ./src/core/type1_parser.js - - - - -const HINTING_ENABLED = false; -const COMMAND_MAP = { - hstem: [1], - vstem: [3], - vmoveto: [4], - rlineto: [5], - hlineto: [6], - vlineto: [7], - rrcurveto: [8], - callsubr: [10], - flex: [12, 35], - drop: [12, 18], - endchar: [14], - rmoveto: [21], - hmoveto: [22], - vhcurveto: [30], - hvcurveto: [31] -}; -class Type1CharString { - constructor() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } - convert(encoded, subrs, seacAnalysisEnabled) { - const count = encoded.length; - let error = false; - let wx, sbx, subrNumber; - for (let i = 0; i < count; i++) { - let value = encoded[i]; - if (value < 32) { - if (value === 12) { - value = (value << 8) + encoded[++i]; - } - switch (value) { - case 1: - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case 3: - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case 4: - if (this.flexing) { - if (this.stack.length < 1) { - error = true; - break; - } - const dy = this.stack.pop(); - this.stack.push(0, dy); - break; - } - error = this.executeCommand(1, COMMAND_MAP.vmoveto); - break; - case 5: - error = this.executeCommand(2, COMMAND_MAP.rlineto); - break; - case 6: - error = this.executeCommand(1, COMMAND_MAP.hlineto); - break; - case 7: - error = this.executeCommand(1, COMMAND_MAP.vlineto); - break; - case 8: - error = this.executeCommand(6, COMMAND_MAP.rrcurveto); - break; - case 9: - this.stack = []; - break; - case 10: - if (this.stack.length < 1) { - error = true; - break; - } - subrNumber = this.stack.pop(); - if (!subrs[subrNumber]) { - error = true; - break; - } - error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); - break; - case 11: - return error; - case 13: - if (this.stack.length < 2) { - error = true; - break; - } - wx = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx); - error = this.executeCommand(2, COMMAND_MAP.hmoveto); - break; - case 14: - this.output.push(COMMAND_MAP.endchar[0]); - break; - case 21: - if (this.flexing) { - break; - } - error = this.executeCommand(2, COMMAND_MAP.rmoveto); - break; - case 22: - if (this.flexing) { - this.stack.push(0); - break; - } - error = this.executeCommand(1, COMMAND_MAP.hmoveto); - break; - case 30: - error = this.executeCommand(4, COMMAND_MAP.vhcurveto); - break; - case 31: - error = this.executeCommand(4, COMMAND_MAP.hvcurveto); - break; - case (12 << 8) + 0: - this.stack = []; - break; - case (12 << 8) + 1: - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case (12 << 8) + 2: - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case (12 << 8) + 6: - if (seacAnalysisEnabled) { - const asb = this.stack.at(-5); - this.seac = this.stack.splice(-4, 4); - this.seac[0] += this.lsb - asb; - error = this.executeCommand(0, COMMAND_MAP.endchar); - } else { - error = this.executeCommand(4, COMMAND_MAP.endchar); - } - break; - case (12 << 8) + 7: - if (this.stack.length < 4) { - error = true; - break; - } - this.stack.pop(); - wx = this.stack.pop(); - const sby = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx, sby); - error = this.executeCommand(3, COMMAND_MAP.rmoveto); - break; - case (12 << 8) + 12: - if (this.stack.length < 2) { - error = true; - break; - } - const num2 = this.stack.pop(); - const num1 = this.stack.pop(); - this.stack.push(num1 / num2); - break; - case (12 << 8) + 16: - if (this.stack.length < 2) { - error = true; - break; - } - subrNumber = this.stack.pop(); - const numArgs = this.stack.pop(); - if (subrNumber === 0 && numArgs === 3) { - const flexArgs = this.stack.splice(-17, 17); - this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); - error = this.executeCommand(13, COMMAND_MAP.flex, true); - this.flexing = false; - this.stack.push(flexArgs[15], flexArgs[16]); - } else if (subrNumber === 1 && numArgs === 0) { - this.flexing = true; - } - break; - case (12 << 8) + 17: - break; - case (12 << 8) + 33: - this.stack = []; - break; - default: - warn('Unknown type 1 charstring command of "' + value + '"'); - break; - } - if (error) { - break; - } - continue; - } else if (value <= 246) { - value -= 139; - } else if (value <= 250) { - value = (value - 247) * 256 + encoded[++i] + 108; - } else if (value <= 254) { - value = -((value - 251) * 256) - encoded[++i] - 108; - } else { - value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; - } - this.stack.push(value); - } - return error; - } - executeCommand(howManyArgs, command, keepStack) { - const stackLength = this.stack.length; - if (howManyArgs > stackLength) { - return true; - } - const start = stackLength - howManyArgs; - for (let i = start; i < stackLength; i++) { - let value = this.stack[i]; - if (Number.isInteger(value)) { - this.output.push(28, value >> 8 & 0xff, value & 0xff); - } else { - value = 65536 * value | 0; - this.output.push(255, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); - } - } - this.output.push(...command); - if (keepStack) { - this.stack.splice(start, howManyArgs); - } else { - this.stack.length = 0; - } - return false; - } -} -const EEXEC_ENCRYPT_KEY = 55665; -const CHAR_STRS_ENCRYPT_KEY = 4330; -function isHexDigit(code) { - return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; -} -function decrypt(data, key, discardNumber) { - if (discardNumber >= data.length) { - return new Uint8Array(0); - } - const c1 = 52845, - c2 = 22719; - let r = key | 0, - i, - j; - for (i = 0; i < discardNumber; i++) { - r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; - } - const count = data.length - discardNumber; - const decrypted = new Uint8Array(count); - for (i = discardNumber, j = 0; j < count; i++, j++) { - const value = data[i]; - decrypted[j] = value ^ r >> 8; - r = (value + r) * c1 + c2 & (1 << 16) - 1; - } - return decrypted; -} -function decryptAscii(data, key, discardNumber) { - const c1 = 52845, - c2 = 22719; - let r = key | 0; - const count = data.length, - maybeLength = count >>> 1; - const decrypted = new Uint8Array(maybeLength); - let i, j; - for (i = 0, j = 0; i < count; i++) { - const digit1 = data[i]; - if (!isHexDigit(digit1)) { - continue; - } - i++; - let digit2; - while (i < count && !isHexDigit(digit2 = data[i])) { - i++; - } - if (i < count) { - const value = parseInt(String.fromCharCode(digit1, digit2), 16); - decrypted[j++] = value ^ r >> 8; - r = (value + r) * c1 + c2 & (1 << 16) - 1; - } - } - return decrypted.slice(discardNumber, j); -} -function isSpecial(c) { - return c === 0x2f || c === 0x5b || c === 0x5d || c === 0x7b || c === 0x7d || c === 0x28 || c === 0x29; -} -class Type1Parser { - constructor(stream, encrypted, seacAnalysisEnabled) { - if (encrypted) { - const data = stream.getBytes(); - const isBinary = !((isHexDigit(data[0]) || isWhiteSpace(data[0])) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]) && isHexDigit(data[4]) && isHexDigit(data[5]) && isHexDigit(data[6]) && isHexDigit(data[7])); - stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); - } - this.seacAnalysisEnabled = !!seacAnalysisEnabled; - this.stream = stream; - this.nextChar(); - } - readNumberArray() { - this.getToken(); - const array = []; - while (true) { - const token = this.getToken(); - if (token === null || token === "]" || token === "}") { - break; - } - array.push(parseFloat(token || 0)); - } - return array; - } - readNumber() { - const token = this.getToken(); - return parseFloat(token || 0); - } - readInt() { - const token = this.getToken(); - return parseInt(token || 0, 10) | 0; - } - readBoolean() { - const token = this.getToken(); - return token === "true" ? 1 : 0; - } - nextChar() { - return this.currentChar = this.stream.getByte(); - } - prevChar() { - this.stream.skip(-2); - return this.currentChar = this.stream.getByte(); - } - getToken() { - let comment = false; - let ch = this.currentChar; - while (true) { - if (ch === -1) { - return null; - } - if (comment) { - if (ch === 0x0a || ch === 0x0d) { - comment = false; - } - } else if (ch === 0x25) { - comment = true; - } else if (!isWhiteSpace(ch)) { - break; - } - ch = this.nextChar(); - } - if (isSpecial(ch)) { - this.nextChar(); - return String.fromCharCode(ch); - } - let token = ""; - do { - token += String.fromCharCode(ch); - ch = this.nextChar(); - } while (ch >= 0 && !isWhiteSpace(ch) && !isSpecial(ch)); - return token; - } - readCharStrings(bytes, lenIV) { - if (lenIV === -1) { - return bytes; - } - return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV); - } - extractFontProgram(properties) { - const stream = this.stream; - const subrs = [], - charstrings = []; - const privateData = Object.create(null); - privateData.lenIV = 4; - const program = { - subrs: [], - charstrings: [], - properties: { - privateData - } - }; - let token, length, data, lenIV; - while ((token = this.getToken()) !== null) { - if (token !== "/") { - continue; - } - token = this.getToken(); - switch (token) { - case "CharStrings": - this.getToken(); - this.getToken(); - this.getToken(); - this.getToken(); - while (true) { - token = this.getToken(); - if (token === null || token === "end") { - break; - } - if (token !== "/") { - continue; - } - const glyph = this.getToken(); - length = this.readInt(); - this.getToken(); - data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); - lenIV = program.properties.privateData.lenIV; - const encoded = this.readCharStrings(data, lenIV); - this.nextChar(); - token = this.getToken(); - if (token === "noaccess") { - this.getToken(); - } else if (token === "/") { - this.prevChar(); - } - charstrings.push({ - glyph, - encoded - }); - } - break; - case "Subrs": - this.readInt(); - this.getToken(); - while (this.getToken() === "dup") { - const index = this.readInt(); - length = this.readInt(); - this.getToken(); - data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); - lenIV = program.properties.privateData.lenIV; - const encoded = this.readCharStrings(data, lenIV); - this.nextChar(); - token = this.getToken(); - if (token === "noaccess") { - this.getToken(); - } - subrs[index] = encoded; - } - break; - case "BlueValues": - case "OtherBlues": - case "FamilyBlues": - case "FamilyOtherBlues": - const blueArray = this.readNumberArray(); - if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; - } - break; - case "StemSnapH": - case "StemSnapV": - program.properties.privateData[token] = this.readNumberArray(); - break; - case "StdHW": - case "StdVW": - program.properties.privateData[token] = this.readNumberArray()[0]; - break; - case "BlueShift": - case "lenIV": - case "BlueFuzz": - case "BlueScale": - case "LanguageGroup": - program.properties.privateData[token] = this.readNumber(); - break; - case "ExpansionFactor": - program.properties.privateData[token] = this.readNumber() || 0.06; - break; - case "ForceBold": - program.properties.privateData[token] = this.readBoolean(); - break; - } - } - for (const { - encoded, - glyph - } of charstrings) { - const charString = new Type1CharString(); - const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); - let output = charString.output; - if (error) { - output = [14]; - } - const charStringObject = { - glyphName: glyph, - charstring: output, - width: charString.width, - lsb: charString.lsb, - seac: charString.seac - }; - if (glyph === ".notdef") { - program.charstrings.unshift(charStringObject); - } else { - program.charstrings.push(charStringObject); - } - if (properties.builtInEncoding) { - const index = properties.builtInEncoding.indexOf(glyph); - if (index > -1 && properties.widths[index] === undefined && index >= properties.firstChar && index <= properties.lastChar) { - properties.widths[index] = charString.width; - } - } - } - return program; - } - extractFontHeader(properties) { - let token; - while ((token = this.getToken()) !== null) { - if (token !== "/") { - continue; - } - token = this.getToken(); - switch (token) { - case "FontMatrix": - const matrix = this.readNumberArray(); - properties.fontMatrix = matrix; - break; - case "Encoding": - const encodingArg = this.getToken(); - let encoding; - if (!/^\d+$/.test(encodingArg)) { - encoding = getEncoding(encodingArg); - } else { - encoding = []; - const size = parseInt(encodingArg, 10) | 0; - this.getToken(); - for (let j = 0; j < size; j++) { - token = this.getToken(); - while (token !== "dup" && token !== "def") { - token = this.getToken(); - if (token === null) { - return; - } - } - if (token === "def") { - break; - } - const index = this.readInt(); - this.getToken(); - const glyph = this.getToken(); - encoding[index] = glyph; - this.getToken(); - } - } - properties.builtInEncoding = encoding; - break; - case "FontBBox": - const fontBBox = this.readNumberArray(); - properties.ascent = Math.max(fontBBox[3], fontBBox[1]); - properties.descent = Math.min(fontBBox[1], fontBBox[3]); - properties.ascentScaled = true; - break; - } - } - } -} - -;// ./src/core/type1_font.js - - - - - - -function findBlock(streamBytes, signature, startIndex) { - const streamBytesLength = streamBytes.length; - const signatureLength = signature.length; - const scanLength = streamBytesLength - signatureLength; - let i = startIndex, - found = false; - while (i < scanLength) { - let j = 0; - while (j < signatureLength && streamBytes[i + j] === signature[j]) { - j++; - } - if (j >= signatureLength) { - i += j; - while (i < streamBytesLength && isWhiteSpace(streamBytes[i])) { - i++; - } - found = true; - break; - } - i++; - } - return { - found, - length: i - }; -} -function getHeaderBlock(stream, suggestedLength) { - const EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; - const streamStartPos = stream.pos; - let headerBytes, headerBytesLength, block; - try { - headerBytes = stream.getBytes(suggestedLength); - headerBytesLength = headerBytes.length; - } catch {} - if (headerBytesLength === suggestedLength) { - block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); - if (block.found && block.length === suggestedLength) { - return { - stream: new Stream(headerBytes), - length: suggestedLength - }; - } - } - warn('Invalid "Length1" property in Type1 font -- trying to recover.'); - stream.pos = streamStartPos; - const SCAN_BLOCK_LENGTH = 2048; - let actualLength; - while (true) { - const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); - block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); - if (block.length === 0) { - break; - } - stream.pos += block.length; - if (block.found) { - actualLength = stream.pos - streamStartPos; - break; - } - } - stream.pos = streamStartPos; - if (actualLength) { - return { - stream: new Stream(stream.getBytes(actualLength)), - length: actualLength - }; - } - warn('Unable to recover "Length1" property in Type1 font -- using as is.'); - return { - stream: new Stream(stream.getBytes(suggestedLength)), - length: suggestedLength - }; -} -function getEexecBlock(stream, suggestedLength) { - const eexecBytes = stream.getBytes(); - if (eexecBytes.length === 0) { - throw new FormatError("getEexecBlock - no font program found."); - } - return { - stream: new Stream(eexecBytes), - length: eexecBytes.length - }; -} -class Type1Font { - constructor(name, file, properties) { - const PFB_HEADER_SIZE = 6; - let headerBlockLength = properties.length1; - let eexecBlockLength = properties.length2; - let pfbHeader = file.peekBytes(PFB_HEADER_SIZE); - const pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; - if (pfbHeaderPresent) { - file.skip(PFB_HEADER_SIZE); - headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; - } - const headerBlock = getHeaderBlock(file, headerBlockLength); - const headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); - headerBlockParser.extractFontHeader(properties); - if (pfbHeaderPresent) { - pfbHeader = file.getBytes(PFB_HEADER_SIZE); - eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; - } - const eexecBlock = getEexecBlock(file, eexecBlockLength); - const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); - const data = eexecBlockParser.extractFontProgram(properties); - for (const key in data.properties) { - properties[key] = data.properties[key]; - } - const charstrings = data.charstrings; - const type2Charstrings = this.getType2Charstrings(charstrings); - const subrs = this.getType2Subrs(data.subrs); - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); - this.seacs = this.getSeacs(data.charstrings); - } - get numGlyphs() { - return this.charstrings.length + 1; - } - getCharset() { - const charset = [".notdef"]; - for (const { - glyphName - } of this.charstrings) { - charset.push(glyphName); - } - return charset; - } - getGlyphMapping(properties) { - const charstrings = this.charstrings; - if (properties.composite) { - const charCodeToGlyphId = Object.create(null); - for (let glyphId = 0, charstringsLen = charstrings.length; glyphId < charstringsLen; glyphId++) { - const charCode = properties.cMap.charCodeOf(glyphId); - charCodeToGlyphId[charCode] = glyphId + 1; - } - return charCodeToGlyphId; - } - const glyphNames = [".notdef"]; - let builtInEncoding, glyphId; - for (glyphId = 0; glyphId < charstrings.length; glyphId++) { - glyphNames.push(charstrings[glyphId].glyphName); - } - const encoding = properties.builtInEncoding; - if (encoding) { - builtInEncoding = Object.create(null); - for (const charCode in encoding) { - glyphId = glyphNames.indexOf(encoding[charCode]); - if (glyphId >= 0) { - builtInEncoding[charCode] = glyphId; - } - } - } - return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); - } - hasGlyphId(id) { - if (id < 0 || id >= this.numGlyphs) { - return false; - } - if (id === 0) { - return true; - } - const glyph = this.charstrings[id - 1]; - return glyph.charstring.length > 0; - } - getSeacs(charstrings) { - const seacMap = []; - for (let i = 0, ii = charstrings.length; i < ii; i++) { - const charstring = charstrings[i]; - if (charstring.seac) { - seacMap[i + 1] = charstring.seac; - } - } - return seacMap; - } - getType2Charstrings(type1Charstrings) { - const type2Charstrings = []; - for (const type1Charstring of type1Charstrings) { - type2Charstrings.push(type1Charstring.charstring); - } - return type2Charstrings; - } - getType2Subrs(type1Subrs) { - let bias = 0; - const count = type1Subrs.length; - if (count < 1133) { - bias = 107; - } else if (count < 33769) { - bias = 1131; - } else { - bias = 32768; - } - const type2Subrs = []; - let i; - for (i = 0; i < bias; i++) { - type2Subrs.push([0x0b]); - } - for (i = 0; i < count; i++) { - type2Subrs.push(type1Subrs[i]); - } - return type2Subrs; - } - wrap(name, glyphs, charstrings, subrs, properties) { - const cff = new CFF(); - cff.header = new CFFHeader(1, 0, 4, 4); - cff.names = [name]; - const topDict = new CFFTopDict(); - topDict.setByName("version", 391); - topDict.setByName("Notice", 392); - topDict.setByName("FullName", 393); - topDict.setByName("FamilyName", 394); - topDict.setByName("Weight", 395); - topDict.setByName("Encoding", null); - topDict.setByName("FontMatrix", properties.fontMatrix); - topDict.setByName("FontBBox", properties.bbox); - topDict.setByName("charset", null); - topDict.setByName("CharStrings", null); - topDict.setByName("Private", null); - cff.topDict = topDict; - const strings = new CFFStrings(); - strings.add("Version 0.11"); - strings.add("See original notice"); - strings.add(name); - strings.add(name); - strings.add("Medium"); - cff.strings = strings; - cff.globalSubrIndex = new CFFIndex(); - const count = glyphs.length; - const charsetArray = [".notdef"]; - let i, ii; - for (i = 0; i < count; i++) { - const glyphName = charstrings[i].glyphName; - const index = CFFStandardStrings.indexOf(glyphName); - if (index === -1) { - strings.add(glyphName); - } - charsetArray.push(glyphName); - } - cff.charset = new CFFCharset(false, 0, charsetArray); - const charStringsIndex = new CFFIndex(); - charStringsIndex.add([0x8b, 0x0e]); - for (i = 0; i < count; i++) { - charStringsIndex.add(glyphs[i]); - } - cff.charStrings = charStringsIndex; - const privateDict = new CFFPrivateDict(); - privateDict.setByName("Subrs", null); - const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; - for (i = 0, ii = fields.length; i < ii; i++) { - const field = fields[i]; - if (!(field in properties.privateData)) { - continue; - } - const value = properties.privateData[field]; - if (Array.isArray(value)) { - for (let j = value.length - 1; j > 0; j--) { - value[j] -= value[j - 1]; - } - } - privateDict.setByName(field, value); - } - cff.topDict.privateDict = privateDict; - const subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); - } - privateDict.subrsIndex = subrIndex; - const compiler = new CFFCompiler(cff); - return compiler.compile(); - } -} - -;// ./src/core/fonts.js - - - - - - - - - - - - - - - - - -const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; -const PDF_GLYPH_SPACE_UNITS = 1000; -const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "disableFontFace", "fallbackName", "fontExtraProperties", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "systemFontInfo", "vertical"]; -const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "composite", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "subtype", "toFontChar", "toUnicode", "type", "vmetrics", "widths"]; -function adjustWidths(properties) { - if (!properties.fontMatrix) { - return; - } - if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { - return; - } - const scale = 0.001 / properties.fontMatrix[0]; - const glyphsWidths = properties.widths; - for (const glyph in glyphsWidths) { - glyphsWidths[glyph] *= scale; - } - properties.defaultWidth *= scale; -} -function adjustTrueTypeToUnicode(properties, isSymbolicFont, nameRecords) { - if (properties.isInternalFont) { - return; - } - if (properties.hasIncludedToUnicodeMap) { - return; - } - if (properties.hasEncoding) { - return; - } - if (properties.toUnicode instanceof IdentityToUnicodeMap) { - return; - } - if (!isSymbolicFont) { - return; - } - if (nameRecords.length === 0) { - return; - } - if (properties.defaultEncoding === WinAnsiEncoding) { - return; - } - for (const r of nameRecords) { - if (!isWinNameRecord(r)) { - return; - } - } - const encoding = WinAnsiEncoding; - const toUnicode = [], - glyphsUnicodeMap = getGlyphsUnicode(); - for (const charCode in encoding) { - const glyphName = encoding[charCode]; - if (glyphName === "") { - continue; - } - const unicode = glyphsUnicodeMap[glyphName]; - if (unicode === undefined) { - continue; - } - toUnicode[charCode] = String.fromCharCode(unicode); - } - if (toUnicode.length > 0) { - properties.toUnicode.amend(toUnicode); - } -} -function adjustType1ToUnicode(properties, builtInEncoding) { - if (properties.isInternalFont) { - return; - } - if (properties.hasIncludedToUnicodeMap) { - return; - } - if (builtInEncoding === properties.defaultEncoding) { - return; - } - if (properties.toUnicode instanceof IdentityToUnicodeMap) { - return; - } - const toUnicode = [], - glyphsUnicodeMap = getGlyphsUnicode(); - for (const charCode in builtInEncoding) { - if (properties.hasEncoding) { - if (properties.baseEncodingName || properties.differences[charCode] !== undefined) { - continue; - } - } - const glyphName = builtInEncoding[charCode]; - const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - toUnicode[charCode] = String.fromCharCode(unicode); - } - } - if (toUnicode.length > 0) { - properties.toUnicode.amend(toUnicode); - } -} -function amendFallbackToUnicode(properties) { - if (!properties.fallbackToUnicode) { - return; - } - if (properties.toUnicode instanceof IdentityToUnicodeMap) { - return; - } - const toUnicode = []; - for (const charCode in properties.fallbackToUnicode) { - if (properties.toUnicode.has(charCode)) { - continue; - } - toUnicode[charCode] = properties.fallbackToUnicode[charCode]; - } - if (toUnicode.length > 0) { - properties.toUnicode.amend(toUnicode); - } -} -class fonts_Glyph { - constructor(originalCharCode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { - this.originalCharCode = originalCharCode; - this.fontChar = fontChar; - this.unicode = unicode; - this.accent = accent; - this.width = width; - this.vmetric = vmetric; - this.operatorListId = operatorListId; - this.isSpace = isSpace; - this.isInFont = isInFont; - } - get category() { - return shadow(this, "category", getCharUnicodeCategory(this.unicode), true); - } -} -function int16(b0, b1) { - return (b0 << 8) + b1; -} -function writeSignedInt16(bytes, index, value) { - bytes[index + 1] = value; - bytes[index] = value >>> 8; -} -function signedInt16(b0, b1) { - const value = (b0 << 8) + b1; - return value & 1 << 15 ? value - 0x10000 : value; -} -function writeUint32(bytes, index, value) { - bytes[index + 3] = value & 0xff; - bytes[index + 2] = value >>> 8; - bytes[index + 1] = value >>> 16; - bytes[index] = value >>> 24; -} -function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; -} -function string16(value) { - return String.fromCharCode(value >> 8 & 0xff, value & 0xff); -} -function safeString16(value) { - if (value > 0x7fff) { - value = 0x7fff; - } else if (value < -0x8000) { - value = -0x8000; - } - return String.fromCharCode(value >> 8 & 0xff, value & 0xff); -} -function isTrueTypeFile(file) { - const header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true"; -} -function isTrueTypeCollectionFile(file) { - const header = file.peekBytes(4); - return bytesToString(header) === "ttcf"; -} -function isOpenTypeFile(file) { - const header = file.peekBytes(4); - return bytesToString(header) === "OTTO"; -} -function isType1File(file) { - const header = file.peekBytes(2); - if (header[0] === 0x25 && header[1] === 0x21) { - return true; - } - if (header[0] === 0x80 && header[1] === 0x01) { - return true; - } - return false; -} -function isCFFFile(file) { - const header = file.peekBytes(4); - if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) { - return true; - } - return false; -} -function getFontFileType(file, { - type, - subtype, - composite -}) { - let fileType, fileSubtype; - if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) { - fileType = composite ? "CIDFontType2" : "TrueType"; - } else if (isOpenTypeFile(file)) { - fileType = composite ? "CIDFontType2" : "OpenType"; - } else if (isType1File(file)) { - if (composite) { - fileType = "CIDFontType0"; - } else { - fileType = type === "MMType1" ? "MMType1" : "Type1"; - } - } else if (isCFFFile(file)) { - if (composite) { - fileType = "CIDFontType0"; - fileSubtype = "CIDFontType0C"; - } else { - fileType = type === "MMType1" ? "MMType1" : "Type1"; - fileSubtype = "Type1C"; - } - } else { - warn("getFontFileType: Unable to detect correct font file Type/Subtype."); - fileType = type; - fileSubtype = subtype; - } - return [fileType, fileSubtype]; -} -function applyStandardFontGlyphMap(map, glyphMap) { - for (const charCode in glyphMap) { - map[+charCode] = glyphMap[charCode]; - } -} -function buildToFontChar(encoding, glyphsUnicodeMap, differences) { - const toFontChar = []; - let unicode; - for (let i = 0, ii = encoding.length; i < ii; i++) { - unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); - if (unicode !== -1) { - toFontChar[i] = unicode; - } - } - for (const charCode in differences) { - unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); - if (unicode !== -1) { - toFontChar[+charCode] = unicode; - } - } - return toFontChar; -} -function isMacNameRecord(r) { - return r.platform === 1 && r.encoding === 0 && r.language === 0; -} -function isWinNameRecord(r) { - return r.platform === 3 && r.encoding === 1 && r.language === 0x409; -} -function convertCidString(charCode, cid, shouldThrow = false) { - switch (cid.length) { - case 1: - return cid.charCodeAt(0); - case 2: - return cid.charCodeAt(0) << 8 | cid.charCodeAt(1); - } - const msg = `Unsupported CID string (charCode ${charCode}): "${cid}".`; - if (shouldThrow) { - throw new FormatError(msg); - } - warn(msg); - return cid; -} -function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId, toUnicode) { - const newMap = Object.create(null); - const toUnicodeExtraMap = new Map(); - const toFontChar = []; - const usedGlyphIds = new Set(); - let privateUseAreaIndex = 0; - const privateUseOffetStart = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; - let nextAvailableFontCharCode = privateUseOffetStart; - let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; - const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]; - let LIGATURE_TO_UNICODE = null; - for (const originalCharCode in charCodeToGlyphId) { - let glyphId = charCodeToGlyphId[originalCharCode]; - if (!hasGlyph(glyphId)) { - continue; - } - if (nextAvailableFontCharCode > privateUseOffetEnd) { - privateUseAreaIndex++; - if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) { - warn("Ran out of space in font private use area."); - break; - } - nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0]; - privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; - } - const fontCharCode = nextAvailableFontCharCode++; - if (glyphId === 0) { - glyphId = newGlyphZeroId; - } - let unicode = toUnicode.get(originalCharCode); - if (typeof unicode === "string") { - if (unicode.length === 1) { - unicode = unicode.codePointAt(0); - } else { - if (!LIGATURE_TO_UNICODE) { - LIGATURE_TO_UNICODE = new Map(); - for (let i = 0xfb00; i <= 0xfb4f; i++) { - const normalized = String.fromCharCode(i).normalize("NFKD"); - if (normalized.length > 1) { - LIGATURE_TO_UNICODE.set(normalized, i); - } - } - } - unicode = LIGATURE_TO_UNICODE.get(unicode) || unicode.codePointAt(0); - } - } - if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { - toUnicodeExtraMap.set(unicode, glyphId); - usedGlyphIds.add(glyphId); - } - newMap[fontCharCode] = glyphId; - toFontChar[originalCharCode] = fontCharCode; - } - return { - toFontChar, - charCodeToGlyphId: newMap, - toUnicodeExtraMap, - nextAvailableFontCharCode - }; -} -function getRanges(glyphs, toUnicodeExtraMap, numGlyphs) { - const codes = []; - for (const charCode in glyphs) { - if (glyphs[charCode] >= numGlyphs) { - continue; - } - codes.push({ - fontCharCode: charCode | 0, - glyphId: glyphs[charCode] - }); - } - if (toUnicodeExtraMap) { - for (const [unicode, glyphId] of toUnicodeExtraMap) { - if (glyphId >= numGlyphs) { - continue; - } - codes.push({ - fontCharCode: unicode, - glyphId - }); - } - } - if (codes.length === 0) { - codes.push({ - fontCharCode: 0, - glyphId: 0 - }); - } - codes.sort((a, b) => a.fontCharCode - b.fontCharCode); - const ranges = []; - const length = codes.length; - for (let n = 0; n < length;) { - const start = codes[n].fontCharCode; - const codeIndices = [codes[n].glyphId]; - ++n; - let end = start; - while (n < length && end + 1 === codes[n].fontCharCode) { - codeIndices.push(codes[n].glyphId); - ++end; - ++n; - if (end === 0xffff) { - break; - } - } - ranges.push([start, end, codeIndices]); - } - return ranges; -} -function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { - const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); - const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; - let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8); - let i, ii, j, jj; - for (i = ranges.length - 1; i >= 0; --i) { - if (ranges[i][0] <= 0xffff) { - break; - } - } - const bmpLength = i + 1; - if (ranges[i][0] < 0xffff && ranges[i][1] === 0xffff) { - ranges[i][1] = 0xfffe; - } - const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; - const segCount = bmpLength + trailingRangesCount; - const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - let startCount = ""; - let endCount = ""; - let idDeltas = ""; - let idRangeOffsets = ""; - let glyphsIds = ""; - let bias = 0; - let range, start, end, codes; - for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; - let contiguous = true; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - contiguous = false; - break; - } - } - if (!contiguous) { - const offset = (segCount - i) * 2 + bias * 2; - bias += end - start + 1; - idDeltas += string16(0); - idRangeOffsets += string16(offset); - for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); - } - } else { - const startCode = codes[0]; - idDeltas += string16(startCode - start & 0xffff); - idRangeOffsets += string16(0); - } - } - if (trailingRangesCount > 0) { - endCount += "\xFF\xFF"; - startCount += "\xFF\xFF"; - idDeltas += "\x00\x01"; - idRangeOffsets += "\x00\x00"; - } - const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; - let format31012 = ""; - let header31012 = ""; - if (numTables > 1) { - cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length); - format31012 = ""; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; - let code = codes[0]; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + string32(end) + string32(code); - start = end + 1; - code = codes[j]; - } - } - format31012 += string32(start) + string32(range[1]) + string32(code); - } - header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12); - } - return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; -} -function validateOS2Table(os2, file) { - file.pos = (file.start || 0) + os2.offset; - const version = file.getUint16(); - file.skip(60); - const selection = file.getUint16(); - if (version < 4 && selection & 0x0300) { - return false; - } - const firstChar = file.getUint16(); - const lastChar = file.getUint16(); - if (firstChar > lastChar) { - return false; - } - file.skip(6); - const usWinAscent = file.getUint16(); - if (usWinAscent === 0) { - return false; - } - os2.data[8] = os2.data[9] = 0; - return true; -} -function createOS2Table(properties, charstrings, override) { - override ||= { - unitsPerEm: 0, - yMax: 0, - yMin: 0, - ascent: 0, - descent: 0 - }; - let ulUnicodeRange1 = 0; - let ulUnicodeRange2 = 0; - let ulUnicodeRange3 = 0; - let ulUnicodeRange4 = 0; - let firstCharIndex = null; - let lastCharIndex = 0; - let position = -1; - if (charstrings) { - for (let code in charstrings) { - code |= 0; - if (firstCharIndex > code || !firstCharIndex) { - firstCharIndex = code; - } - if (lastCharIndex < code) { - lastCharIndex = code; - } - position = getUnicodeRangeFor(code, position); - if (position < 32) { - ulUnicodeRange1 |= 1 << position; - } else if (position < 64) { - ulUnicodeRange2 |= 1 << position - 32; - } else if (position < 96) { - ulUnicodeRange3 |= 1 << position - 64; - } else if (position < 123) { - ulUnicodeRange4 |= 1 << position - 96; - } else { - throw new FormatError("Unicode ranges Bits > 123 are reserved for internal usage"); - } - } - if (lastCharIndex > 0xffff) { - lastCharIndex = 0xffff; - } - } else { - firstCharIndex = 0; - lastCharIndex = 255; - } - const bbox = properties.bbox || [0, 0, 0, 0]; - const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); - const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; - const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); - let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); - if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { - typoDescent = -typoDescent; - } - const winAscent = override.yMax || typoAscent; - const winDescent = -override.yMin || -typoDescent; - return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03"; -} -function createPostTable(properties) { - const angle = Math.floor(properties.italicAngle * 2 ** 16); - return "\x00\x03\x00\x00" + string32(angle) + "\x00\x00" + "\x00\x00" + string32(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; -} -function createPostscriptName(name) { - return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); -} -function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; - } - const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"]; - const stringsUnicode = []; - let i, ii, j, jj, str; - for (i = 0, ii = strings.length; i < ii; i++) { - str = proto[1][i] || strings[i]; - const strBufUnicode = []; - for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); - } - stringsUnicode.push(strBufUnicode.join("")); - } - const names = [strings, stringsUnicode]; - const platforms = ["\x00\x01", "\x00\x03"]; - const encodings = ["\x00\x00", "\x00\x01"]; - const languages = ["\x00\x00", "\x04\x09"]; - const namesRecordCount = strings.length * platforms.length; - let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); - let strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - const strs = names[i]; - for (j = 0, jj = strs.length; j < jj; j++) { - str = strs[j]; - const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); - nameTable += nameRecord; - strOffset += str.length; - } - } - nameTable += strings.join("") + stringsUnicode.join(""); - return nameTable; -} -class Font { - constructor(name, file, properties, evaluatorOptions) { - this.name = name; - this.psName = null; - this.mimetype = null; - this.disableFontFace = evaluatorOptions.disableFontFace; - this.fontExtraProperties = evaluatorOptions.fontExtraProperties; - this.loadedName = properties.loadedName; - this.isType3Font = properties.isType3Font; - this.missingFile = false; - this.cssFontInfo = properties.cssFontInfo; - this._charsCache = Object.create(null); - this._glyphCache = Object.create(null); - let isSerifFont = !!(properties.flags & FontFlags.Serif); - if (!isSerifFont && !properties.isSimulatedFlags) { - const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], - serifFonts = getSerifFonts(); - for (const namePart of baseName.split("+")) { - if (serifFonts[namePart]) { - isSerifFont = true; - break; - } - } - } - this.isSerifFont = isSerifFont; - this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); - let { - type, - subtype - } = properties; - this.type = type; - this.subtype = subtype; - this.systemFontInfo = properties.systemFontInfo; - const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); - this.isInvalidPDFjsFont = !!matches; - if (this.isInvalidPDFjsFont) { - this.fallbackName = matches[1]; - } else if (this.isMonospace) { - this.fallbackName = "monospace"; - } else if (this.isSerifFont) { - this.fallbackName = "serif"; - } else { - this.fallbackName = "sans-serif"; - } - if (this.systemFontInfo?.guessFallback) { - this.systemFontInfo.guessFallback = false; - this.systemFontInfo.css += `,${this.fallbackName}`; - } - this.differences = properties.differences; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.composite = properties.composite; - this.cMap = properties.cMap; - this.capHeight = properties.capHeight / PDF_GLYPH_SPACE_UNITS; - this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; - this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; - this.lineHeight = this.ascent - this.descent; - this.fontMatrix = properties.fontMatrix; - this.bbox = properties.bbox; - this.defaultEncoding = properties.defaultEncoding; - this.toUnicode = properties.toUnicode; - this.toFontChar = []; - if (properties.type === "Type3") { - for (let charCode = 0; charCode < 256; charCode++) { - this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; - } - return; - } - this.cidEncoding = properties.cidEncoding || ""; - this.vertical = !!properties.vertical; - if (this.vertical) { - this.vmetrics = properties.vmetrics; - this.defaultVMetrics = properties.defaultVMetrics; - } - if (!file || file.isEmpty) { - if (file) { - warn('Font file is empty in "' + name + '" (' + this.loadedName + ")"); - } - this.fallbackToSystemFont(properties); - return; - } - [type, subtype] = getFontFileType(file, properties); - if (type !== this.type || subtype !== this.subtype) { - info("Inconsistent font file Type/SubType, expected: " + `${this.type}/${this.subtype} but found: ${type}/${subtype}.`); - } - let data; - try { - switch (type) { - case "MMType1": - info("MMType1 font (" + name + "), falling back to Type1."); - case "Type1": - case "CIDFontType0": - this.mimetype = "font/opentype"; - const cff = subtype === "Type1C" || subtype === "CIDFontType0C" ? new CFFFont(file, properties) : new Type1Font(name, file, properties); - adjustWidths(properties); - data = this.convert(name, cff, properties); - break; - case "OpenType": - case "TrueType": - case "CIDFontType2": - this.mimetype = "font/opentype"; - data = this.checkAndRepair(name, file, properties); - adjustWidths(properties); - if (this.isOpenType) { - type = "OpenType"; - } - break; - default: - throw new FormatError(`Font ${type} is not supported`); - } - } catch (e) { - warn(e); - this.fallbackToSystemFont(properties); - return; - } - amendFallbackToUnicode(properties); - this.data = data; - this.type = type; - this.subtype = subtype; - this.fontMatrix = properties.fontMatrix; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.toUnicode = properties.toUnicode; - this.seacMap = properties.seacMap; - } - get renderer() { - const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); - return shadow(this, "renderer", renderer); - } - exportData() { - const exportDataProps = this.fontExtraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; - const data = Object.create(null); - for (const prop of exportDataProps) { - const value = this[prop]; - if (value !== undefined) { - data[prop] = value; - } - } - return data; - } - fallbackToSystemFont(properties) { - this.missingFile = true; - const { - name, - type - } = this; - let fontName = normalizeFontName(name); - const stdFontMap = getStdFontMap(), - nonStdFontMap = getNonStdFontMap(); - const isStandardFont = !!stdFontMap[fontName]; - const isMappedToStandardFont = !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); - fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; - const fontBasicMetricsMap = getFontBasicMetrics(); - const metrics = fontBasicMetricsMap[fontName]; - if (metrics) { - if (isNaN(this.ascent)) { - this.ascent = metrics.ascent / PDF_GLYPH_SPACE_UNITS; - } - if (isNaN(this.descent)) { - this.descent = metrics.descent / PDF_GLYPH_SPACE_UNITS; - } - if (isNaN(this.capHeight)) { - this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; - } - } - this.bold = /bold/gi.test(fontName); - this.italic = /oblique|italic/gi.test(fontName); - this.black = /Black/g.test(name); - const isNarrow = /Narrow/g.test(name); - this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; - if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { - const cidToGidMap = properties.cidToGidMap; - const map = []; - applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); - if (/Arial-?Black/i.test(name)) { - applyStandardFontGlyphMap(map, getSupplementalGlyphMapForArialBlack()); - } else if (/Calibri/i.test(name)) { - applyStandardFontGlyphMap(map, getSupplementalGlyphMapForCalibri()); - } - if (cidToGidMap) { - for (const charCode in map) { - const cid = map[charCode]; - if (cidToGidMap[cid] !== undefined) { - map[+charCode] = cidToGidMap[cid]; - } - } - if (cidToGidMap.length !== this.toUnicode.length && properties.hasIncludedToUnicodeMap && this.toUnicode instanceof IdentityToUnicodeMap) { - this.toUnicode.forEach(function (charCode, unicodeCharCode) { - const cid = map[charCode]; - if (cidToGidMap[cid] === undefined) { - map[+charCode] = unicodeCharCode; - } - }); - } - } - if (!(this.toUnicode instanceof IdentityToUnicodeMap)) { - this.toUnicode.forEach(function (charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - this.toUnicode = new ToUnicodeMap(map); - } else if (/Symbol/i.test(fontName)) { - this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences); - } else if (/Dingbats/i.test(fontName)) { - this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences); - } else if (isStandardFont || isMappedToStandardFont) { - const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences); - if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) { - this.toUnicode.forEach(function (charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - } else { - const glyphsUnicodeMap = getGlyphsUnicode(); - const map = []; - this.toUnicode.forEach((charCode, unicodeCharCode) => { - if (!this.composite) { - const glyphName = this.differences[charCode] || this.defaultEncoding[charCode]; - const unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - unicodeCharCode = unicode; - } - } - map[+charCode] = unicodeCharCode; - }); - if (this.composite && this.toUnicode instanceof IdentityToUnicodeMap) { - if (/Tahoma|Verdana/i.test(name)) { - applyStandardFontGlyphMap(map, getGlyphMapForStandardFonts()); - } - } - this.toFontChar = map; - } - amendFallbackToUnicode(properties); - this.loadedName = fontName.split("-", 1)[0]; - } - checkAndRepair(name, font, properties) { - const VALID_TABLES = ["OS/2", "cmap", "head", "hhea", "hmtx", "maxp", "name", "post", "loca", "glyf", "fpgm", "prep", "cvt ", "CFF "]; - function readTables(file, numTables) { - const tables = Object.create(null); - tables["OS/2"] = null; - tables.cmap = null; - tables.head = null; - tables.hhea = null; - tables.hmtx = null; - tables.maxp = null; - tables.name = null; - tables.post = null; - for (let i = 0; i < numTables; i++) { - const table = readTableEntry(file); - if (!VALID_TABLES.includes(table.tag)) { - continue; - } - if (table.length === 0) { - continue; - } - tables[table.tag] = table; - } - return tables; - } - function readTableEntry(file) { - const tag = file.getString(4); - const checksum = file.getInt32() >>> 0; - const offset = file.getInt32() >>> 0; - const length = file.getInt32() >>> 0; - const previousPosition = file.pos; - file.pos = file.start || 0; - file.skip(offset); - const data = file.getBytes(length); - file.pos = previousPosition; - if (tag === "head") { - data[8] = data[9] = data[10] = data[11] = 0; - data[17] |= 0x20; - } - return { - tag, - checksum, - length, - offset, - data - }; - } - function readOpenTypeHeader(ttf) { - return { - version: ttf.getString(4), - numTables: ttf.getUint16(), - searchRange: ttf.getUint16(), - entrySelector: ttf.getUint16(), - rangeShift: ttf.getUint16() - }; - } - function readTrueTypeCollectionHeader(ttc) { - const ttcTag = ttc.getString(4); - assert(ttcTag === "ttcf", "Must be a TrueType Collection font."); - const majorVersion = ttc.getUint16(); - const minorVersion = ttc.getUint16(); - const numFonts = ttc.getInt32() >>> 0; - const offsetTable = []; - for (let i = 0; i < numFonts; i++) { - offsetTable.push(ttc.getInt32() >>> 0); - } - const header = { - ttcTag, - majorVersion, - minorVersion, - numFonts, - offsetTable - }; - switch (majorVersion) { - case 1: - return header; - case 2: - header.dsigTag = ttc.getInt32() >>> 0; - header.dsigLength = ttc.getInt32() >>> 0; - header.dsigOffset = ttc.getInt32() >>> 0; - return header; - } - throw new FormatError(`Invalid TrueType Collection majorVersion: ${majorVersion}.`); - } - function readTrueTypeCollectionData(ttc, fontName) { - const { - numFonts, - offsetTable - } = readTrueTypeCollectionHeader(ttc); - const fontNameParts = fontName.split("+"); - let fallbackData; - for (let i = 0; i < numFonts; i++) { - ttc.pos = (ttc.start || 0) + offsetTable[i]; - const potentialHeader = readOpenTypeHeader(ttc); - const potentialTables = readTables(ttc, potentialHeader.numTables); - if (!potentialTables.name) { - throw new FormatError('TrueType Collection font must contain a "name" table.'); - } - const [nameTable] = readNameTable(potentialTables.name); - for (let j = 0, jj = nameTable.length; j < jj; j++) { - for (let k = 0, kk = nameTable[j].length; k < kk; k++) { - const nameEntry = nameTable[j][k]?.replaceAll(/\s/g, ""); - if (!nameEntry) { - continue; - } - if (nameEntry === fontName) { - return { - header: potentialHeader, - tables: potentialTables - }; - } - if (fontNameParts.length < 2) { - continue; - } - for (const part of fontNameParts) { - if (nameEntry === part) { - fallbackData = { - name: part, - header: potentialHeader, - tables: potentialTables - }; - } - } - } - } - } - if (fallbackData) { - warn(`TrueType Collection does not contain "${fontName}" font, ` + `falling back to "${fallbackData.name}" font instead.`); - return { - header: fallbackData.header, - tables: fallbackData.tables - }; - } - throw new FormatError(`TrueType Collection does not contain "${fontName}" font.`); - } - function readCmapTable(cmap, file, isSymbolicFont, hasEncoding) { - if (!cmap) { - warn("No cmap table available."); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - let segment; - let start = (file.start || 0) + cmap.offset; - file.pos = start; - file.skip(2); - const numTables = file.getUint16(); - let potentialTable; - let canBreak = false; - for (let i = 0; i < numTables; i++) { - const platformId = file.getUint16(); - const encodingId = file.getUint16(); - const offset = file.getInt32() >>> 0; - let useTable = false; - if (potentialTable?.platformId === platformId && potentialTable?.encodingId === encodingId) { - continue; - } - if (platformId === 0 && (encodingId === 0 || encodingId === 1 || encodingId === 3)) { - useTable = true; - } else if (platformId === 1 && encodingId === 0) { - useTable = true; - } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) { - useTable = true; - if (!isSymbolicFont) { - canBreak = true; - } - } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { - useTable = true; - let correctlySorted = true; - if (i < numTables - 1) { - const nextBytes = file.peekBytes(2), - nextPlatformId = int16(nextBytes[0], nextBytes[1]); - if (nextPlatformId < platformId) { - correctlySorted = false; - } - } - if (correctlySorted) { - canBreak = true; - } - } - if (useTable) { - potentialTable = { - platformId, - encodingId, - offset - }; - } - if (canBreak) { - break; - } - } - if (potentialTable) { - file.pos = start + potentialTable.offset; - } - if (!potentialTable || file.peekByte() === -1) { - warn("Could not find a preferred cmap table."); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - const format = file.getUint16(); - let hasShortCmap = false; - const mappings = []; - let j, glyphId; - if (format === 0) { - file.skip(2 + 2); - for (j = 0; j < 256; j++) { - const index = file.getByte(); - if (!index) { - continue; - } - mappings.push({ - charCode: j, - glyphId: index - }); - } - hasShortCmap = true; - } else if (format === 2) { - file.skip(2 + 2); - const subHeaderKeys = []; - let maxSubHeaderKey = 0; - for (let i = 0; i < 256; i++) { - const subHeaderKey = file.getUint16() >> 3; - subHeaderKeys.push(subHeaderKey); - maxSubHeaderKey = Math.max(subHeaderKey, maxSubHeaderKey); - } - const subHeaders = []; - for (let i = 0; i <= maxSubHeaderKey; i++) { - subHeaders.push({ - firstCode: file.getUint16(), - entryCount: file.getUint16(), - idDelta: signedInt16(file.getByte(), file.getByte()), - idRangePos: file.pos + file.getUint16() - }); - } - for (let i = 0; i < 256; i++) { - if (subHeaderKeys[i] === 0) { - file.pos = subHeaders[0].idRangePos + 2 * i; - glyphId = file.getUint16(); - mappings.push({ - charCode: i, - glyphId - }); - } else { - const s = subHeaders[subHeaderKeys[i]]; - for (j = 0; j < s.entryCount; j++) { - const charCode = (i << 8) + j + s.firstCode; - file.pos = s.idRangePos + 2 * j; - glyphId = file.getUint16(); - if (glyphId !== 0) { - glyphId = (glyphId + s.idDelta) % 65536; - } - mappings.push({ - charCode, - glyphId - }); - } - } - } - } else if (format === 4) { - file.skip(2 + 2); - const segCount = file.getUint16() >> 1; - file.skip(6); - const segments = []; - let segIndex; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments.push({ - end: file.getUint16() - }); - } - file.skip(2); - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].start = file.getUint16(); - } - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].delta = file.getUint16(); - } - let offsetsCount = 0, - offsetIndex; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - const rangeOffset = file.getUint16(); - if (!rangeOffset) { - segment.offsetIndex = -1; - continue; - } - offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); - segment.offsetIndex = offsetIndex; - offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); - } - const offsets = []; - for (j = 0; j < offsetsCount; j++) { - offsets.push(file.getUint16()); - } - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - start = segment.start; - const end = segment.end; - const delta = segment.delta; - offsetIndex = segment.offsetIndex; - for (j = start; j <= end; j++) { - if (j === 0xffff) { - continue; - } - glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; - glyphId = glyphId + delta & 0xffff; - mappings.push({ - charCode: j, - glyphId - }); - } - } - } else if (format === 6) { - file.skip(2 + 2); - const firstCode = file.getUint16(); - const entryCount = file.getUint16(); - for (j = 0; j < entryCount; j++) { - glyphId = file.getUint16(); - const charCode = firstCode + j; - mappings.push({ - charCode, - glyphId - }); - } - } else if (format === 12) { - file.skip(2 + 4 + 4); - const nGroups = file.getInt32() >>> 0; - for (j = 0; j < nGroups; j++) { - const startCharCode = file.getInt32() >>> 0; - const endCharCode = file.getInt32() >>> 0; - let glyphCode = file.getInt32() >>> 0; - for (let charCode = startCharCode; charCode <= endCharCode; charCode++) { - mappings.push({ - charCode, - glyphId: glyphCode++ - }); - } - } - } else { - warn("cmap table has unsupported format: " + format); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - mappings.sort((a, b) => a.charCode - b.charCode); - const finalMappings = [], - seenCharCodes = new Set(); - for (const map of mappings) { - const { - charCode - } = map; - if (seenCharCodes.has(charCode)) { - continue; - } - seenCharCodes.add(charCode); - finalMappings.push(map); - } - return { - platformId: potentialTable.platformId, - encodingId: potentialTable.encodingId, - mappings: finalMappings, - hasShortCmap - }; - } - function sanitizeMetrics(file, header, metrics, headTable, numGlyphs, dupFirstEntry) { - if (!header) { - if (metrics) { - metrics.data = null; - } - return; - } - file.pos = (file.start || 0) + header.offset; - file.pos += 4; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - file.pos += 2; - const caretOffset = file.getUint16(); - file.pos += 8; - file.pos += 2; - let numOfMetrics = file.getUint16(); - if (caretOffset !== 0) { - const macStyle = int16(headTable.data[44], headTable.data[45]); - if (!(macStyle & 2)) { - header.data[22] = 0; - header.data[23] = 0; - } - } - if (numOfMetrics > numGlyphs) { - info(`The numOfMetrics (${numOfMetrics}) should not be ` + `greater than the numGlyphs (${numGlyphs}).`); - numOfMetrics = numGlyphs; - header.data[34] = (numOfMetrics & 0xff00) >> 8; - header.data[35] = numOfMetrics & 0x00ff; - } - const numOfSidebearings = numGlyphs - numOfMetrics; - const numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); - if (numMissing > 0) { - const entries = new Uint8Array(metrics.length + numMissing * 2); - entries.set(metrics.data); - if (dupFirstEntry) { - entries[metrics.length] = metrics.data[2]; - entries[metrics.length + 1] = metrics.data[3]; - } - metrics.data = entries; - } - } - function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { - const glyphProfile = { - length: 0, - sizeOfInstructions: 0 - }; - if (sourceStart < 0 || sourceStart >= source.length || sourceEnd > source.length || sourceEnd - sourceStart <= 12) { - return glyphProfile; - } - const glyf = source.subarray(sourceStart, sourceEnd); - const xMin = signedInt16(glyf[2], glyf[3]); - const yMin = signedInt16(glyf[4], glyf[5]); - const xMax = signedInt16(glyf[6], glyf[7]); - const yMax = signedInt16(glyf[8], glyf[9]); - if (xMin > xMax) { - writeSignedInt16(glyf, 2, xMax); - writeSignedInt16(glyf, 6, xMin); - } - if (yMin > yMax) { - writeSignedInt16(glyf, 4, yMax); - writeSignedInt16(glyf, 8, yMin); - } - const contoursCount = signedInt16(glyf[0], glyf[1]); - if (contoursCount < 0) { - if (contoursCount < -1) { - return glyphProfile; - } - dest.set(glyf, destStart); - glyphProfile.length = glyf.length; - return glyphProfile; - } - let i, - j = 10, - flagsCount = 0; - for (i = 0; i < contoursCount; i++) { - const endPoint = glyf[j] << 8 | glyf[j + 1]; - flagsCount = endPoint + 1; - j += 2; - } - const instructionsStart = j; - const instructionsLength = glyf[j] << 8 | glyf[j + 1]; - glyphProfile.sizeOfInstructions = instructionsLength; - j += 2 + instructionsLength; - const instructionsEnd = j; - let coordinatesLength = 0; - for (i = 0; i < flagsCount; i++) { - const flag = glyf[j++]; - if (flag & 0xc0) { - glyf[j - 1] = flag & 0x3f; - } - let xLength = 2; - if (flag & 2) { - xLength = 1; - } else if (flag & 16) { - xLength = 0; - } - let yLength = 2; - if (flag & 4) { - yLength = 1; - } else if (flag & 32) { - yLength = 0; - } - const xyLength = xLength + yLength; - coordinatesLength += xyLength; - if (flag & 8) { - const repeat = glyf[j++]; - if (repeat === 0) { - glyf[j - 1] ^= 8; - } - i += repeat; - coordinatesLength += repeat * xyLength; - } - } - if (coordinatesLength === 0) { - return glyphProfile; - } - let glyphDataLength = j + coordinatesLength; - if (glyphDataLength > glyf.length) { - return glyphProfile; - } - if (!hintsValid && instructionsLength > 0) { - dest.set(glyf.subarray(0, instructionsStart), destStart); - dest.set([0, 0], destStart + instructionsStart); - dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); - glyphDataLength -= instructionsLength; - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = glyphDataLength + 3 & ~3; - } - glyphProfile.length = glyphDataLength; - return glyphProfile; - } - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = glyphDataLength + 3 & ~3; - dest.set(glyf.subarray(0, glyphDataLength), destStart); - glyphProfile.length = glyphDataLength; - return glyphProfile; - } - dest.set(glyf, destStart); - glyphProfile.length = glyf.length; - return glyphProfile; - } - function sanitizeHead(head, numGlyphs, locaLength) { - const data = head.data; - const version = int32(data[0], data[1], data[2], data[3]); - if (version >> 16 !== 1) { - info("Attempting to fix invalid version in head table: " + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; - } - const indexToLocFormat = int16(data[50], data[51]); - if (indexToLocFormat < 0 || indexToLocFormat > 1) { - info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); - const numGlyphsPlusOne = numGlyphs + 1; - if (locaLength === numGlyphsPlusOne << 1) { - data[50] = 0; - data[51] = 0; - } else if (locaLength === numGlyphsPlusOne << 2) { - data[50] = 0; - data[51] = 1; - } else { - throw new FormatError("Could not fix indexToLocFormat: " + indexToLocFormat); - } - } - } - function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) { - let itemSize, itemDecode, itemEncode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; - }; - itemEncode = function fontItemEncodeLong(data, offset, value) { - data[offset] = value >>> 24 & 0xff; - data[offset + 1] = value >> 16 & 0xff; - data[offset + 2] = value >> 8 & 0xff; - data[offset + 3] = value & 0xff; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return data[offset] << 9 | data[offset + 1] << 1; - }; - itemEncode = function fontItemEncode(data, offset, value) { - data[offset] = value >> 9 & 0xff; - data[offset + 1] = value >> 1 & 0xff; - }; - } - const numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs; - const locaDataSize = itemSize * (1 + numGlyphsOut); - const locaData = new Uint8Array(locaDataSize); - locaData.set(loca.data.subarray(0, locaDataSize)); - loca.data = locaData; - const oldGlyfData = glyf.data; - const oldGlyfDataLength = oldGlyfData.length; - const newGlyfData = new Uint8Array(oldGlyfDataLength); - let i, j; - const locaEntries = []; - for (i = 0, j = 0; i < numGlyphs + 1; i++, j += itemSize) { - let offset = itemDecode(locaData, j); - if (offset > oldGlyfDataLength) { - offset = oldGlyfDataLength; - } - locaEntries.push({ - index: i, - offset, - endOffset: 0 - }); - } - locaEntries.sort((a, b) => a.offset - b.offset); - for (i = 0; i < numGlyphs; i++) { - locaEntries[i].endOffset = locaEntries[i + 1].offset; - } - locaEntries.sort((a, b) => a.index - b.index); - for (i = 0; i < numGlyphs; i++) { - const { - offset, - endOffset - } = locaEntries[i]; - if (offset !== 0 || endOffset !== 0) { - break; - } - const nextOffset = locaEntries[i + 1].offset; - if (nextOffset === 0) { - continue; - } - locaEntries[i].endOffset = nextOffset; - break; - } - const last = locaEntries.at(-2); - if (last.offset !== 0 && last.endOffset === 0) { - last.endOffset = oldGlyfDataLength; - } - const missingGlyphs = Object.create(null); - let writeOffset = 0; - itemEncode(locaData, 0, writeOffset); - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); - const newLength = glyphProfile.length; - if (newLength === 0) { - missingGlyphs[i] = true; - } - if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) { - maxSizeOfInstructions = glyphProfile.sizeOfInstructions; - } - writeOffset += newLength; - itemEncode(locaData, j, writeOffset); - } - if (writeOffset === 0) { - const simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); - for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) { - itemEncode(locaData, j, simpleGlyph.length); - } - glyf.data = simpleGlyph; - } else if (dupFirstEntry) { - const firstEntryLength = itemDecode(locaData, itemSize); - if (newGlyfData.length > firstEntryLength + writeOffset) { - glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); - } else { - glyf.data = new Uint8Array(firstEntryLength + writeOffset); - glyf.data.set(newGlyfData.subarray(0, writeOffset)); - } - glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); - itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); - } else { - glyf.data = newGlyfData.subarray(0, writeOffset); - } - return { - missingGlyphs, - maxSizeOfInstructions - }; - } - function readPostScriptTable(post, propertiesObj, maxpNumGlyphs) { - const start = (font.start || 0) + post.offset; - font.pos = start; - const length = post.length, - end = start + length; - const version = font.getInt32(); - font.skip(28); - let glyphNames; - let valid = true; - let i; - switch (version) { - case 0x00010000: - glyphNames = MacStandardGlyphOrdering; - break; - case 0x00020000: - const numGlyphs = font.getUint16(); - if (numGlyphs !== maxpNumGlyphs) { - valid = false; - break; - } - const glyphNameIndexes = []; - for (i = 0; i < numGlyphs; ++i) { - const index = font.getUint16(); - if (index >= 32768) { - valid = false; - break; - } - glyphNameIndexes.push(index); - } - if (!valid) { - break; - } - const customNames = [], - strBuf = []; - while (font.pos < end) { - const stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join("")); - } - glyphNames = []; - for (i = 0; i < numGlyphs; ++i) { - const j = glyphNameIndexes[i]; - if (j < 258) { - glyphNames.push(MacStandardGlyphOrdering[j]); - continue; - } - glyphNames.push(customNames[j - 258]); - } - break; - case 0x00030000: - break; - default: - warn("Unknown/unsupported post table version " + version); - valid = false; - if (propertiesObj.defaultEncoding) { - glyphNames = propertiesObj.defaultEncoding; - } - break; - } - propertiesObj.glyphNames = glyphNames; - return valid; - } - function readNameTable(nameTable) { - const start = (font.start || 0) + nameTable.offset; - font.pos = start; - const names = [[], []], - records = []; - const length = nameTable.length, - end = start + length; - const format = font.getUint16(); - const FORMAT_0_HEADER_LENGTH = 6; - if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { - return [names, records]; - } - const numRecords = font.getUint16(); - const stringsStart = font.getUint16(); - const NAME_RECORD_LENGTH = 12; - let i, ii; - for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { - const r = { - platform: font.getUint16(), - encoding: font.getUint16(), - language: font.getUint16(), - name: font.getUint16(), - length: font.getUint16(), - offset: font.getUint16() - }; - if (isMacNameRecord(r) || isWinNameRecord(r)) { - records.push(r); - } - } - for (i = 0, ii = records.length; i < ii; i++) { - const record = records[i]; - if (record.length <= 0) { - continue; - } - const pos = start + stringsStart + record.offset; - if (pos + record.length > end) { - continue; - } - font.pos = pos; - const nameIndex = record.name; - if (record.encoding) { - let str = ""; - for (let j = 0, jj = record.length; j < jj; j += 2) { - str += String.fromCharCode(font.getUint16()); - } - names[1][nameIndex] = str; - } else { - names[0][nameIndex] = font.getString(record.length); - } - } - return [names, records]; - } - const TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; - function sanitizeTTProgram(table, ttContext) { - let data = table.data; - let i = 0, - j, - n, - b, - funcId, - pc, - lastEndf = 0, - lastDeff = 0; - const stack = []; - const callstack = []; - const functionsCalled = []; - let tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; - let inFDEF = false, - ifLevel = 0, - inELSE = 0; - for (let ii = data.length; i < ii;) { - const op = data[i++]; - if (op === 0x40) { - n = data[i++]; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if (op === 0x41) { - n = data[i++]; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push(b << 8 | data[i++]); - } - } - } else if ((op & 0xf8) === 0xb0) { - n = op - 0xb0 + 1; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if ((op & 0xf8) === 0xb8) { - n = op - 0xb8 + 1; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push(signedInt16(b, data[i++])); - } - } - } else if (op === 0x2b && !tooComplexToFollowFunctions) { - if (!inFDEF && !inELSE) { - funcId = stack.at(-1); - if (isNaN(funcId)) { - info("TT: CALL empty stack (or invalid entry)."); - } else { - ttContext.functionsUsed[funcId] = true; - if (funcId in ttContext.functionsStackDeltas) { - const newStackLength = stack.length + ttContext.functionsStackDeltas[funcId]; - if (newStackLength < 0) { - warn("TT: CALL invalid functions stack delta."); - ttContext.hintsValid = false; - return; - } - stack.length = newStackLength; - } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) { - callstack.push({ - data, - i, - stackTop: stack.length - 1 - }); - functionsCalled.push(funcId); - pc = ttContext.functionsDefined[funcId]; - if (!pc) { - warn("TT: CALL non-existent function"); - ttContext.hintsValid = false; - return; - } - data = pc.data; - i = pc.i; - } - } - } - } else if (op === 0x2c && !tooComplexToFollowFunctions) { - if (inFDEF || inELSE) { - warn("TT: nested FDEFs not allowed"); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - lastDeff = i; - funcId = stack.pop(); - ttContext.functionsDefined[funcId] = { - data, - i - }; - } else if (op === 0x2d) { - if (inFDEF) { - inFDEF = false; - lastEndf = i; - } else { - pc = callstack.pop(); - if (!pc) { - warn("TT: ENDF bad stack"); - ttContext.hintsValid = false; - return; - } - funcId = functionsCalled.pop(); - data = pc.data; - i = pc.i; - ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; - } - } else if (op === 0x89) { - if (inFDEF || inELSE) { - warn("TT: nested IDEFs not allowed"); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - lastDeff = i; - } else if (op === 0x58) { - ++ifLevel; - } else if (op === 0x1b) { - inELSE = ifLevel; - } else if (op === 0x59) { - if (inELSE === ifLevel) { - inELSE = 0; - } - --ifLevel; - } else if (op === 0x1c) { - if (!inFDEF && !inELSE) { - const offset = stack.at(-1); - if (offset > 0) { - i += offset - 1; - } - } - } - if (!inFDEF && !inELSE) { - let stackDelta = 0; - if (op <= 0x8e) { - stackDelta = TTOpsStackDeltas[op]; - } else if (op >= 0xc0 && op <= 0xdf) { - stackDelta = -1; - } else if (op >= 0xe0) { - stackDelta = -2; - } - if (op >= 0x71 && op <= 0x75) { - n = stack.pop(); - if (!isNaN(n)) { - stackDelta = -n * 2; - } - } - while (stackDelta < 0 && stack.length > 0) { - stack.pop(); - stackDelta++; - } - while (stackDelta > 0) { - stack.push(NaN); - stackDelta--; - } - } - } - ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; - const content = [data]; - if (i > data.length) { - content.push(new Uint8Array(i - data.length)); - } - if (lastDeff > lastEndf) { - warn("TT: complementing a missing function tail"); - content.push(new Uint8Array([0x22, 0x2d])); - } - foldTTTable(table, content); - } - function checkInvalidFunctions(ttContext, maxFunctionDefs) { - if (ttContext.tooComplexToFollowFunctions) { - return; - } - if (ttContext.functionsDefined.length > maxFunctionDefs) { - warn("TT: more functions defined than expected"); - ttContext.hintsValid = false; - return; - } - for (let j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { - if (j > maxFunctionDefs) { - warn("TT: invalid function id: " + j); - ttContext.hintsValid = false; - return; - } - if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { - warn("TT: undefined function: " + j); - ttContext.hintsValid = false; - return; - } - } - } - function foldTTTable(table, content) { - if (content.length > 1) { - let newLength = 0; - let j, jj; - for (j = 0, jj = content.length; j < jj; j++) { - newLength += content[j].length; - } - newLength = newLength + 3 & ~3; - const result = new Uint8Array(newLength); - let pos = 0; - for (j = 0, jj = content.length; j < jj; j++) { - result.set(content[j], pos); - pos += content[j].length; - } - table.data = result; - table.length = newLength; - } - } - function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { - const ttContext = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: false, - hintsValid: true - }; - if (fpgm) { - sanitizeTTProgram(fpgm, ttContext); - } - if (prep) { - sanitizeTTProgram(prep, ttContext); - } - if (fpgm) { - checkInvalidFunctions(ttContext, maxFunctionDefs); - } - if (cvt && cvt.length & 1) { - const cvtData = new Uint8Array(cvt.length + 1); - cvtData.set(cvt.data); - cvt.data = cvtData; - } - return ttContext.hintsValid; - } - font = new Stream(new Uint8Array(font.getBytes())); - let header, tables; - if (isTrueTypeCollectionFile(font)) { - const ttcData = readTrueTypeCollectionData(font, this.name); - header = ttcData.header; - tables = ttcData.tables; - } else { - header = readOpenTypeHeader(font); - tables = readTables(font, header.numTables); - } - let cff, cffFile; - const isTrueType = !tables["CFF "]; - if (!isTrueType) { - const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap)); - if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { - cffFile = new Stream(tables["CFF "].data); - cff = new CFFFont(cffFile, properties); - return this.convert(name, cff, properties); - } - delete tables.glyf; - delete tables.loca; - delete tables.fpgm; - delete tables.prep; - delete tables["cvt "]; - this.isOpenType = true; - } else { - if (!tables.loca) { - throw new FormatError('Required "loca" table is not found'); - } - if (!tables.glyf) { - warn('Required "glyf" table is not found -- trying to recover.'); - tables.glyf = { - tag: "glyf", - data: new Uint8Array(0) - }; - } - this.isOpenType = false; - } - if (!tables.maxp) { - throw new FormatError('Required "maxp" table is not found'); - } - font.pos = (font.start || 0) + tables.maxp.offset; - let version = font.getInt32(); - const numGlyphs = font.getUint16(); - if (version !== 0x00010000 && version !== 0x00005000) { - if (tables.maxp.length === 6) { - version = 0x0005000; - } else if (tables.maxp.length >= 32) { - version = 0x00010000; - } else { - throw new FormatError(`"maxp" table has a wrong version number`); - } - writeUint32(tables.maxp.data, 0, version); - } - if (properties.scaleFactors?.length === numGlyphs && isTrueType) { - const { - scaleFactors - } = properties; - const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); - const glyphs = new GlyfTable({ - glyfTable: tables.glyf.data, - isGlyphLocationsLong, - locaTable: tables.loca.data, - numGlyphs - }); - glyphs.scale(scaleFactors); - const { - glyf, - loca, - isLocationLong - } = glyphs.write(); - tables.glyf.data = glyf; - tables.loca.data = loca; - if (isLocationLong !== !!isGlyphLocationsLong) { - tables.head.data[50] = 0; - tables.head.data[51] = isLocationLong ? 1 : 0; - } - const metrics = tables.hmtx.data; - for (let i = 0; i < numGlyphs; i++) { - const j = 4 * i; - const advanceWidth = Math.round(scaleFactors[i] * int16(metrics[j], metrics[j + 1])); - metrics[j] = advanceWidth >> 8 & 0xff; - metrics[j + 1] = advanceWidth & 0xff; - const lsb = Math.round(scaleFactors[i] * signedInt16(metrics[j + 2], metrics[j + 3])); - writeSignedInt16(metrics, j + 2, lsb); - } - } - let numGlyphsOut = numGlyphs + 1; - let dupFirstEntry = true; - if (numGlyphsOut > 0xffff) { - dupFirstEntry = false; - numGlyphsOut = numGlyphs; - warn("Not enough space in glyfs to duplicate first glyph."); - } - let maxFunctionDefs = 0; - let maxSizeOfInstructions = 0; - if (version >= 0x00010000 && tables.maxp.length >= 32) { - font.pos += 8; - const maxZones = font.getUint16(); - if (maxZones > 2) { - tables.maxp.data[14] = 0; - tables.maxp.data[15] = 2; - } - font.pos += 4; - maxFunctionDefs = font.getUint16(); - font.pos += 4; - maxSizeOfInstructions = font.getUint16(); - } - tables.maxp.data[4] = numGlyphsOut >> 8; - tables.maxp.data[5] = numGlyphsOut & 255; - const hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, tables["cvt "], maxFunctionDefs); - if (!hintsValid) { - delete tables.fpgm; - delete tables.prep; - delete tables["cvt "]; - } - sanitizeMetrics(font, tables.hhea, tables.hmtx, tables.head, numGlyphsOut, dupFirstEntry); - if (!tables.head) { - throw new FormatError('Required "head" table is not found'); - } - sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); - let missingGlyphs = Object.create(null); - if (isTrueType) { - const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); - const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); - missingGlyphs = glyphsInfo.missingGlyphs; - if (version >= 0x00010000 && tables.maxp.length >= 32) { - tables.maxp.data[26] = glyphsInfo.maxSizeOfInstructions >> 8; - tables.maxp.data[27] = glyphsInfo.maxSizeOfInstructions & 255; - } - } - if (!tables.hhea) { - throw new FormatError('Required "hhea" table is not found'); - } - if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { - tables.hhea.data[10] = 0xff; - tables.hhea.data[11] = 0xff; - } - const metricsOverride = { - unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), - yMax: signedInt16(tables.head.data[42], tables.head.data[43]), - yMin: signedInt16(tables.head.data[38], tables.head.data[39]), - ascent: signedInt16(tables.hhea.data[4], tables.hhea.data[5]), - descent: signedInt16(tables.hhea.data[6], tables.hhea.data[7]), - lineGap: signedInt16(tables.hhea.data[8], tables.hhea.data[9]) - }; - this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; - this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; - this.lineGap = metricsOverride.lineGap / metricsOverride.unitsPerEm; - if (this.cssFontInfo?.lineHeight) { - this.lineHeight = this.cssFontInfo.metrics.lineHeight; - this.lineGap = this.cssFontInfo.metrics.lineGap; - } else { - this.lineHeight = this.ascent - this.descent + this.lineGap; - } - if (tables.post) { - readPostScriptTable(tables.post, properties, numGlyphs); - } - tables.post = { - tag: "post", - data: createPostTable(properties) - }; - const charCodeToGlyphId = Object.create(null); - function hasGlyph(glyphId) { - return !missingGlyphs[glyphId]; - } - if (properties.composite) { - const cidToGidMap = properties.cidToGidMap || []; - const isCidToGidMapEmpty = cidToGidMap.length === 0; - properties.cMap.forEach(function (charCode, cid) { - if (typeof cid === "string") { - cid = convertCidString(charCode, cid, true); - } - if (cid > 0xffff) { - throw new FormatError("Max size of CID is 65,535"); - } - let glyphId = -1; - if (isCidToGidMapEmpty) { - glyphId = cid; - } else if (cidToGidMap[cid] !== undefined) { - glyphId = cidToGidMap[cid]; - } - if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) { - charCodeToGlyphId[charCode] = glyphId; - } - }); - } else { - const cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont, properties.hasEncoding); - const cmapPlatformId = cmapTable.platformId; - const cmapEncodingId = cmapTable.encodingId; - const cmapMappings = cmapTable.mappings; - let baseEncoding = [], - forcePostTable = false; - if (properties.hasEncoding && (properties.baseEncodingName === "MacRomanEncoding" || properties.baseEncodingName === "WinAnsiEncoding")) { - baseEncoding = getEncoding(properties.baseEncodingName); - } - if (properties.hasEncoding && !this.isSymbolicFont && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0)) { - const glyphsUnicodeMap = getGlyphsUnicode(); - for (let charCode = 0; charCode < 256; charCode++) { - let glyphName; - if (this.differences[charCode] !== undefined) { - glyphName = this.differences[charCode]; - } else if (baseEncoding.length && baseEncoding[charCode] !== "") { - glyphName = baseEncoding[charCode]; - } else { - glyphName = StandardEncoding[charCode]; - } - if (!glyphName) { - continue; - } - const standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); - let unicodeOrCharCode; - if (cmapPlatformId === 3 && cmapEncodingId === 1) { - unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; - } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { - unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); - } - if (unicodeOrCharCode === undefined) { - if (!properties.glyphNames && properties.hasIncludedToUnicodeMap && !(this.toUnicode instanceof IdentityToUnicodeMap)) { - const unicode = this.toUnicode.get(charCode); - if (unicode) { - unicodeOrCharCode = unicode.codePointAt(0); - } - } - if (unicodeOrCharCode === undefined) { - continue; - } - } - for (const mapping of cmapMappings) { - if (mapping.charCode !== unicodeOrCharCode) { - continue; - } - charCodeToGlyphId[charCode] = mapping.glyphId; - break; - } - } - } else if (cmapPlatformId === 0) { - for (const mapping of cmapMappings) { - charCodeToGlyphId[mapping.charCode] = mapping.glyphId; - } - forcePostTable = true; - } else if (cmapPlatformId === 3 && cmapEncodingId === 0) { - for (const mapping of cmapMappings) { - let charCode = mapping.charCode; - if (charCode >= 0xf000 && charCode <= 0xf0ff) { - charCode &= 0xff; - } - charCodeToGlyphId[charCode] = mapping.glyphId; - } - } else { - for (const mapping of cmapMappings) { - charCodeToGlyphId[mapping.charCode] = mapping.glyphId; - } - } - if (properties.glyphNames && (baseEncoding.length || this.differences.length)) { - for (let i = 0; i < 256; ++i) { - if (!forcePostTable && charCodeToGlyphId[i] !== undefined) { - continue; - } - const glyphName = this.differences[i] || baseEncoding[i]; - if (!glyphName) { - continue; - } - const glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0 && hasGlyph(glyphId)) { - charCodeToGlyphId[i] = glyphId; - } - } - } - } - if (charCodeToGlyphId.length === 0) { - charCodeToGlyphId[0] = 0; - } - let glyphZeroId = numGlyphsOut - 1; - if (!dupFirstEntry) { - glyphZeroId = 0; - } - if (!properties.cssFontInfo) { - const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); - this.toFontChar = newMapping.toFontChar; - tables.cmap = { - tag: "cmap", - data: createCmapTable(newMapping.charCodeToGlyphId, newMapping.toUnicodeExtraMap, numGlyphsOut) - }; - if (!tables["OS/2"] || !validateOS2Table(tables["OS/2"], font)) { - tables["OS/2"] = { - tag: "OS/2", - data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) - }; - } - } - if (!isTrueType) { - try { - cffFile = new Stream(tables["CFF "].data); - const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); - cff = parser.parse(); - cff.duplicateFirstGlyph(); - const compiler = new CFFCompiler(cff); - tables["CFF "].data = compiler.compile(); - } catch { - warn("Failed to compile font " + properties.loadedName); - } - } - if (!tables.name) { - tables.name = { - tag: "name", - data: createNameTable(this.name) - }; - } else { - const [namePrototype, nameRecords] = readNameTable(tables.name); - tables.name.data = createNameTable(name, namePrototype); - this.psName = namePrototype[0][6] || null; - if (!properties.composite) { - adjustTrueTypeToUnicode(properties, this.isSymbolicFont, nameRecords); - } - } - const builder = new OpenTypeFileBuilder(header.version); - for (const tableTag in tables) { - builder.addTable(tableTag, tables[tableTag].data); - } - return builder.toArray(); - } - convert(fontName, font, properties) { - properties.fixedPitch = false; - if (properties.builtInEncoding) { - adjustType1ToUnicode(properties, properties.builtInEncoding); - } - let glyphZeroId = 1; - if (font instanceof CFFFont) { - glyphZeroId = font.numGlyphs - 1; - } - const mapping = font.getGlyphMapping(properties); - let newMapping = null; - let newCharCodeToGlyphId = mapping; - let toUnicodeExtraMap = null; - if (!properties.cssFontInfo) { - newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId, this.toUnicode); - this.toFontChar = newMapping.toFontChar; - newCharCodeToGlyphId = newMapping.charCodeToGlyphId; - toUnicodeExtraMap = newMapping.toUnicodeExtraMap; - } - const numGlyphs = font.numGlyphs; - function getCharCodes(charCodeToGlyphId, glyphId) { - let charCodes = null; - for (const charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - (charCodes ||= []).push(charCode | 0); - } - } - return charCodes; - } - function createCharCode(charCodeToGlyphId, glyphId) { - for (const charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - return charCode | 0; - } - } - newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; - return newMapping.nextAvailableFontCharCode++; - } - const seacs = font.seacs; - if (newMapping && SEAC_ANALYSIS_ENABLED && seacs?.length) { - const matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; - const charset = font.getCharset(); - const seacMap = Object.create(null); - for (let glyphId in seacs) { - glyphId |= 0; - const seac = seacs[glyphId]; - const baseGlyphName = StandardEncoding[seac[2]]; - const accentGlyphName = StandardEncoding[seac[3]]; - const baseGlyphId = charset.indexOf(baseGlyphName); - const accentGlyphId = charset.indexOf(accentGlyphName); - if (baseGlyphId < 0 || accentGlyphId < 0) { - continue; - } - const accentOffset = { - x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], - y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] - }; - const charCodes = getCharCodes(mapping, glyphId); - if (!charCodes) { - continue; - } - for (const charCode of charCodes) { - const charCodeToGlyphId = newMapping.charCodeToGlyphId; - const baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); - const accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); - seacMap[charCode] = { - baseFontCharCode, - accentFontCharCode, - accentOffset - }; - } - } - properties.seacMap = seacMap; - } - const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; - const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); - builder.addTable("CFF ", font.data); - builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); - builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); - builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00"); - builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs)); - builder.addTable("hmtx", function fontFieldsHmtx() { - const charstrings = font.charstrings; - const cffWidths = font.cff ? font.cff.widths : null; - let hmtx = "\x00\x00\x00\x00"; - for (let i = 1, ii = numGlyphs; i < ii; i++) { - let width = 0; - if (charstrings) { - const charstring = charstrings[i - 1]; - width = "width" in charstring ? charstring.width : 0; - } else if (cffWidths) { - width = Math.ceil(cffWidths[i] || 0); - } - hmtx += string16(width) + string16(0); - } - return hmtx; - }()); - builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); - builder.addTable("name", createNameTable(fontName)); - builder.addTable("post", createPostTable(properties)); - return builder.toArray(); - } - get _spaceWidth() { - const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; - let width; - for (const glyphName of possibleSpaceReplacements) { - if (glyphName in this.widths) { - width = this.widths[glyphName]; - break; - } - const glyphsUnicodeMap = getGlyphsUnicode(); - const glyphUnicode = glyphsUnicodeMap[glyphName]; - let charcode = 0; - if (this.composite && this.cMap.contains(glyphUnicode)) { - charcode = this.cMap.lookup(glyphUnicode); - if (typeof charcode === "string") { - charcode = convertCidString(glyphUnicode, charcode); - } - } - if (!charcode && this.toUnicode) { - charcode = this.toUnicode.charCodeOf(glyphUnicode); - } - if (charcode <= 0) { - charcode = glyphUnicode; - } - width = this.widths[charcode]; - if (width) { - break; - } - } - return shadow(this, "_spaceWidth", width || this.defaultWidth); - } - _charToGlyph(charcode, isSpace = false) { - let glyph = this._glyphCache[charcode]; - if (glyph?.isSpace === isSpace) { - return glyph; - } - let fontCharCode, width, operatorListId; - let widthCode = charcode; - if (this.cMap?.contains(charcode)) { - widthCode = this.cMap.lookup(charcode); - if (typeof widthCode === "string") { - widthCode = convertCidString(charcode, widthCode); - } - } - width = this.widths[widthCode]; - if (typeof width !== "number") { - width = this.defaultWidth; - } - const vmetric = this.vmetrics?.[widthCode]; - let unicode = this.toUnicode.get(charcode) || charcode; - if (typeof unicode === "number") { - unicode = String.fromCharCode(unicode); - } - let isInFont = this.toFontChar[charcode] !== undefined; - fontCharCode = this.toFontChar[charcode] || charcode; - if (this.missingFile) { - const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; - if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { - fontCharCode = 0x20; - if (glyphName === "") { - width ||= this._spaceWidth; - unicode = String.fromCharCode(fontCharCode); - } - } - fontCharCode = mapSpecialUnicodeValues(fontCharCode); - } - if (this.isType3Font) { - operatorListId = fontCharCode; - } - let accent = null; - if (this.seacMap?.[charcode]) { - isInFont = true; - const seac = this.seacMap[charcode]; - fontCharCode = seac.baseFontCharCode; - accent = { - fontChar: String.fromCodePoint(seac.accentFontCharCode), - offset: seac.accentOffset - }; - } - let fontChar = ""; - if (typeof fontCharCode === "number") { - if (fontCharCode <= 0x10ffff) { - fontChar = String.fromCodePoint(fontCharCode); - } else { - warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); - } - } - if (this.missingFile && this.vertical && fontChar.length === 1) { - const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; - if (vertical) { - fontChar = unicode = String.fromCharCode(vertical); - } - } - glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); - return this._glyphCache[charcode] = glyph; - } - charsToGlyphs(chars) { - let glyphs = this._charsCache[chars]; - if (glyphs) { - return glyphs; - } - glyphs = []; - if (this.cMap) { - const c = Object.create(null), - ii = chars.length; - let i = 0; - while (i < ii) { - this.cMap.readCharCode(chars, i, c); - const { - charcode, - length - } = c; - i += length; - const glyph = this._charToGlyph(charcode, length === 1 && chars.charCodeAt(i - 1) === 0x20); - glyphs.push(glyph); - } - } else { - for (let i = 0, ii = chars.length; i < ii; ++i) { - const charcode = chars.charCodeAt(i); - const glyph = this._charToGlyph(charcode, charcode === 0x20); - glyphs.push(glyph); - } - } - return this._charsCache[chars] = glyphs; - } - getCharPositions(chars) { - const positions = []; - if (this.cMap) { - const c = Object.create(null); - let i = 0; - while (i < chars.length) { - this.cMap.readCharCode(chars, i, c); - const length = c.length; - positions.push([i, i + length]); - i += length; - } - } else { - for (let i = 0, ii = chars.length; i < ii; ++i) { - positions.push([i, i + 1]); - } - } - return positions; - } - get glyphCacheValues() { - return Object.values(this._glyphCache); - } - encodeString(str) { - const buffers = []; - const currentBuf = []; - const hasCurrentBufErrors = () => buffers.length % 2 === 1; - const getCharCode = this.toUnicode instanceof IdentityToUnicodeMap ? unicode => this.toUnicode.charCodeOf(unicode) : unicode => this.toUnicode.charCodeOf(String.fromCodePoint(unicode)); - for (let i = 0, ii = str.length; i < ii; i++) { - const unicode = str.codePointAt(i); - if (unicode > 0xd7ff && (unicode < 0xe000 || unicode > 0xfffd)) { - i++; - } - if (this.toUnicode) { - const charCode = getCharCode(unicode); - if (charCode !== -1) { - if (hasCurrentBufErrors()) { - buffers.push(currentBuf.join("")); - currentBuf.length = 0; - } - const charCodeLength = this.cMap ? this.cMap.getCharCodeLength(charCode) : 1; - for (let j = charCodeLength - 1; j >= 0; j--) { - currentBuf.push(String.fromCharCode(charCode >> 8 * j & 0xff)); - } - continue; - } - } - if (!hasCurrentBufErrors()) { - buffers.push(currentBuf.join("")); - currentBuf.length = 0; - } - currentBuf.push(String.fromCodePoint(unicode)); - } - buffers.push(currentBuf.join("")); - return buffers; - } -} -class ErrorFont { - constructor(error) { - this.error = error; - this.loadedName = "g_font_error"; - this.missingFile = true; - } - charsToGlyphs() { - return []; - } - encodeString(chars) { - return [chars]; - } - exportData() { - return { - error: this.error - }; - } -} - -;// ./src/core/pattern.js - - - - -const ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; -class Pattern { - constructor() { - unreachable("Cannot initialize Pattern."); - } - static parseShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { - const dict = shading instanceof BaseStream ? shading.dict : shading; - const type = dict.get("ShadingType"); - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new MeshShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); - default: - throw new FormatError("Unsupported ShadingType: " + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(ex); - return new DummyShading(); - } - } -} -class BaseShading { - static SMALL_NUMBER = 1e-6; - getIR() { - unreachable("Abstract method `getIR` called."); - } -} -class RadialAxialShading extends BaseShading { - constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { - super(); - this.shadingType = dict.get("ShadingType"); - let coordsLen = 0; - if (this.shadingType === ShadingType.AXIAL) { - coordsLen = 4; - } else if (this.shadingType === ShadingType.RADIAL) { - coordsLen = 6; - } - this.coordsArr = dict.getArray("Coords"); - if (!isNumberArray(this.coordsArr, coordsLen)) { - throw new FormatError("RadialAxialShading: Invalid /Coords array."); - } - const cs = ColorSpaceUtils.parse({ - cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), - xref, - resources, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - this.bbox = lookupNormalRect(dict.getArray("BBox"), null); - let t0 = 0.0, - t1 = 1.0; - const domainArr = dict.getArray("Domain"); - if (isNumberArray(domainArr, 2)) { - [t0, t1] = domainArr; - } - let extendStart = false, - extendEnd = false; - const extendArr = dict.getArray("Extend"); - if (isBooleanArray(extendArr, 2)) { - [extendStart, extendEnd] = extendArr; - } - if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { - const [x1, y1, r1, x2, y2, r2] = this.coordsArr; - const distance = Math.hypot(x1 - x2, y1 - y2); - if (r1 <= r2 + distance && r2 <= r1 + distance) { - warn("Unsupported radial gradient."); - } - } - this.extendStart = extendStart; - this.extendEnd = extendEnd; - const fnObj = dict.getRaw("Function"); - const fn = pdfFunctionFactory.create(fnObj, true); - const NUMBER_OF_SAMPLES = 840; - const step = (t1 - t0) / NUMBER_OF_SAMPLES; - const colorStops = this.colorStops = []; - if (t0 >= t1 || step <= 0) { - info("Bad shading domain."); - return; - } - const color = new Float32Array(cs.numComps), - ratio = new Float32Array(1); - let iBase = 0; - ratio[0] = t0; - fn(ratio, 0, color, 0); - const rgbBuffer = new Uint8ClampedArray(3); - cs.getRgb(color, 0, rgbBuffer); - let [rBase, gBase, bBase] = rgbBuffer; - colorStops.push([0, Util.makeHexColor(rBase, gBase, bBase)]); - let iPrev = 1; - ratio[0] = t0 + step; - fn(ratio, 0, color, 0); - cs.getRgb(color, 0, rgbBuffer); - let [rPrev, gPrev, bPrev] = rgbBuffer; - let maxSlopeR = rPrev - rBase + 1; - let maxSlopeG = gPrev - gBase + 1; - let maxSlopeB = bPrev - bBase + 1; - let minSlopeR = rPrev - rBase - 1; - let minSlopeG = gPrev - gBase - 1; - let minSlopeB = bPrev - bBase - 1; - for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { - ratio[0] = t0 + i * step; - fn(ratio, 0, color, 0); - cs.getRgb(color, 0, rgbBuffer); - const [r, g, b] = rgbBuffer; - const run = i - iBase; - maxSlopeR = Math.min(maxSlopeR, (r - rBase + 1) / run); - maxSlopeG = Math.min(maxSlopeG, (g - gBase + 1) / run); - maxSlopeB = Math.min(maxSlopeB, (b - bBase + 1) / run); - minSlopeR = Math.max(minSlopeR, (r - rBase - 1) / run); - minSlopeG = Math.max(minSlopeG, (g - gBase - 1) / run); - minSlopeB = Math.max(minSlopeB, (b - bBase - 1) / run); - const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; - if (!slopesExist) { - const cssColor = Util.makeHexColor(rPrev, gPrev, bPrev); - colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); - maxSlopeR = r - rPrev + 1; - maxSlopeG = g - gPrev + 1; - maxSlopeB = b - bPrev + 1; - minSlopeR = r - rPrev - 1; - minSlopeG = g - gPrev - 1; - minSlopeB = b - bPrev - 1; - iBase = iPrev; - rBase = rPrev; - gBase = gPrev; - bBase = bPrev; - } - iPrev = i; - rPrev = r; - gPrev = g; - bPrev = b; - } - colorStops.push([1, Util.makeHexColor(rPrev, gPrev, bPrev)]); - let background = "transparent"; - if (dict.has("Background")) { - background = cs.getRgbHex(dict.get("Background"), 0); - } - if (!extendStart) { - colorStops.unshift([0, background]); - colorStops[1][0] += BaseShading.SMALL_NUMBER; - } - if (!extendEnd) { - colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; - colorStops.push([1, background]); - } - this.colorStops = colorStops; - } - getIR() { - const { - coordsArr, - shadingType - } = this; - let type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = "axial"; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = "radial"; - } else { - unreachable(`getPattern type unknown: ${shadingType}`); - } - return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; - } -} -class MeshStreamReader { - constructor(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - const numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - const csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; - } - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - const nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - } - readBits(n) { - const { - stream - } = this; - let { - buffer, - bufferLength - } = this; - if (n === 32) { - if (bufferLength === 0) { - return stream.getInt32() >>> 0; - } - buffer = buffer << 24 | stream.getByte() << 16 | stream.getByte() << 8 | stream.getByte(); - const nextByte = stream.getByte(); - this.buffer = nextByte & (1 << bufferLength) - 1; - return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return stream.getByte(); - } - while (bufferLength < n) { - buffer = buffer << 8 | stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & (1 << bufferLength) - 1; - return buffer >> bufferLength; - } - align() { - this.buffer = 0; - this.bufferLength = 0; - } - readFlag() { - return this.readBits(this.context.bitsPerFlag); - } - readCoordinate() { - const { - bitsPerCoordinate, - decode - } = this.context; - const xi = this.readBits(bitsPerCoordinate); - const yi = this.readBits(bitsPerCoordinate); - const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; - return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; - } - readComponents() { - const { - bitsPerComponent, - colorFn, - colorSpace, - decode, - numComps - } = this.context; - const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; - const components = this.tmpCompsBuf; - for (let i = 0, j = 4; i < numComps; i++, j += 2) { - const ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - const color = this.tmpCsCompsBuf; - colorFn?.(components, 0, color, 0); - return colorSpace.getRgb(color, 0); - } -} -let bCache = Object.create(null); -function buildB(count) { - const lut = []; - for (let i = 0; i <= count; i++) { - const t = i / count, - t_ = 1 - t; - lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); - } - return lut; -} -function getB(count) { - return bCache[count] ||= buildB(count); -} -function clearPatternCaches() { - bCache = Object.create(null); -} -class MeshShading extends BaseShading { - static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - static TRIANGLE_DENSITY = 20; - constructor(stream, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { - super(); - if (!(stream instanceof BaseStream)) { - throw new FormatError("Mesh data is not a stream"); - } - const dict = stream.dict; - this.shadingType = dict.get("ShadingType"); - this.bbox = lookupNormalRect(dict.getArray("BBox"), null); - const cs = ColorSpaceUtils.parse({ - cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), - xref, - resources, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; - const fnObj = dict.getRaw("Function"); - const fn = fnObj ? pdfFunctionFactory.create(fnObj, true) : null; - this.coords = []; - this.colors = []; - this.figures = []; - const decodeContext = { - bitsPerCoordinate: dict.get("BitsPerCoordinate"), - bitsPerComponent: dict.get("BitsPerComponent"), - bitsPerFlag: dict.get("BitsPerFlag"), - decode: dict.getArray("Decode"), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - const reader = new MeshStreamReader(stream, decodeContext); - let patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - this._decodeType4Shading(reader); - break; - case ShadingType.LATTICE_FORM_MESH: - const verticesPerRow = dict.get("VerticesPerRow") | 0; - if (verticesPerRow < 2) { - throw new FormatError("Invalid VerticesPerRow"); - } - this._decodeType5Shading(reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - this._decodeType6Shading(reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - this._decodeType7Shading(reader); - patchMesh = true; - break; - default: - unreachable("Unsupported mesh type."); - break; - } - if (patchMesh) { - this._updateBounds(); - for (let i = 0, ii = this.figures.length; i < ii; i++) { - this._buildFigureFromPatch(i); - } - } - this._updateBounds(); - this._packData(); - } - _decodeType4Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const operators = []; - const ps = []; - let verticesLeft = 0; - while (reader.hasData) { - const f = reader.readFlag(); - const coord = reader.readCoordinate(); - const color = reader.readComponents(); - if (verticesLeft === 0) { - if (!(0 <= f && f <= 2)) { - throw new FormatError("Unknown type4 flag"); - } - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps.at(-2), ps.at(-1)); - verticesLeft = 1; - break; - case 2: - ps.push(ps.at(-3), ps.at(-1)); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - reader.align(); - } - this.figures.push({ - type: "triangles", - coords: new Int32Array(ps), - colors: new Int32Array(ps) - }); - } - _decodeType5Shading(reader, verticesPerRow) { - const coords = this.coords; - const colors = this.colors; - const ps = []; - while (reader.hasData) { - const coord = reader.readCoordinate(); - const color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - this.figures.push({ - type: "lattice", - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow - }); - } - _decodeType6Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const ps = new Int32Array(16); - const cs = new Int32Array(4); - while (reader.hasData) { - const f = reader.readFlag(); - if (!(0 <= f && f <= 3)) { - throw new FormatError("Unknown type6 flag"); - } - const pi = coords.length; - for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { - coords.push(reader.readCoordinate()); - } - const ci = colors.length; - for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { - colors.push(reader.readComponents()); - } - let tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; - ps[13] = pi + 4; - ps[14] = pi + 5; - ps[15] = pi + 6; - ps[8] = pi + 2; - ps[11] = pi + 7; - ps[4] = pi + 1; - ps[7] = pi + 8; - ps[0] = pi; - ps[1] = pi + 11; - ps[2] = pi + 10; - ps[3] = pi + 9; - cs[2] = ci + 1; - cs[3] = ci + 2; - cs[0] = ci; - cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; - tmp2 = ps[13]; - tmp3 = ps[14]; - tmp4 = ps[15]; - ps[12] = tmp4; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = tmp3; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[2]; - tmp2 = cs[3]; - cs[2] = tmp2; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[7]; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[1]; - ps[11] = pi + 3; - ps[4] = ps[2]; - ps[7] = pi + 4; - ps[0] = ps[3]; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - cs[2] = cs[0]; - cs[3] = ci; - cs[0] = cs[1]; - cs[1] = ci + 1; - break; - } - ps[5] = coords.length; - coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); - ps[6] = coords.length; - coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); - ps[9] = coords.length; - coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); - ps[10] = coords.length; - coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); - this.figures.push({ - type: "patch", - coords: new Int32Array(ps), - colors: new Int32Array(cs) - }); - } - } - _decodeType7Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const ps = new Int32Array(16); - const cs = new Int32Array(4); - while (reader.hasData) { - const f = reader.readFlag(); - if (!(0 <= f && f <= 3)) { - throw new FormatError("Unknown type7 flag"); - } - const pi = coords.length; - for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { - coords.push(reader.readCoordinate()); - } - const ci = colors.length; - for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { - colors.push(reader.readComponents()); - } - let tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; - ps[13] = pi + 4; - ps[14] = pi + 5; - ps[15] = pi + 6; - ps[8] = pi + 2; - ps[9] = pi + 13; - ps[10] = pi + 14; - ps[11] = pi + 7; - ps[4] = pi + 1; - ps[5] = pi + 12; - ps[6] = pi + 15; - ps[7] = pi + 8; - ps[0] = pi; - ps[1] = pi + 11; - ps[2] = pi + 10; - ps[3] = pi + 9; - cs[2] = ci + 1; - cs[3] = ci + 2; - cs[0] = ci; - cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; - tmp2 = ps[13]; - tmp3 = ps[14]; - tmp4 = ps[15]; - ps[12] = tmp4; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = tmp3; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[2]; - tmp2 = cs[3]; - cs[2] = tmp2; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[7]; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[1]; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = ps[2]; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = ps[3]; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - cs[2] = cs[0]; - cs[3] = ci; - cs[0] = cs[1]; - cs[1] = ci + 1; - break; - } - this.figures.push({ - type: "patch", - coords: new Int32Array(ps), - colors: new Int32Array(cs) - }); - } - } - _buildFigureFromPatch(index) { - const figure = this.figures[index]; - assert(figure.type === "patch", "Unexpected patch mesh figure"); - const coords = this.coords, - colors = this.colors; - const pi = figure.coords; - const ci = figure.colors; - const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); - const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); - const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); - const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); - let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); - splitXBy = MathClamp(splitXBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); - let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); - splitYBy = MathClamp(splitYBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); - const verticesPerRow = splitXBy + 1; - const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - let k = 0; - const cl = new Uint8Array(3), - cr = new Uint8Array(3); - const c0 = colors[ci[0]], - c1 = colors[ci[1]], - c2 = colors[ci[2]], - c3 = colors[ci[3]]; - const bRow = getB(splitYBy), - bCol = getB(splitXBy); - for (let row = 0; row <= splitYBy; row++) { - cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; - cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; - cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; - cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; - cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; - cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; - for (let col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { - continue; - } - let x = 0, - y = 0; - let q = 0; - for (let i = 0; i <= 3; i++) { - for (let j = 0; j <= 3; j++, q++) { - const m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - const newColor = new Uint8Array(3); - newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; - newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; - newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - this.figures[index] = { - type: "lattice", - coords: figureCoords, - colors: figureColors, - verticesPerRow - }; - } - _updateBounds() { - let minX = this.coords[0][0], - minY = this.coords[0][1], - maxX = minX, - maxY = minY; - for (let i = 1, ii = this.coords.length; i < ii; i++) { - const x = this.coords[i][0], - y = this.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - this.bounds = [minX, minY, maxX, maxY]; - } - _packData() { - let i, ii, j, jj; - const coords = this.coords; - const coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - const xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - this.coords = coordsPacked; - const colors = this.colors; - const colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - const c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - this.colors = colorsPacked; - const figures = this.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - const figure = figures[i], - ps = figure.coords, - cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - getIR() { - const { - bounds - } = this; - if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { - throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); - } - return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background]; - } -} -class DummyShading extends BaseShading { - getIR() { - return ["Dummy"]; - } -} -function getTilingPatternIR(operatorList, dict, color) { - const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); - const bbox = lookupNormalRect(dict.getArray("BBox"), null); - if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { - throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); - } - const xstep = dict.get("XStep"); - if (typeof xstep !== "number") { - throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); - } - const ystep = dict.get("YStep"); - if (typeof ystep !== "number") { - throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); - } - const paintType = dict.get("PaintType"); - if (!Number.isInteger(paintType)) { - throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); - } - const tilingType = dict.get("TilingType"); - if (!Number.isInteger(tilingType)) { - throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); - } - return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; -} - -;// ./src/core/calibri_factors.js -const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const CalibriBoldMetrics = { - lineHeight: 1.2207, - lineGap: 0.2207 -}; -const CalibriBoldItalicFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.56239, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.71805, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.90872, 0.85938, 0.79795, 0.87068, 0.77958, 0.69766, 0.81055, 0.90399, 0.88653, 0.96068, 0.82577, 0.77892, 0.78257, 0.97507, 1.529, 0.97507, 0.85284, 0.89552, 0.90176, 0.94908, 0.86411, 0.74012, 0.86411, 0.88323, 0.95015, 0.86411, 0.86331, 0.88401, 0.91916, 0.86304, 0.88401, 0.9039, 0.86331, 0.86331, 0.86411, 0.86411, 0.90464, 0.70852, 1.04106, 0.86331, 0.84372, 0.95794, 0.82616, 0.84548, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.19129, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.71805, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.90872, 0.85938, 0.85938, 0.85938, 0.85938, 0.85938, 0.85284, 0.87068, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.94908, 0.85887, 0.74012, 0.88323, 0.88323, 0.88323, 0.88323, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.86331, 0.90747, 0.89049, 0.86331, 0.86331, 0.86331, 0.86331, 0.84548, 0.86411, 0.84548, 0.83908, 0.94908, 0.83908, 0.94908, 0.83908, 0.94908, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.71805, 0.74012, 0.87289, 0.79538, 0.88506, 0.92726, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.73133, 0.88323, 0.81921, 0.86411, 0.81921, 0.86411, 0.81921, 0.86411, 1, 1, 0.87356, 0.86331, 0.91075, 0.8777, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76467, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.77312, 0.91926, 0.88175, 0.70823, 0.94903, 0.90872, 0.86331, 1, 1, 0.90872, 0.86331, 0.86906, 0.88116, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.85938, 0.86331, 0.87402, 0.86549, 0.77958, 0.90464, 1, 1, 0.77958, 0.90464, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 0.69766, 0.70852, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.90399, 0.86331, 0.96068, 0.95794, 0.77892, 0.84548, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.94908, 0.77539, 0.85887, 0.87068, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70088, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.48387, 0.83908, 0.80352, 0.57118, 0.6965, 0.56347, 0.79179, 0.55853, 0.80346, 1.02988, 0.83908, 0.7762, 0.67174, 0.86036, 0.73133, 0.78257, 0.87356, 0.86441, 0.95958, 0.75727, 0.89019, 1.04924, 0.90872, 0.74889, 0.85938, 0.87891, 0.79795, 0.7957, 0.81055, 0.77892, 0.97447, 0.82577, 0.97466, 0.87179, 0.95958, 0.77892, 0.94252, 0.95612, 0.8753, 1.02988, 0.92733, 0.94252, 0.87411, 0.84021, 0.8728, 0.95612, 0.74081, 0.8753, 1.02189, 1.02988, 0.84814, 0.87445, 0.91822, 0.84723, 0.85668, 0.86331, 0.81344, 0.87581, 0.76422, 0.82046, 0.96057, 0.92733, 0.99375, 0.78022, 0.95452, 0.86015, 1.02988, 0.92733, 0.86331, 0.92733, 0.86015, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90631, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88323, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85174, 1, 1, 1, 1, 1, 1, 0.96068, 0.95794, 0.96068, 0.95794, 0.96068, 0.95794, 0.77892, 0.84548, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.89807, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71094, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.92972, 0.83406, 0.91133, 0.83326, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90616, 1.81055, 0.90527, 1.81055, 1.3107, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const CalibriBoldItalicMetrics = { - lineHeight: 1.2207, - lineGap: 0.2207 -}; -const CalibriItalicFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39543, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.72346, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89249, 0.84118, 0.77452, 0.85374, 0.75186, 0.67789, 0.79776, 0.88844, 0.85066, 0.94309, 0.77818, 0.7306, 0.76659, 1.10369, 1.38313, 1.10369, 1.06139, 0.89552, 0.8739, 0.9245, 0.9245, 0.83203, 0.9245, 0.85865, 1.09842, 0.9245, 0.9245, 1.03297, 1.07692, 0.90918, 1.03297, 0.94959, 0.9245, 0.92274, 0.9245, 0.9245, 1.02933, 0.77832, 1.20562, 0.9245, 0.8916, 0.98986, 0.86621, 0.89453, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.16359, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.72346, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89249, 0.84118, 0.84118, 0.84118, 0.84118, 0.84118, 0.85284, 0.84557, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.9245, 0.84843, 0.83203, 0.85865, 0.85865, 0.85865, 0.85865, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.9245, 0.92274, 0.92274, 0.92274, 0.92274, 0.92274, 0.90747, 0.86651, 0.9245, 0.9245, 0.9245, 0.9245, 0.89453, 0.9245, 0.89453, 0.8675, 0.9245, 0.8675, 0.9245, 0.8675, 0.9245, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.72346, 0.83203, 0.85193, 0.8875, 0.86477, 0.99034, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.73206, 0.85865, 0.81105, 0.9245, 0.81105, 0.9245, 0.81105, 0.9245, 1, 1, 0.86275, 0.9245, 0.90872, 0.93591, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77896, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.9375, 0.98156, 0.93407, 0.77261, 1.11429, 0.89249, 0.9245, 1, 1, 0.89249, 0.9245, 0.92534, 0.86698, 0.9245, 0.84118, 0.92274, 0.84118, 0.92274, 0.84118, 0.92274, 0.8667, 0.86291, 0.75186, 1.02933, 1, 1, 0.75186, 1.02933, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 0.67789, 0.77832, 1, 1, 0.79776, 0.97655, 0.79776, 1.23023, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.88844, 0.9245, 0.94309, 0.98986, 0.7306, 0.89453, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.9245, 0.76318, 0.84843, 0.84557, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67009, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.8675, 0.90861, 0.6192, 0.7363, 0.64824, 0.82411, 0.56321, 0.85696, 1.23516, 0.8675, 0.81552, 0.7286, 0.84134, 0.73206, 0.76659, 0.86275, 0.84369, 0.90685, 0.77892, 0.85871, 1.02638, 0.89249, 0.75828, 0.84118, 0.85984, 0.77452, 0.76466, 0.79776, 0.7306, 0.90782, 0.77818, 0.903, 0.87291, 0.90685, 0.7306, 0.99058, 1.03667, 0.94635, 1.23516, 0.9849, 0.99058, 0.92393, 0.8916, 0.942, 1.03667, 0.75026, 0.94635, 1.0297, 1.23516, 0.90918, 0.94048, 0.98217, 0.89746, 0.84153, 0.92274, 0.82507, 0.88832, 0.84438, 0.88178, 1.03525, 0.9849, 1.00225, 0.78086, 0.97248, 0.89404, 1.23516, 0.9849, 0.92274, 0.9849, 0.89404, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89693, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.85865, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90933, 1, 1, 1, 1, 1, 1, 0.94309, 0.98986, 0.94309, 0.98986, 0.94309, 0.98986, 0.7306, 0.89453, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.68994, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.97858, 0.82616, 0.91133, 0.83437, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90572, 1.81055, 0.90749, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85284, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const CalibriItalicMetrics = { - lineHeight: 1.2207, - lineGap: 0.2207 -}; -const CalibriRegularFactors = [1.3877, 1, 1, 1, 1.17223, 1.1293, 0.89552, 0.91133, 0.80395, 1.02269, 1.15601, 0.91056, 0.91056, 1.2798, 0.85284, 0.89807, 1, 0.90861, 1.39016, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.96309, 0.96309, 0.85284, 0.85284, 0.85284, 0.83319, 0.88071, 0.8675, 0.81552, 0.73834, 0.85193, 0.73206, 0.7522, 0.81105, 0.86275, 0.90685, 0.6377, 0.77892, 0.75593, 1.02638, 0.89385, 0.85122, 0.77452, 0.86503, 0.75186, 0.68887, 0.79776, 0.88844, 0.85066, 0.94258, 0.77818, 0.7306, 0.76659, 1.10369, 1.39016, 1.10369, 1.06139, 0.89552, 0.8739, 0.86128, 0.94469, 0.8457, 0.94469, 0.89464, 1.09842, 0.84636, 0.94469, 1.03297, 1.07692, 0.90918, 1.03297, 0.95897, 0.94469, 0.9482, 0.94469, 0.94469, 1.04692, 0.78223, 1.20562, 0.94469, 0.90332, 0.98986, 0.86621, 0.90527, 0.79004, 0.94152, 1.77256, 0.94152, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.91729, 0.89552, 1.17889, 1.13254, 1.08707, 0.92098, 0.85284, 0.68787, 0.71353, 0.84737, 0.90747, 1.0088, 1.0044, 0.87683, 1, 1.09091, 1, 0.92229, 0.739, 1.15642, 0.92098, 0.76288, 0.80504, 0.80972, 0.75859, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.8675, 0.76318, 0.73834, 0.73206, 0.73206, 0.73206, 0.73206, 0.90685, 0.90685, 0.90685, 0.90685, 0.86477, 0.89385, 0.85122, 0.85122, 0.85122, 0.85122, 0.85122, 0.85284, 0.85311, 0.88844, 0.88844, 0.88844, 0.88844, 0.7306, 0.77452, 0.86331, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.86128, 0.8693, 0.8457, 0.89464, 0.89464, 0.89464, 0.89464, 0.82601, 0.82601, 0.82601, 0.82601, 0.94469, 0.94469, 0.9482, 0.9482, 0.9482, 0.9482, 0.9482, 0.90747, 0.86651, 0.94469, 0.94469, 0.94469, 0.94469, 0.90527, 0.94469, 0.90527, 0.8675, 0.86128, 0.8675, 0.86128, 0.8675, 0.86128, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.73834, 0.8457, 0.85193, 0.92454, 0.86477, 0.9921, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.73206, 0.89464, 0.81105, 0.84636, 0.81105, 0.84636, 0.81105, 0.84636, 1, 1, 0.86275, 0.94469, 0.90872, 0.95786, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 0.82601, 0.90685, 1.03297, 0.90685, 0.82601, 0.77741, 1.05611, 0.6377, 1.07692, 1, 1, 0.90918, 0.75593, 1.03297, 1, 1, 0.76032, 0.90452, 0.98156, 1.11842, 0.77261, 1.11429, 0.89385, 0.94469, 1, 1, 0.89385, 0.94469, 0.95877, 0.86901, 0.94469, 0.85122, 0.9482, 0.85122, 0.9482, 0.85122, 0.9482, 0.8667, 0.90016, 0.75186, 1.04692, 1, 1, 0.75186, 1.04692, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 0.68887, 0.78223, 1, 1, 0.79776, 0.92188, 0.79776, 1.23023, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.88844, 0.94469, 0.94258, 0.98986, 0.7306, 0.90527, 0.7306, 0.76659, 0.79004, 0.76659, 0.79004, 0.76659, 0.79004, 1.09231, 0.54873, 0.8675, 0.86128, 0.76318, 0.8693, 0.85311, 0.86651, 1, 1, 0.79776, 1.20562, 1.18622, 1.18622, 1, 1.1437, 0.67742, 0.96334, 0.93695, 1.35191, 1.40909, 0.95161, 1.48387, 0.86686, 0.90861, 0.62267, 0.74359, 0.65649, 0.85498, 0.56963, 0.88254, 1.23516, 0.8675, 0.81552, 0.75443, 0.84503, 0.73206, 0.76659, 0.86275, 0.85122, 0.90685, 0.77892, 0.85746, 1.02638, 0.89385, 0.75657, 0.85122, 0.86275, 0.77452, 0.74171, 0.79776, 0.7306, 0.95165, 0.77818, 0.89772, 0.88831, 0.90685, 0.7306, 0.98142, 1.02191, 0.96576, 1.23516, 0.99018, 0.98142, 0.9236, 0.89258, 0.94035, 1.02191, 0.78848, 0.96576, 0.9561, 1.23516, 0.90918, 0.92578, 0.95424, 0.89746, 0.83969, 0.9482, 0.80113, 0.89442, 0.85208, 0.86155, 0.98022, 0.99018, 1.00452, 0.81209, 0.99247, 0.89181, 1.23516, 0.99018, 0.9482, 0.99018, 0.89181, 0.73206, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.88844, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89464, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96766, 1, 1, 1, 1, 1, 1, 0.94258, 0.98986, 0.94258, 0.98986, 0.94258, 0.98986, 0.7306, 0.90527, 1, 1, 0.89552, 0.90527, 1, 0.90186, 1.12308, 1.12308, 1.12308, 1.12308, 1.2566, 1.2566, 1.2566, 0.89552, 0.89552, 1.42259, 0.69043, 1.03809, 1, 1, 1.0176, 1.0176, 1.11523, 1.4956, 2.01462, 0.99331, 0.82616, 0.91133, 0.84286, 0.91133, 1, 1, 1, 0.70508, 1, 1.23108, 0.79801, 0.84426, 0.84426, 0.774, 0.90527, 1.81055, 0.90527, 1.81055, 1.28809, 1.55469, 0.94434, 1.07806, 1, 0.97094, 0.7589, 0.85284, 0.90747, 1.19658, 0.69825, 0.97622, 1.33512, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.0336, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05859, 1.05859, 1, 1, 1, 1.07185, 0.99413, 0.96334, 1.08065, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const CalibriRegularMetrics = { - lineHeight: 1.2207, - lineGap: 0.2207 -}; - -;// ./src/core/helvetica_factors.js -const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const HelveticaBoldMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; -const HelveticaBoldItalicFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.0044, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99971, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.01011, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99977, 1, 1, 1.00026, 0.99969, 0.99972, 0.99981, 0.9998, 1.0006, 0.99977, 0.99977, 1.00022, 0.91155, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 0.99966, 1.00022, 1.00032, 1.00001, 0.99944, 1.00026, 1.00001, 0.99968, 1.00001, 1.00047, 1, 1.0006, 1.00001, 0.99981, 1.00101, 1.00026, 1.0006, 0.99948, 0.99981, 1.00064, 0.99973, 0.99942, 1.00101, 1.00061, 1.00026, 1.00069, 1.0006, 1.00014, 0.99973, 1.01322, 0.99973, 1.00065, 1.00026, 1.00012, 0.99923, 1, 1.00064, 1.00076, 0.99948, 1.00055, 1.00063, 1.00007, 0.99943, 1.0006, 0.99948, 1.00026, 0.99948, 0.99943, 1.00001, 1.00001, 1.00029, 1.00038, 1.00035, 1.00001, 1.0006, 1.0006, 0.99973, 0.99978, 1.00001, 1.00057, 0.99989, 0.99967, 0.99964, 0.99967, 0.99977, 0.99999, 0.99977, 1.00038, 0.99977, 1.00001, 0.99973, 1.00066, 0.99967, 0.99967, 1.00041, 0.99998, 0.99999, 0.99977, 1.00022, 0.99967, 1.00001, 0.99977, 1.00026, 0.99964, 1.00031, 1.00001, 0.99999, 0.99999, 1, 1.00023, 1, 1, 0.99999, 1.00035, 1.00001, 0.99999, 0.99973, 0.99977, 0.99999, 1.00058, 0.99973, 0.99973, 0.99955, 0.9995, 1.00026, 1.00026, 1.00032, 0.99989, 1.00034, 0.99999, 1.00026, 1.00026, 1.00026, 0.99973, 0.45998, 0.99973, 1.00026, 0.99973, 1.00001, 0.99999, 0.99982, 0.99994, 0.99996, 1, 1.00042, 1.00044, 1.00029, 1.00023, 0.99973, 0.99973, 1.00026, 0.99949, 1.00002, 0.99973, 1.0006, 1.0006, 1.0006, 0.99975, 1.00026, 1.00026, 1.00032, 0.98685, 0.99973, 1.00026, 1, 1, 0.99966, 1.00044, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1, 0.99973, 0.99971, 0.99978, 1, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00098, 1, 1, 1, 1.00049, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const HelveticaBoldItalicMetrics = { - lineHeight: 1.35, - lineGap: 0.2 -}; -const HelveticaItalicFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.0288, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 0.99946, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.06311, 0.99973, 1.00024, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00041, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.89547, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00001, 1, 1.00054, 0.99977, 1.00084, 1.00007, 0.99973, 1.00013, 0.99924, 1.00001, 1.00001, 0.99945, 0.91221, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00001, 0.99999, 0.99977, 0.99933, 1.00022, 1.00054, 1.00001, 1.00065, 1.00026, 1.00001, 1.0001, 1.00001, 1.00052, 1, 1.0006, 1.00001, 0.99945, 0.99897, 0.99968, 0.99924, 1.00036, 0.99945, 0.99949, 1, 1.0006, 0.99897, 0.99918, 0.99968, 0.99911, 0.99924, 1, 0.99962, 1.01487, 1, 1.0005, 0.99973, 1.00012, 1.00043, 1, 0.99995, 0.99994, 1.00036, 0.99947, 1.00019, 1.00063, 1.00025, 0.99924, 1.00036, 0.99973, 1.00036, 1.00025, 1.00001, 1.00001, 1.00027, 1.0001, 1.00068, 1.00001, 1.0006, 1.0006, 1, 1.00008, 0.99957, 0.99972, 0.9994, 0.99954, 0.99975, 1.00051, 1.00001, 1.00019, 1.00001, 1.0001, 0.99986, 1.00001, 1.00001, 1.00038, 0.99954, 0.99954, 0.9994, 1.00066, 0.99999, 0.99977, 1.00022, 1.00054, 1.00001, 0.99977, 1.00026, 0.99975, 1.0001, 1.00001, 0.99993, 0.9995, 0.99955, 1.00016, 0.99978, 0.99974, 1.00019, 1.00022, 0.99955, 1.00053, 0.99973, 1.00089, 1.00005, 0.99967, 1.00048, 0.99973, 1.00002, 1.00034, 0.99973, 0.99973, 0.99964, 1.00006, 1.00066, 0.99947, 0.99973, 0.98894, 0.99973, 1, 0.44898, 1, 0.99946, 1, 1.00039, 1.00082, 0.99991, 0.99991, 0.99985, 1.00022, 1.00023, 1.00061, 1.00006, 0.99966, 0.99973, 0.99973, 0.99973, 1.00019, 1.0008, 1, 0.99924, 0.99924, 0.99924, 0.99983, 1.00044, 0.99973, 0.99964, 0.98332, 1, 0.99973, 1, 1, 0.99962, 0.99895, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 1.00423, 0.99925, 0.99999, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1.00049, 1, 1.00245, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 1.00003, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const HelveticaItalicMetrics = { - lineHeight: 1.35, - lineGap: 0.2 -}; -const HelveticaRegularFactors = [0.76116, 1, 1, 1.0006, 1.0006, 1.00006, 0.99973, 0.99973, 0.99982, 1.00001, 1.00043, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1, 1.00003, 1.00003, 1.00003, 0.99973, 0.99987, 1.00001, 1.00001, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 1, 1.00001, 0.99973, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 1.0006, 1.0006, 1.0006, 0.99949, 0.99973, 0.99998, 0.99973, 0.99973, 1, 0.99973, 0.99973, 1.0006, 0.99973, 0.99973, 0.99924, 0.99924, 1, 0.99924, 0.99999, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.0006, 0.99973, 1, 0.99977, 1, 1, 1, 1.00005, 1.0009, 1.00005, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.0009, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.9998, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1.00001, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 1, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.06409, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 1, 0.99973, 1, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1, 0.99977, 1.04596, 0.99977, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 0.99924, 1.0006, 1.0006, 1.00019, 1.00034, 1, 0.99924, 1.00001, 1, 1, 0.99973, 0.99924, 0.99973, 0.99924, 0.99973, 1.02572, 0.99973, 1.00005, 0.99973, 0.99924, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99999, 0.9998, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1.00022, 0.99973, 1, 1.00016, 0.99977, 0.99998, 0.99977, 0.99998, 0.99977, 0.99998, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00001, 1, 1.00026, 1.0006, 1.00026, 0.84533, 1.00026, 1.0006, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 1.00016, 0.99977, 1.00001, 1, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 0.99924, 0.99973, 1.00001, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 1, 1.00026, 1.0006, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99928, 1, 0.99977, 1.00013, 1.00055, 0.99947, 0.99945, 0.99941, 0.99924, 1.00001, 1.00001, 1.0004, 0.91621, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 1.00001, 1.00005, 0.99999, 0.99977, 1.00015, 1.00022, 0.99977, 1.00001, 0.99973, 1.00026, 1.00001, 1.00019, 1.00001, 0.99946, 1, 1.0006, 1.00001, 0.99978, 1.00045, 0.99973, 0.99924, 1.00023, 0.99978, 0.99966, 1, 1.00065, 1.00045, 1.00019, 0.99973, 0.99973, 0.99924, 1, 1, 0.96499, 1, 1.00055, 0.99973, 1.00008, 1.00027, 1, 0.9997, 0.99995, 1.00023, 0.99933, 1.00019, 1.00015, 1.00031, 0.99924, 1.00023, 0.99973, 1.00023, 1.00031, 1.00001, 0.99928, 1.00029, 1.00092, 1.00035, 1.00001, 1.0006, 1.0006, 1, 0.99988, 0.99975, 1, 1.00082, 0.99561, 0.9996, 1.00035, 1.00001, 0.99962, 1.00001, 1.00092, 0.99964, 1.00001, 0.99963, 0.99999, 1.00035, 1.00035, 1.00082, 0.99962, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.9996, 0.99967, 1.00001, 1.00034, 1.00074, 1.00054, 1.00053, 1.00063, 0.99971, 0.99962, 1.00035, 0.99975, 0.99977, 0.99973, 1.00043, 0.99953, 1.0007, 0.99915, 0.99973, 1.00008, 0.99892, 1.00073, 1.00073, 1.00114, 0.99915, 1.00073, 0.99955, 0.99973, 1.00092, 0.99973, 1, 0.99998, 1, 1.0003, 1, 1.00043, 1.00001, 0.99969, 1.0003, 1, 1.00035, 1.00001, 0.9995, 1, 1.00092, 0.99973, 0.99973, 0.99973, 1.0007, 0.9995, 1, 0.99924, 1.0006, 0.99924, 0.99972, 1.00062, 0.99973, 1.00114, 1.00073, 1, 0.99955, 1, 1, 1.00047, 0.99968, 1.00016, 0.99977, 1.00016, 0.99977, 1.00016, 0.99977, 1.00001, 1, 1, 1, 0.99973, 1, 1, 0.99955, 0.99924, 0.99924, 0.99924, 0.99924, 0.99998, 0.99998, 0.99998, 0.99973, 0.99973, 0.99972, 1, 1, 1.00267, 0.99999, 0.99998, 0.99998, 1, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 0.99925, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.96329, 1, 1.20985, 1.39713, 1.00003, 0.8254, 1.00015, 1, 1.00035, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.95317, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const HelveticaRegularMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; - -;// ./src/core/liberationsans_widths.js -const LiberationSansBoldWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; -const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; -const LiberationSansBoldItalicWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; -const LiberationSansBoldItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; -const LiberationSansItalicWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 625, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 733, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 281, 556, 400, 556, 222, 722, 556, 722, 556, 722, 556, 615, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 354, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 789, 846, 389, 794, 865, 775, 222, 667, 667, 570, 671, 667, 611, 722, 778, 278, 667, 667, 833, 722, 648, 778, 725, 667, 600, 611, 667, 837, 667, 831, 761, 278, 667, 570, 439, 555, 222, 550, 570, 571, 500, 556, 439, 463, 555, 542, 222, 500, 492, 548, 500, 447, 556, 670, 573, 486, 603, 374, 550, 652, 546, 728, 779, 222, 550, 556, 550, 779, 667, 667, 843, 544, 708, 667, 278, 278, 500, 1066, 982, 844, 589, 715, 639, 724, 667, 651, 667, 544, 704, 667, 917, 614, 715, 715, 589, 686, 833, 722, 778, 725, 667, 722, 611, 639, 795, 667, 727, 673, 920, 923, 805, 886, 651, 694, 1022, 682, 556, 562, 522, 493, 553, 556, 688, 465, 556, 556, 472, 564, 686, 550, 556, 556, 556, 500, 833, 500, 835, 500, 572, 518, 830, 851, 621, 736, 526, 492, 752, 534, 556, 556, 556, 378, 496, 500, 222, 222, 222, 910, 828, 556, 472, 565, 500, 556, 778, 556, 492, 339, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1083, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 998, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 584, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; -const LiberationSansItalicMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; -const LiberationSansRegularWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; -const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; - -;// ./src/core/myriadpro_factors.js -const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const MyriadProBoldMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; -const MyriadProBoldItalicFactors = [1.36898, 1, 1, 0.66227, 0.80779, 0.81625, 0.97276, 0.97276, 0.97733, 0.92222, 0.83266, 0.94292, 0.94292, 1.16148, 1.02058, 0.93582, 0.96694, 0.93582, 1.17337, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.97276, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.71541, 0.76813, 0.85576, 0.80591, 0.80729, 0.94299, 0.77512, 0.83655, 0.86523, 0.92222, 0.98621, 0.71743, 0.81698, 0.79726, 0.98558, 0.92222, 0.90637, 0.83809, 0.90637, 0.80729, 0.76463, 0.86275, 0.90699, 0.91605, 0.9154, 0.85308, 0.85458, 0.90531, 0.94292, 1.21296, 0.94292, 1.02058, 0.89903, 1.18616, 0.99613, 0.91677, 0.78216, 0.91677, 0.90083, 0.98796, 0.9135, 0.92168, 0.95381, 0.98981, 0.95298, 0.95381, 0.93459, 0.92168, 0.91513, 0.92004, 0.91677, 0.95077, 0.748, 1.04502, 0.91677, 0.92061, 0.94236, 0.89544, 0.89364, 0.9, 0.80687, 0.8578, 0.80687, 1.02058, 0.80779, 0.97276, 0.97276, 0.97276, 0.97276, 0.8578, 0.99973, 1.18616, 0.91339, 1.08074, 0.82891, 1.02058, 0.55509, 0.71526, 0.89022, 1.08595, 1, 1, 1.18616, 1, 0.96736, 0.93582, 1.18616, 1, 1.04864, 0.82711, 0.99043, 0.99043, 0.99043, 0.71541, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.85576, 0.845, 0.80729, 0.77512, 0.77512, 0.77512, 0.77512, 0.98621, 0.98621, 0.98621, 0.98621, 0.95961, 0.92222, 0.90637, 0.90637, 0.90637, 0.90637, 0.90637, 1.02058, 0.90251, 0.90699, 0.90699, 0.90699, 0.90699, 0.85458, 0.83659, 0.94951, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.99613, 0.85811, 0.78216, 0.90083, 0.90083, 0.90083, 0.90083, 0.95381, 0.95381, 0.95381, 0.95381, 0.9135, 0.92168, 0.91513, 0.91513, 0.91513, 0.91513, 0.91513, 1.08595, 0.91677, 0.91677, 0.91677, 0.91677, 0.91677, 0.89364, 0.92332, 0.89364, 0.85576, 0.99613, 0.85576, 0.99613, 0.85576, 0.99613, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.80729, 0.78216, 0.94299, 0.76783, 0.95961, 0.91677, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.77512, 0.90083, 0.86523, 0.9135, 0.86523, 0.9135, 0.86523, 0.9135, 1, 1, 0.92222, 0.92168, 0.92222, 0.92168, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.98621, 0.95381, 0.86036, 0.97096, 0.71743, 0.98981, 1, 1, 0.95298, 0.79726, 0.95381, 1, 1, 0.79726, 0.6894, 0.79726, 0.74321, 0.81691, 1.0006, 0.92222, 0.92168, 1, 1, 0.92222, 0.92168, 0.79464, 0.92098, 0.92168, 0.90637, 0.91513, 0.90637, 0.91513, 0.90637, 0.91513, 0.909, 0.87514, 0.80729, 0.95077, 1, 1, 0.80729, 0.95077, 0.76463, 0.748, 0.76463, 0.748, 1, 1, 0.76463, 0.748, 1, 1, 0.86275, 0.72651, 0.86275, 1.04502, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.90699, 0.91677, 0.9154, 0.94236, 0.85458, 0.89364, 0.85458, 0.90531, 0.9, 0.90531, 0.9, 0.90531, 0.9, 1, 0.97276, 0.85576, 0.99613, 0.845, 0.85811, 0.90251, 0.91677, 1, 1, 0.86275, 1.04502, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.18616, 1.00899, 1.30628, 0.85576, 0.80178, 0.66862, 0.7927, 0.69323, 0.88127, 0.72459, 0.89711, 0.95381, 0.85576, 0.80591, 0.7805, 0.94729, 0.77512, 0.90531, 0.92222, 0.90637, 0.98621, 0.81698, 0.92655, 0.98558, 0.92222, 0.85359, 0.90637, 0.90976, 0.83809, 0.94523, 0.86275, 0.83509, 0.93157, 0.85308, 0.83392, 0.92346, 0.98621, 0.83509, 0.92886, 0.91324, 0.92168, 0.95381, 0.90646, 0.92886, 0.90557, 0.86847, 0.90276, 0.91324, 0.86842, 0.92168, 0.99531, 0.95381, 0.9224, 0.85408, 0.92699, 0.86847, 1.0051, 0.91513, 0.80487, 0.93481, 1, 0.88159, 1.05214, 0.90646, 0.97355, 0.81539, 0.89398, 0.85923, 0.95381, 0.90646, 0.91513, 0.90646, 0.85923, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9154, 0.94236, 0.9154, 0.94236, 0.9154, 0.94236, 0.85458, 0.89364, 0.96694, 1, 0.89903, 1, 1, 1, 0.91782, 0.91782, 0.91782, 1, 0.896, 0.896, 0.896, 0.9332, 0.9332, 0.95973, 1, 1.26, 1, 1, 0.80479, 0.80178, 1, 1, 0.85633, 1, 1, 1, 1, 0.97276, 1, 1, 1, 0.698, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.14542, 1, 0.79199, 0.78694, 1.02058, 1.03493, 1.05486, 1, 1, 1.23026, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.20006, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const MyriadProBoldItalicMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; -const MyriadProItalicFactors = [1.36898, 1, 1, 0.65507, 0.84943, 0.85639, 0.88465, 0.88465, 0.86936, 0.88307, 0.86948, 0.85283, 0.85283, 1.06383, 1.02058, 0.75945, 0.9219, 0.75945, 1.17337, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.88465, 0.75945, 0.75945, 1.02058, 1.02058, 1.02058, 0.69046, 0.70926, 0.85158, 0.77812, 0.76852, 0.89591, 0.70466, 0.76125, 0.80094, 0.86822, 0.83864, 0.728, 0.77212, 0.79475, 0.93637, 0.87514, 0.8588, 0.76013, 0.8588, 0.72421, 0.69866, 0.77598, 0.85991, 0.80811, 0.87832, 0.78112, 0.77512, 0.8562, 1.0222, 1.18417, 1.0222, 1.27014, 0.89903, 1.15012, 0.93859, 0.94399, 0.846, 0.94399, 0.81453, 1.0186, 0.94219, 0.96017, 1.03075, 1.02175, 0.912, 1.03075, 0.96998, 0.96017, 0.93859, 0.94399, 0.94399, 0.95493, 0.746, 1.12658, 0.94578, 0.91, 0.979, 0.882, 0.882, 0.83, 0.85034, 0.83537, 0.85034, 1.02058, 0.70869, 0.88465, 0.88465, 0.88465, 0.88465, 0.83537, 0.90083, 1.15012, 0.9161, 0.94565, 0.73541, 1.02058, 0.53609, 0.69353, 0.79519, 1.08595, 1, 1, 1.15012, 1, 0.91974, 0.75945, 1.15012, 1, 0.9446, 0.73361, 0.9005, 0.9005, 0.9005, 0.62864, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.85158, 0.773, 0.76852, 0.70466, 0.70466, 0.70466, 0.70466, 0.83864, 0.83864, 0.83864, 0.83864, 0.90561, 0.87514, 0.8588, 0.8588, 0.8588, 0.8588, 0.8588, 1.02058, 0.85751, 0.85991, 0.85991, 0.85991, 0.85991, 0.77512, 0.76013, 0.88075, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 0.8075, 0.846, 0.81453, 0.81453, 0.81453, 0.81453, 0.82424, 0.82424, 0.82424, 0.82424, 0.9278, 0.96017, 0.93859, 0.93859, 0.93859, 0.93859, 0.93859, 1.08595, 0.8562, 0.94578, 0.94578, 0.94578, 0.94578, 0.882, 0.94578, 0.882, 0.85158, 0.93859, 0.85158, 0.93859, 0.85158, 0.93859, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.76852, 0.846, 0.89591, 0.8544, 0.90561, 0.94399, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.70466, 0.81453, 0.80094, 0.94219, 0.80094, 0.94219, 0.80094, 0.94219, 1, 1, 0.86822, 0.96017, 0.86822, 0.96017, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 0.82424, 0.83864, 1.03075, 0.83864, 0.82424, 0.81402, 1.02738, 0.728, 1.02175, 1, 1, 0.912, 0.79475, 1.03075, 1, 1, 0.79475, 0.83911, 0.79475, 0.66266, 0.80553, 1.06676, 0.87514, 0.96017, 1, 1, 0.87514, 0.96017, 0.86865, 0.87396, 0.96017, 0.8588, 0.93859, 0.8588, 0.93859, 0.8588, 0.93859, 0.867, 0.84759, 0.72421, 0.95493, 1, 1, 0.72421, 0.95493, 0.69866, 0.746, 0.69866, 0.746, 1, 1, 0.69866, 0.746, 1, 1, 0.77598, 0.88417, 0.77598, 1.12658, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.85991, 0.94578, 0.87832, 0.979, 0.77512, 0.882, 0.77512, 0.8562, 0.83, 0.8562, 0.83, 0.8562, 0.83, 1, 0.88465, 0.85158, 0.93859, 0.773, 0.8075, 0.85751, 0.8562, 1, 1, 0.77598, 1.12658, 1.15012, 1.15012, 1.15012, 1.15012, 1.15012, 1.15313, 1.15012, 1.15012, 1.15012, 1.08106, 1.03901, 0.85158, 0.77025, 0.62264, 0.7646, 0.65351, 0.86026, 0.69461, 0.89947, 1.03075, 0.85158, 0.77812, 0.76449, 0.88836, 0.70466, 0.8562, 0.86822, 0.8588, 0.83864, 0.77212, 0.85308, 0.93637, 0.87514, 0.82352, 0.8588, 0.85701, 0.76013, 0.89058, 0.77598, 0.8156, 0.82565, 0.78112, 0.77899, 0.89386, 0.83864, 0.8156, 0.9486, 0.92388, 0.96186, 1.03075, 0.91123, 0.9486, 0.93298, 0.878, 0.93942, 0.92388, 0.84596, 0.96186, 0.95119, 1.03075, 0.922, 0.88787, 0.95829, 0.88, 0.93559, 0.93859, 0.78815, 0.93758, 1, 0.89217, 1.03737, 0.91123, 0.93969, 0.77487, 0.85769, 0.86799, 1.03075, 0.91123, 0.93859, 0.91123, 0.86799, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87832, 0.979, 0.87832, 0.979, 0.87832, 0.979, 0.77512, 0.882, 0.9219, 1, 0.89903, 1, 1, 1, 0.87321, 0.87321, 0.87321, 1, 1.027, 1.027, 1.027, 0.86847, 0.86847, 0.79121, 1, 1.124, 1, 1, 0.73572, 0.73572, 1, 1, 0.85034, 1, 1, 1, 1, 0.88465, 1, 1, 1, 0.669, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04828, 1, 0.74948, 0.75187, 1.02058, 0.98391, 1.02119, 1, 1, 1.06233, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05233, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const MyriadProItalicMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; -const MyriadProRegularFactors = [1.36898, 1, 1, 0.76305, 0.82784, 0.94935, 0.89364, 0.92241, 0.89073, 0.90706, 0.98472, 0.85283, 0.85283, 1.0664, 1.02058, 0.74505, 0.9219, 0.74505, 1.23456, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.92241, 0.74505, 0.74505, 1.02058, 1.02058, 1.02058, 0.73002, 0.72601, 0.91755, 0.8126, 0.80314, 0.92222, 0.73764, 0.79726, 0.83051, 0.90284, 0.86023, 0.74, 0.8126, 0.84869, 0.96518, 0.91115, 0.8858, 0.79761, 0.8858, 0.74498, 0.73914, 0.81363, 0.89591, 0.83659, 0.89633, 0.85608, 0.8111, 0.90531, 1.0222, 1.22736, 1.0222, 1.27014, 0.89903, 0.90088, 0.86667, 1.0231, 0.896, 1.01411, 0.90083, 1.05099, 1.00512, 0.99793, 1.05326, 1.09377, 0.938, 1.06226, 1.00119, 0.99793, 0.98714, 1.0231, 1.01231, 0.98196, 0.792, 1.19137, 0.99074, 0.962, 1.01915, 0.926, 0.942, 0.856, 0.85034, 0.92006, 0.85034, 1.02058, 0.69067, 0.92241, 0.92241, 0.92241, 0.92241, 0.92006, 0.9332, 0.90088, 0.91882, 0.93484, 0.75339, 1.02058, 0.56866, 0.54324, 0.79519, 1.08595, 1, 1, 0.90088, 1, 0.95325, 0.74505, 0.90088, 1, 0.97198, 0.75339, 0.91009, 0.91009, 0.91009, 0.66466, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.91755, 0.788, 0.80314, 0.73764, 0.73764, 0.73764, 0.73764, 0.86023, 0.86023, 0.86023, 0.86023, 0.92915, 0.91115, 0.8858, 0.8858, 0.8858, 0.8858, 0.8858, 1.02058, 0.8858, 0.89591, 0.89591, 0.89591, 0.89591, 0.8111, 0.79611, 0.89713, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86667, 0.86936, 0.896, 0.90083, 0.90083, 0.90083, 0.90083, 0.84224, 0.84224, 0.84224, 0.84224, 0.97276, 0.99793, 0.98714, 0.98714, 0.98714, 0.98714, 0.98714, 1.08595, 0.89876, 0.99074, 0.99074, 0.99074, 0.99074, 0.942, 1.0231, 0.942, 0.91755, 0.86667, 0.91755, 0.86667, 0.91755, 0.86667, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.80314, 0.896, 0.92222, 0.93372, 0.92915, 1.01411, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.73764, 0.90083, 0.83051, 1.00512, 0.83051, 1.00512, 0.83051, 1.00512, 1, 1, 0.90284, 0.99793, 0.90976, 0.99793, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 0.84224, 0.86023, 1.05326, 0.86023, 0.84224, 0.82873, 1.07469, 0.74, 1.09377, 1, 1, 0.938, 0.84869, 1.06226, 1, 1, 0.84869, 0.83704, 0.84869, 0.81441, 0.85588, 1.08927, 0.91115, 0.99793, 1, 1, 0.91115, 0.99793, 0.91887, 0.90991, 0.99793, 0.8858, 0.98714, 0.8858, 0.98714, 0.8858, 0.98714, 0.894, 0.91434, 0.74498, 0.98196, 1, 1, 0.74498, 0.98196, 0.73914, 0.792, 0.73914, 0.792, 1, 1, 0.73914, 0.792, 1, 1, 0.81363, 0.904, 0.81363, 1.19137, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89591, 0.99074, 0.89633, 1.01915, 0.8111, 0.942, 0.8111, 0.90531, 0.856, 0.90531, 0.856, 0.90531, 0.856, 1, 0.92241, 0.91755, 0.86667, 0.788, 0.86936, 0.8858, 0.89876, 1, 1, 0.81363, 1.19137, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90388, 1.03901, 0.92138, 0.78105, 0.7154, 0.86169, 0.80513, 0.94007, 0.82528, 0.98612, 1.06226, 0.91755, 0.8126, 0.81884, 0.92819, 0.73764, 0.90531, 0.90284, 0.8858, 0.86023, 0.8126, 0.91172, 0.96518, 0.91115, 0.83089, 0.8858, 0.87791, 0.79761, 0.89297, 0.81363, 0.88157, 0.89992, 0.85608, 0.81992, 0.94307, 0.86023, 0.88157, 0.95308, 0.98699, 0.99793, 1.06226, 0.95817, 0.95308, 0.97358, 0.928, 0.98088, 0.98699, 0.92761, 0.99793, 0.96017, 1.06226, 0.986, 0.944, 0.95978, 0.938, 0.96705, 0.98714, 0.80442, 0.98972, 1, 0.89762, 1.04552, 0.95817, 0.99007, 0.87064, 0.91879, 0.88888, 1.06226, 0.95817, 0.98714, 0.95817, 0.88888, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.89633, 1.01915, 0.89633, 1.01915, 0.89633, 1.01915, 0.8111, 0.942, 0.9219, 1, 0.89903, 1, 1, 1, 0.93173, 0.93173, 0.93173, 1, 1.06304, 1.06304, 1.06904, 0.89903, 0.89903, 0.80549, 1, 1.156, 1, 1, 0.76575, 0.76575, 1, 1, 0.72458, 1, 1, 1, 1, 0.92241, 1, 1, 1, 0.619, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.07257, 1, 0.74705, 0.71119, 1.02058, 1.024, 1.02119, 1, 1, 1.1536, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.05638, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const MyriadProRegularMetrics = { - lineHeight: 1.2, - lineGap: 0.2 -}; - -;// ./src/core/segoeui_factors.js -const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const SegoeuiBoldMetrics = { - lineHeight: 1.33008, - lineGap: 0 -}; -const SegoeuiBoldItalicFactors = [1.76738, 1, 1, 0.98946, 1.03959, 1.04016, 1.02809, 1.036, 0.97639, 1.10953, 1.23203, 1.11144, 1.11144, 1.16939, 1.21237, 0.9754, 1.21261, 0.9754, 1.59754, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 1.036, 0.81378, 0.81378, 1.21237, 1.21237, 1.21237, 0.73541, 0.97847, 0.97363, 0.89723, 0.87897, 1.0426, 0.79429, 0.85292, 0.91149, 1.05815, 1.1406, 0.79631, 0.90128, 0.83853, 1.04396, 1.10615, 0.97552, 0.94436, 0.97552, 0.88641, 0.80527, 0.96083, 1.00135, 1, 1.06777, 0.9817, 0.91142, 0.99361, 1.11144, 1.57293, 1.11144, 1.21237, 0.74627, 1.31818, 1.06585, 0.97042, 0.83055, 0.97042, 0.93503, 1.1261, 0.97042, 0.97922, 1.14236, 0.94552, 1.01054, 1.14236, 1.02471, 0.97922, 0.94165, 0.97042, 0.97042, 1.0276, 0.78929, 1.1261, 0.97922, 0.95874, 1.02197, 0.98507, 0.96752, 0.97168, 0.95107, 1.16579, 0.95107, 1.21237, 1.03959, 1.036, 1.036, 1, 1.036, 1.16579, 0.87357, 1.31818, 1.18754, 1.26781, 1.05356, 1.21237, 1.18622, 0.79487, 0.94994, 1.29004, 1.24047, 1.24047, 1.31818, 1, 0.91484, 0.9754, 1.31818, 1.1349, 1.24866, 1.05356, 1.13934, 1.15574, 1.17389, 0.73541, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.94385, 0.87897, 0.79429, 0.79429, 0.79429, 0.79429, 1.1406, 1.1406, 1.1406, 1.1406, 1.0426, 1.10615, 0.97552, 0.97552, 0.97552, 0.97552, 0.97552, 1.21237, 0.97552, 1.00135, 1.00135, 1.00135, 1.00135, 0.91142, 0.94436, 0.98721, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 1.06585, 0.96705, 0.83055, 0.93503, 0.93503, 0.93503, 0.93503, 1.14236, 1.14236, 1.14236, 1.14236, 0.93125, 0.97922, 0.94165, 0.94165, 0.94165, 0.94165, 0.94165, 1.29004, 0.94165, 0.97922, 0.97922, 0.97922, 0.97922, 0.96752, 0.97042, 0.96752, 0.97363, 1.06585, 0.97363, 1.06585, 0.97363, 1.06585, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 0.87897, 0.83055, 1.0426, 1.0033, 1.0426, 0.97042, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.79429, 0.93503, 0.91149, 0.97042, 0.91149, 0.97042, 0.91149, 0.97042, 1, 1, 1.05815, 0.97922, 1.05815, 0.97922, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 1.1406, 1.14236, 0.97441, 1.04302, 0.79631, 1.01582, 1, 1, 1.01054, 0.83853, 1.14236, 1, 1, 0.83853, 1.09125, 0.83853, 0.90418, 0.83853, 1.19508, 1.10615, 0.97922, 1, 1, 1.10615, 0.97922, 1.01034, 1.10466, 0.97922, 0.97552, 0.94165, 0.97552, 0.94165, 0.97552, 0.94165, 0.91602, 0.91981, 0.88641, 1.0276, 1, 1, 0.88641, 1.0276, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 0.80527, 0.78929, 1, 1, 0.96083, 1.05403, 0.95923, 1.16862, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.00135, 0.97922, 1.06777, 1.02197, 0.91142, 0.96752, 0.91142, 0.99361, 0.97168, 0.99361, 0.97168, 0.99361, 0.97168, 1.23199, 1.036, 0.97363, 1.06585, 0.94385, 0.96705, 0.97552, 0.94165, 1, 1, 0.96083, 1.1261, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 1.31818, 0.95161, 1.27126, 1.00811, 0.83284, 0.77702, 0.99137, 0.95253, 1.0347, 0.86142, 1.07205, 1.14236, 0.97363, 0.89723, 0.86869, 1.09818, 0.79429, 0.99361, 1.05815, 0.97552, 1.1406, 0.90128, 1.06662, 1.04396, 1.10615, 0.84918, 0.97552, 1.04694, 0.94436, 0.98015, 0.96083, 0.91142, 1.00356, 0.9817, 1.01945, 0.98999, 1.1406, 0.91142, 1.04961, 0.9898, 1.00639, 1.14236, 1.07514, 1.04961, 0.99607, 1.02897, 1.008, 0.9898, 0.95134, 1.00639, 1.11121, 1.14236, 1.00518, 0.97981, 1.02186, 1, 1.08578, 0.94165, 0.99314, 0.98387, 0.93028, 0.93377, 1.35125, 1.07514, 1.10687, 0.93491, 1.04232, 1.00351, 1.14236, 1.07514, 0.94165, 1.07514, 1.00351, 0.79429, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09097, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.93503, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.96609, 1, 1, 1, 1, 1, 1, 1.06777, 1.02197, 1.06777, 1.02197, 1.06777, 1.02197, 0.91142, 0.96752, 1, 1.21261, 0.89903, 1, 1, 0.75155, 1.04745, 1.04745, 1.04745, 1.04394, 0.98633, 0.98633, 0.98633, 0.72959, 0.72959, 1.20502, 0.91406, 1.26514, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.09125, 0.93327, 1.03336, 1.16541, 1.036, 1, 1, 1, 0.771, 1, 1, 1.15574, 1.15574, 1.15574, 1.15574, 0.86364, 0.94434, 0.86279, 0.94434, 0.86224, 1, 1, 1.16798, 1, 0.96085, 0.90068, 1.21237, 1.18416, 1.13904, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21339, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18775, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.13269, 1.13269, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const SegoeuiBoldItalicMetrics = { - lineHeight: 1.33008, - lineGap: 0 -}; -const SegoeuiItalicFactors = [1.76738, 1, 1, 0.98946, 1.14763, 1.05365, 1.06234, 0.96927, 0.92586, 1.15373, 1.18414, 0.91349, 0.91349, 1.07403, 1.17308, 0.78383, 1.20088, 0.78383, 1.42531, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78383, 0.78383, 1.17308, 1.17308, 1.17308, 0.77349, 0.94565, 0.94729, 0.85944, 0.88506, 0.9858, 0.74817, 0.80016, 0.88449, 0.98039, 0.95782, 0.69238, 0.89898, 0.83231, 0.98183, 1.03989, 0.96924, 0.86237, 0.96924, 0.80595, 0.74524, 0.86091, 0.95402, 0.94143, 0.98448, 0.8858, 0.83089, 0.93285, 1.0949, 1.39016, 1.0949, 1.45994, 0.74627, 1.04839, 0.97454, 0.97454, 0.87207, 0.97454, 0.87533, 1.06151, 0.97454, 1.00176, 1.16484, 1.08132, 0.98047, 1.16484, 1.02989, 1.01054, 0.96225, 0.97454, 0.97454, 1.06598, 0.79004, 1.16344, 1.00351, 0.94629, 0.9973, 0.91016, 0.96777, 0.9043, 0.91082, 0.92481, 0.91082, 1.17308, 0.95748, 0.96927, 0.96927, 1, 0.96927, 0.92481, 0.80597, 1.04839, 1.23393, 1.1781, 0.9245, 1.17308, 1.20808, 0.63218, 0.94261, 1.24822, 1.09971, 1.09971, 1.04839, 1, 0.85273, 0.78032, 1.04839, 1.09971, 1.22326, 0.9245, 1.09836, 1.13525, 1.15222, 0.70424, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.94729, 0.85498, 0.88506, 0.74817, 0.74817, 0.74817, 0.74817, 0.95782, 0.95782, 0.95782, 0.95782, 0.9858, 1.03989, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.17308, 0.96924, 0.95402, 0.95402, 0.95402, 0.95402, 0.83089, 0.86237, 0.88409, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.97454, 0.92916, 0.87207, 0.87533, 0.87533, 0.87533, 0.87533, 0.93146, 0.93146, 0.93146, 0.93146, 0.93854, 1.01054, 0.96225, 0.96225, 0.96225, 0.96225, 0.96225, 1.24822, 0.8761, 1.00351, 1.00351, 1.00351, 1.00351, 0.96777, 0.97454, 0.96777, 0.94729, 0.97454, 0.94729, 0.97454, 0.94729, 0.97454, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.88506, 0.87207, 0.9858, 0.95391, 0.9858, 0.97454, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.74817, 0.87533, 0.88449, 0.97454, 0.88449, 0.97454, 0.88449, 0.97454, 1, 1, 0.98039, 1.00176, 0.98039, 1.00176, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 0.93146, 0.95782, 1.16484, 0.95782, 0.93146, 0.84421, 1.12761, 0.69238, 1.08132, 1, 1, 0.98047, 0.83231, 1.16484, 1, 1, 0.84723, 1.04861, 0.84723, 0.78755, 0.83231, 1.23736, 1.03989, 1.01054, 1, 1, 1.03989, 1.01054, 0.9857, 1.03849, 1.01054, 0.96924, 0.96225, 0.96924, 0.96225, 0.96924, 0.96225, 0.92383, 0.90171, 0.80595, 1.06598, 1, 1, 0.80595, 1.06598, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 0.74524, 0.79004, 1, 1, 0.86091, 1.02759, 0.85771, 1.16344, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.95402, 1.00351, 0.98448, 0.9973, 0.83089, 0.96777, 0.83089, 0.93285, 0.9043, 0.93285, 0.9043, 0.93285, 0.9043, 1.31868, 0.96927, 0.94729, 0.97454, 0.85498, 0.92916, 0.96924, 0.8761, 1, 1, 0.86091, 1.16344, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 1.04839, 0.81965, 0.81965, 0.94729, 0.78032, 0.71022, 0.90883, 0.84171, 0.99877, 0.77596, 1.05734, 1.2, 0.94729, 0.85944, 0.82791, 0.9607, 0.74817, 0.93285, 0.98039, 0.96924, 0.95782, 0.89898, 0.98316, 0.98183, 1.03989, 0.78614, 0.96924, 0.97642, 0.86237, 0.86075, 0.86091, 0.83089, 0.90082, 0.8858, 0.97296, 1.01284, 0.95782, 0.83089, 1.0976, 1.04, 1.03342, 1.2, 1.0675, 1.0976, 0.98205, 1.03809, 1.05097, 1.04, 0.95364, 1.03342, 1.05401, 1.2, 1.02148, 1.0119, 1.04724, 1.0127, 1.02732, 0.96225, 0.8965, 0.97783, 0.93574, 0.94818, 1.30679, 1.0675, 1.11826, 0.99821, 1.0557, 1.0326, 1.2, 1.0675, 0.96225, 1.0675, 1.0326, 0.74817, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03754, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87533, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.98705, 1, 1, 1, 1, 1, 1, 0.98448, 0.9973, 0.98448, 0.9973, 0.98448, 0.9973, 0.83089, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 0.94945, 0.94945, 0.94945, 0.94945, 1.12317, 1.12317, 1.12317, 0.67603, 0.67603, 1.15621, 0.73584, 1.21191, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87709, 0.96927, 1.01473, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.09836, 1.09836, 1.09836, 1.01522, 0.86321, 0.94434, 0.8649, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86438, 1.17308, 1.18416, 1.14589, 0.69825, 0.97622, 1.96791, 1.24822, 1.24822, 1.17308, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.17984, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10742, 1.10742, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const SegoeuiItalicMetrics = { - lineHeight: 1.33008, - lineGap: 0 -}; -const SegoeuiRegularFactors = [1.76738, 1, 1, 0.98594, 1.02285, 1.10454, 1.06234, 0.96927, 0.92037, 1.19985, 1.2046, 0.90616, 0.90616, 1.07152, 1.1714, 0.78032, 1.20088, 0.78032, 1.40246, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.96927, 0.78032, 0.78032, 1.1714, 1.1714, 1.1714, 0.80597, 0.94084, 0.96706, 0.85944, 0.85734, 0.97093, 0.75842, 0.79936, 0.88198, 0.9831, 0.95782, 0.71387, 0.86969, 0.84636, 1.07796, 1.03584, 0.96924, 0.83968, 0.96924, 0.82826, 0.79649, 0.85771, 0.95132, 0.93119, 0.98965, 0.88433, 0.8287, 0.93365, 1.08612, 1.3638, 1.08612, 1.45786, 0.74627, 0.80499, 0.91484, 1.05707, 0.92383, 1.05882, 0.9403, 1.12654, 1.05882, 1.01756, 1.09011, 1.09011, 0.99414, 1.09011, 1.034, 1.01756, 1.05356, 1.05707, 1.05882, 1.04399, 0.84863, 1.21968, 1.01756, 0.95801, 1.00068, 0.91797, 0.96777, 0.9043, 0.90351, 0.92105, 0.90351, 1.1714, 0.85337, 0.96927, 0.96927, 0.99912, 0.96927, 0.92105, 0.80597, 1.2434, 1.20808, 1.05937, 0.90957, 1.1714, 1.20808, 0.75155, 0.94261, 1.24644, 1.09971, 1.09971, 0.84751, 1, 0.85273, 0.78032, 0.61584, 1.05425, 1.17914, 0.90957, 1.08665, 1.11593, 1.14169, 0.73381, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.96706, 0.86035, 0.85734, 0.75842, 0.75842, 0.75842, 0.75842, 0.95782, 0.95782, 0.95782, 0.95782, 0.97093, 1.03584, 0.96924, 0.96924, 0.96924, 0.96924, 0.96924, 1.1714, 0.96924, 0.95132, 0.95132, 0.95132, 0.95132, 0.8287, 0.83968, 0.89049, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.91484, 0.93575, 0.92383, 0.9403, 0.9403, 0.9403, 0.9403, 0.8717, 0.8717, 0.8717, 0.8717, 1.00527, 1.01756, 1.05356, 1.05356, 1.05356, 1.05356, 1.05356, 1.24644, 0.95923, 1.01756, 1.01756, 1.01756, 1.01756, 0.96777, 1.05707, 0.96777, 0.96706, 0.91484, 0.96706, 0.91484, 0.96706, 0.91484, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.85734, 0.92383, 0.97093, 1.0969, 0.97093, 1.05882, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.75842, 0.9403, 0.88198, 1.05882, 0.88198, 1.05882, 0.88198, 1.05882, 1, 1, 0.9831, 1.01756, 0.9831, 1.01756, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 0.8717, 0.95782, 1.09011, 0.95782, 0.8717, 0.84784, 1.11551, 0.71387, 1.09011, 1, 1, 0.99414, 0.84636, 1.09011, 1, 1, 0.84636, 1.0536, 0.84636, 0.94298, 0.84636, 1.23297, 1.03584, 1.01756, 1, 1, 1.03584, 1.01756, 1.00323, 1.03444, 1.01756, 0.96924, 1.05356, 0.96924, 1.05356, 0.96924, 1.05356, 0.93066, 0.98293, 0.82826, 1.04399, 1, 1, 0.82826, 1.04399, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 0.79649, 0.84863, 1, 1, 0.85771, 1.17318, 0.85771, 1.21968, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.95132, 1.01756, 0.98965, 1.00068, 0.8287, 0.96777, 0.8287, 0.93365, 0.9043, 0.93365, 0.9043, 0.93365, 0.9043, 1.08571, 0.96927, 0.96706, 0.91484, 0.86035, 0.93575, 0.96924, 0.95923, 1, 1, 0.85771, 1.21968, 1.11437, 1.11437, 0.93109, 0.91202, 0.60411, 0.84164, 0.55572, 1.01173, 0.97361, 0.81818, 0.81818, 0.96635, 0.78032, 0.72727, 0.92366, 0.98601, 1.03405, 0.77968, 1.09799, 1.2, 0.96706, 0.85944, 0.85638, 0.96491, 0.75842, 0.93365, 0.9831, 0.96924, 0.95782, 0.86969, 0.94152, 1.07796, 1.03584, 0.78437, 0.96924, 0.98715, 0.83968, 0.83491, 0.85771, 0.8287, 0.94492, 0.88433, 0.9287, 1.0098, 0.95782, 0.8287, 1.0625, 0.98248, 1.03424, 1.2, 1.01071, 1.0625, 0.95246, 1.03809, 1.04912, 0.98248, 1.00221, 1.03424, 1.05443, 1.2, 1.04785, 0.99609, 1.00169, 1.05176, 0.99346, 1.05356, 0.9087, 1.03004, 0.95542, 0.93117, 1.23362, 1.01071, 1.07831, 1.02512, 1.05205, 1.03502, 1.2, 1.01071, 1.05356, 1.01071, 1.03502, 0.75842, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.03719, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.9403, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.04021, 1, 1, 1, 1, 1, 1, 0.98965, 1.00068, 0.98965, 1.00068, 0.98965, 1.00068, 0.8287, 0.96777, 1, 1.20088, 0.89903, 1, 1, 0.75155, 1.03077, 1.03077, 1.03077, 1.03077, 1.13196, 1.13196, 1.13196, 0.67428, 0.67428, 1.16039, 0.73291, 1.20996, 1.22135, 1.06483, 0.94868, 0.94868, 0.95996, 1.24633, 1, 1.07497, 0.87796, 0.96927, 1.01518, 0.96927, 1, 1, 1, 0.77295, 1, 1, 1.10539, 1.10539, 1.11358, 1.06967, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.083, 1, 0.91578, 0.86507, 1.1714, 1.18416, 1.14589, 0.69825, 0.97622, 1.9697, 1.24822, 1.24822, 1.17238, 1.24822, 1.24822, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18083, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.10938, 1.10938, 1, 1, 1, 1.05425, 1.09971, 1.09971, 1.09971, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; -const SegoeuiRegularMetrics = { - lineHeight: 1.33008, - lineGap: 0 -}; - -;// ./src/core/xfa_fonts.js - - - - - - - - -const getXFAFontMap = getLookupTableFactory(function (t) { - t["MyriadPro-Regular"] = t["PdfJS-Fallback-Regular"] = { - name: "LiberationSans-Regular", - factors: MyriadProRegularFactors, - baseWidths: LiberationSansRegularWidths, - baseMapping: LiberationSansRegularMapping, - metrics: MyriadProRegularMetrics - }; - t["MyriadPro-Bold"] = t["PdfJS-Fallback-Bold"] = { - name: "LiberationSans-Bold", - factors: MyriadProBoldFactors, - baseWidths: LiberationSansBoldWidths, - baseMapping: LiberationSansBoldMapping, - metrics: MyriadProBoldMetrics - }; - t["MyriadPro-It"] = t["MyriadPro-Italic"] = t["PdfJS-Fallback-Italic"] = { - name: "LiberationSans-Italic", - factors: MyriadProItalicFactors, - baseWidths: LiberationSansItalicWidths, - baseMapping: LiberationSansItalicMapping, - metrics: MyriadProItalicMetrics - }; - t["MyriadPro-BoldIt"] = t["MyriadPro-BoldItalic"] = t["PdfJS-Fallback-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: MyriadProBoldItalicFactors, - baseWidths: LiberationSansBoldItalicWidths, - baseMapping: LiberationSansBoldItalicMapping, - metrics: MyriadProBoldItalicMetrics - }; - t.ArialMT = t.Arial = t["Arial-Regular"] = { - name: "LiberationSans-Regular", - baseWidths: LiberationSansRegularWidths, - baseMapping: LiberationSansRegularMapping - }; - t["Arial-BoldMT"] = t["Arial-Bold"] = { - name: "LiberationSans-Bold", - baseWidths: LiberationSansBoldWidths, - baseMapping: LiberationSansBoldMapping - }; - t["Arial-ItalicMT"] = t["Arial-Italic"] = { - name: "LiberationSans-Italic", - baseWidths: LiberationSansItalicWidths, - baseMapping: LiberationSansItalicMapping - }; - t["Arial-BoldItalicMT"] = t["Arial-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - baseWidths: LiberationSansBoldItalicWidths, - baseMapping: LiberationSansBoldItalicMapping - }; - t["Calibri-Regular"] = { - name: "LiberationSans-Regular", - factors: CalibriRegularFactors, - baseWidths: LiberationSansRegularWidths, - baseMapping: LiberationSansRegularMapping, - metrics: CalibriRegularMetrics - }; - t["Calibri-Bold"] = { - name: "LiberationSans-Bold", - factors: CalibriBoldFactors, - baseWidths: LiberationSansBoldWidths, - baseMapping: LiberationSansBoldMapping, - metrics: CalibriBoldMetrics - }; - t["Calibri-Italic"] = { - name: "LiberationSans-Italic", - factors: CalibriItalicFactors, - baseWidths: LiberationSansItalicWidths, - baseMapping: LiberationSansItalicMapping, - metrics: CalibriItalicMetrics - }; - t["Calibri-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: CalibriBoldItalicFactors, - baseWidths: LiberationSansBoldItalicWidths, - baseMapping: LiberationSansBoldItalicMapping, - metrics: CalibriBoldItalicMetrics - }; - t["Segoeui-Regular"] = { - name: "LiberationSans-Regular", - factors: SegoeuiRegularFactors, - baseWidths: LiberationSansRegularWidths, - baseMapping: LiberationSansRegularMapping, - metrics: SegoeuiRegularMetrics - }; - t["Segoeui-Bold"] = { - name: "LiberationSans-Bold", - factors: SegoeuiBoldFactors, - baseWidths: LiberationSansBoldWidths, - baseMapping: LiberationSansBoldMapping, - metrics: SegoeuiBoldMetrics - }; - t["Segoeui-Italic"] = { - name: "LiberationSans-Italic", - factors: SegoeuiItalicFactors, - baseWidths: LiberationSansItalicWidths, - baseMapping: LiberationSansItalicMapping, - metrics: SegoeuiItalicMetrics - }; - t["Segoeui-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: SegoeuiBoldItalicFactors, - baseWidths: LiberationSansBoldItalicWidths, - baseMapping: LiberationSansBoldItalicMapping, - metrics: SegoeuiBoldItalicMetrics - }; - t["Helvetica-Regular"] = t.Helvetica = { - name: "LiberationSans-Regular", - factors: HelveticaRegularFactors, - baseWidths: LiberationSansRegularWidths, - baseMapping: LiberationSansRegularMapping, - metrics: HelveticaRegularMetrics - }; - t["Helvetica-Bold"] = { - name: "LiberationSans-Bold", - factors: HelveticaBoldFactors, - baseWidths: LiberationSansBoldWidths, - baseMapping: LiberationSansBoldMapping, - metrics: HelveticaBoldMetrics - }; - t["Helvetica-Italic"] = { - name: "LiberationSans-Italic", - factors: HelveticaItalicFactors, - baseWidths: LiberationSansItalicWidths, - baseMapping: LiberationSansItalicMapping, - metrics: HelveticaItalicMetrics - }; - t["Helvetica-BoldItalic"] = { - name: "LiberationSans-BoldItalic", - factors: HelveticaBoldItalicFactors, - baseWidths: LiberationSansBoldItalicWidths, - baseMapping: LiberationSansBoldItalicMapping, - metrics: HelveticaBoldItalicMetrics - }; -}); -function getXfaFontName(name) { - const fontName = normalizeFontName(name); - const fontMap = getXFAFontMap(); - return fontMap[fontName]; -} -function getXfaFontWidths(name) { - const info = getXfaFontName(name); - if (!info) { - return null; - } - const { - baseWidths, - baseMapping, - factors - } = info; - const rescaledBaseWidths = !factors ? baseWidths : baseWidths.map((w, i) => w * factors[i]); - let currentCode = -2; - let currentArray; - const newWidths = []; - for (const [unicode, glyphIndex] of baseMapping.map((charUnicode, index) => [charUnicode, index]).sort(([unicode1], [unicode2]) => unicode1 - unicode2)) { - if (unicode === -1) { - continue; - } - if (unicode === currentCode + 1) { - currentArray.push(rescaledBaseWidths[glyphIndex]); - currentCode += 1; - } else { - currentCode = unicode; - currentArray = [rescaledBaseWidths[glyphIndex]]; - newWidths.push(unicode, currentArray); - } - } - return newWidths; -} -function getXfaFontDict(name) { - const widths = getXfaFontWidths(name); - const dict = new Dict(null); - dict.set("BaseFont", Name.get(name)); - dict.set("Type", Name.get("Font")); - dict.set("Subtype", Name.get("CIDFontType2")); - dict.set("Encoding", Name.get("Identity-H")); - dict.set("CIDToGIDMap", Name.get("Identity")); - dict.set("W", widths); - dict.set("FirstChar", widths[0]); - dict.set("LastChar", widths.at(-2) + widths.at(-1).length - 1); - const descriptor = new Dict(null); - dict.set("FontDescriptor", descriptor); - const systemInfo = new Dict(null); - systemInfo.set("Ordering", "Identity"); - systemInfo.set("Registry", "Adobe"); - systemInfo.set("Supplement", 0); - dict.set("CIDSystemInfo", systemInfo); - return dict; -} - -;// ./src/core/ps_parser.js - - - -class PostScriptParser { - constructor(lexer) { - this.lexer = lexer; - this.operators = []; - this.token = null; - this.prev = null; - } - nextToken() { - this.prev = this.token; - this.token = this.lexer.getToken(); - } - accept(type) { - if (this.token.type === type) { - this.nextToken(); - return true; - } - return false; - } - expect(type) { - if (this.accept(type)) { - return true; - } - throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); - } - parse() { - this.nextToken(); - this.expect(PostScriptTokenTypes.LBRACE); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - return this.operators; - } - parseBlock() { - while (true) { - if (this.accept(PostScriptTokenTypes.NUMBER)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - this.parseCondition(); - } else { - return; - } - } - } - parseCondition() { - const conditionLocation = this.operators.length; - this.operators.push(null, null); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - if (this.accept(PostScriptTokenTypes.IF)) { - this.operators[conditionLocation] = this.operators.length; - this.operators[conditionLocation + 1] = "jz"; - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - const jumpLocation = this.operators.length; - this.operators.push(null, null); - const endOfTrue = this.operators.length; - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - this.expect(PostScriptTokenTypes.IFELSE); - this.operators[jumpLocation] = this.operators.length; - this.operators[jumpLocation + 1] = "j"; - this.operators[conditionLocation] = endOfTrue; - this.operators[conditionLocation + 1] = "jz"; - } else { - throw new FormatError("PS Function: error parsing conditional."); - } - } -} -const PostScriptTokenTypes = { - LBRACE: 0, - RBRACE: 1, - NUMBER: 2, - OPERATOR: 3, - IF: 4, - IFELSE: 5 -}; -class PostScriptToken { - static get opCache() { - return shadow(this, "opCache", Object.create(null)); - } - constructor(type, value) { - this.type = type; - this.value = value; - } - static getOperator(op) { - return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); - } - static get LBRACE() { - return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); - } - static get RBRACE() { - return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); - } - static get IF() { - return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); - } - static get IFELSE() { - return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); - } -} -class PostScriptLexer { - constructor(stream) { - this.stream = stream; - this.nextChar(); - this.strBuf = []; - } - nextChar() { - return this.currentChar = this.stream.getByte(); - } - getToken() { - let comment = false; - let ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0a || ch === 0x0d) { - comment = false; - } - } else if (ch === 0x25) { - comment = true; - } else if (!isWhiteSpace(ch)) { - break; - } - ch = this.nextChar(); - } - switch (ch | 0) { - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x2b: - case 0x2d: - case 0x2e: - return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); - case 0x7b: - this.nextChar(); - return PostScriptToken.LBRACE; - case 0x7d: - this.nextChar(); - return PostScriptToken.RBRACE; - } - const strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { - strBuf.push(String.fromCharCode(ch)); - } - const str = strBuf.join(""); - switch (str.toLowerCase()) { - case "if": - return PostScriptToken.IF; - case "ifelse": - return PostScriptToken.IFELSE; - default: - return PostScriptToken.getOperator(str); - } - } - getNumber() { - let ch = this.currentChar; - const strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - while ((ch = this.nextChar()) >= 0) { - if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { - strBuf.push(String.fromCharCode(ch)); - } else { - break; - } - } - const value = parseFloat(strBuf.join("")); - if (isNaN(value)) { - throw new FormatError(`Invalid floating point number: ${value}`); - } - return value; - } -} - -;// ./src/core/image_utils.js - - -class BaseLocalCache { - constructor(options) { - this._onlyRefs = options?.onlyRefs === true; - if (!this._onlyRefs) { - this._nameRefMap = new Map(); - this._imageMap = new Map(); - } - this._imageCache = new RefSetCache(); - } - getByName(name) { - if (this._onlyRefs) { - unreachable("Should not call `getByName` method."); - } - const ref = this._nameRefMap.get(name); - if (ref) { - return this.getByRef(ref); - } - return this._imageMap.get(name) || null; - } - getByRef(ref) { - return this._imageCache.get(ref) || null; - } - set(name, ref, data) { - unreachable("Abstract method `set` called."); - } -} -class LocalImageCache extends BaseLocalCache { - set(name, ref = null, data) { - if (typeof name !== "string") { - throw new Error('LocalImageCache.set - expected "name" argument.'); - } - if (ref) { - if (this._imageCache.has(ref)) { - return; - } - this._nameRefMap.set(name, ref); - this._imageCache.put(ref, data); - return; - } - if (this._imageMap.has(name)) { - return; - } - this._imageMap.set(name, data); - } -} -class LocalColorSpaceCache extends BaseLocalCache { - set(name = null, ref = null, data) { - if (typeof name !== "string" && !ref) { - throw new Error('LocalColorSpaceCache.set - expected "name" and/or "ref" argument.'); - } - if (ref) { - if (this._imageCache.has(ref)) { - return; - } - if (name !== null) { - this._nameRefMap.set(name, ref); - } - this._imageCache.put(ref, data); - return; - } - if (this._imageMap.has(name)) { - return; - } - this._imageMap.set(name, data); - } -} -class LocalFunctionCache extends BaseLocalCache { - constructor(options) { - super({ - onlyRefs: true - }); - } - set(name = null, ref, data) { - if (!ref) { - throw new Error('LocalFunctionCache.set - expected "ref" argument.'); - } - if (this._imageCache.has(ref)) { - return; - } - this._imageCache.put(ref, data); - } -} -class LocalGStateCache extends BaseLocalCache { - set(name, ref = null, data) { - if (typeof name !== "string") { - throw new Error('LocalGStateCache.set - expected "name" argument.'); - } - if (ref) { - if (this._imageCache.has(ref)) { - return; - } - this._nameRefMap.set(name, ref); - this._imageCache.put(ref, data); - return; - } - if (this._imageMap.has(name)) { - return; - } - this._imageMap.set(name, data); - } -} -class LocalTilingPatternCache extends BaseLocalCache { - constructor(options) { - super({ - onlyRefs: true - }); - } - set(name = null, ref, data) { - if (!ref) { - throw new Error('LocalTilingPatternCache.set - expected "ref" argument.'); - } - if (this._imageCache.has(ref)) { - return; - } - this._imageCache.put(ref, data); - } -} -class RegionalImageCache extends BaseLocalCache { - constructor(options) { - super({ - onlyRefs: true - }); - } - set(name = null, ref, data) { - if (!ref) { - throw new Error('RegionalImageCache.set - expected "ref" argument.'); - } - if (this._imageCache.has(ref)) { - return; - } - this._imageCache.put(ref, data); - } -} -class GlobalColorSpaceCache extends BaseLocalCache { - constructor(options) { - super({ - onlyRefs: true - }); - } - set(name = null, ref, data) { - if (!ref) { - throw new Error('GlobalColorSpaceCache.set - expected "ref" argument.'); - } - if (this._imageCache.has(ref)) { - return; - } - this._imageCache.put(ref, data); - } - clear() { - this._imageCache.clear(); - } -} -class GlobalImageCache { - static NUM_PAGES_THRESHOLD = 2; - static MIN_IMAGES_TO_CACHE = 10; - static MAX_BYTE_SIZE = 5e7; - #decodeFailedSet = new RefSet(); - constructor() { - this._refCache = new RefSetCache(); - this._imageCache = new RefSetCache(); - } - get #byteSize() { - let byteSize = 0; - for (const imageData of this._imageCache) { - byteSize += imageData.byteSize; - } - return byteSize; - } - get #cacheLimitReached() { - if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { - return false; - } - if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { - return false; - } - return true; - } - shouldCache(ref, pageIndex) { - let pageIndexSet = this._refCache.get(ref); - if (!pageIndexSet) { - pageIndexSet = new Set(); - this._refCache.put(ref, pageIndexSet); - } - pageIndexSet.add(pageIndex); - if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { - return false; - } - if (!this._imageCache.has(ref) && this.#cacheLimitReached) { - return false; - } - return true; - } - addDecodeFailed(ref) { - this.#decodeFailedSet.put(ref); - } - hasDecodeFailed(ref) { - return this.#decodeFailedSet.has(ref); - } - addByteSize(ref, byteSize) { - const imageData = this._imageCache.get(ref); - if (!imageData) { - return; - } - if (imageData.byteSize) { - return; - } - imageData.byteSize = byteSize; - } - getData(ref, pageIndex) { - const pageIndexSet = this._refCache.get(ref); - if (!pageIndexSet) { - return null; - } - if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { - return null; - } - const imageData = this._imageCache.get(ref); - if (!imageData) { - return null; - } - pageIndexSet.add(pageIndex); - return imageData; - } - setData(ref, data) { - if (!this._refCache.has(ref)) { - throw new Error('GlobalImageCache.setData - expected "shouldCache" to have been called.'); - } - if (this._imageCache.has(ref)) { - return; - } - if (this.#cacheLimitReached) { - warn("GlobalImageCache.setData - cache limit reached."); - return; - } - this._imageCache.put(ref, data); - } - clear(onlyData = false) { - if (!onlyData) { - this.#decodeFailedSet.clear(); - this._refCache.clear(); - } - this._imageCache.clear(); - } -} - -;// ./src/core/function.js - - - - - - -class PDFFunctionFactory { - constructor({ - xref, - isEvalSupported = true - }) { - this.xref = xref; - this.isEvalSupported = isEvalSupported !== false; - } - create(fn, parseArray = false) { - let fnRef, parsedFn; - if (fn instanceof Ref) { - fnRef = fn; - } else if (fn instanceof Dict) { - fnRef = fn.objId; - } else if (fn instanceof BaseStream) { - fnRef = fn.dict?.objId; - } - if (fnRef) { - const cachedFn = this._localFunctionCache.getByRef(fnRef); - if (cachedFn) { - return cachedFn; - } - } - const fnObj = this.xref.fetchIfRef(fn); - if (Array.isArray(fnObj)) { - if (!parseArray) { - throw new Error('PDFFunctionFactory.create - expected "parseArray" argument.'); - } - parsedFn = PDFFunction.parseArray(this, fnObj); - } else { - parsedFn = PDFFunction.parse(this, fnObj); - } - if (fnRef) { - this._localFunctionCache.set(null, fnRef, parsedFn); - } - return parsedFn; - } - get _localFunctionCache() { - return shadow(this, "_localFunctionCache", new LocalFunctionCache()); - } -} -function toNumberArray(arr) { - if (!Array.isArray(arr)) { - return null; - } - if (!isNumberArray(arr, null)) { - return arr.map(x => +x); - } - return arr; -} -class PDFFunction { - static getSampleArray(size, outputSize, bps, stream) { - let i, ii; - let length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; - } - length *= outputSize; - const array = new Array(length); - let codeSize = 0; - let codeBuf = 0; - const sampleMul = 1.0 / (2.0 ** bps - 1); - const strBytes = stream.getBytes((length * bps + 7) / 8); - let strIdx = 0; - for (i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array[i] = (codeBuf >> codeSize) * sampleMul; - codeBuf &= (1 << codeSize) - 1; - } - return array; - } - static parse(factory, fn) { - const dict = fn.dict || fn; - const typeNum = dict.get("FunctionType"); - switch (typeNum) { - case 0: - return this.constructSampled(factory, fn, dict); - case 1: - break; - case 2: - return this.constructInterpolated(factory, dict); - case 3: - return this.constructStiched(factory, dict); - case 4: - return this.constructPostScript(factory, fn, dict); - } - throw new FormatError("Unknown type of function"); - } - static parseArray(factory, fnObj) { - const { - xref - } = factory; - const fnArray = []; - for (const fn of fnObj) { - fnArray.push(this.parse(factory, xref.fetchIfRef(fn))); - } - return function (src, srcOffset, dest, destOffset) { - for (let i = 0, ii = fnArray.length; i < ii; i++) { - fnArray[i](src, srcOffset, dest, destOffset + i); - } - }; - } - static constructSampled(factory, fn, dict) { - function toMultiArray(arr) { - const inputLength = arr.length; - const out = []; - let index = 0; - for (let i = 0; i < inputLength; i += 2) { - out[index++] = [arr[i], arr[i + 1]]; - } - return out; - } - function interpolate(x, xmin, xmax, ymin, ymax) { - return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); - } - let domain = toNumberArray(dict.getArray("Domain")); - let range = toNumberArray(dict.getArray("Range")); - if (!domain || !range) { - throw new FormatError("No domain or range"); - } - const inputSize = domain.length / 2; - const outputSize = range.length / 2; - domain = toMultiArray(domain); - range = toMultiArray(range); - const size = toNumberArray(dict.getArray("Size")); - const bps = dict.get("BitsPerSample"); - const order = dict.get("Order") || 1; - if (order !== 1) { - info("No support for cubic spline interpolation: " + order); - } - let encode = toNumberArray(dict.getArray("Encode")); - if (!encode) { - encode = []; - for (let i = 0; i < inputSize; ++i) { - encode.push([0, size[i] - 1]); - } - } else { - encode = toMultiArray(encode); - } - let decode = toNumberArray(dict.getArray("Decode")); - decode = !decode ? range : toMultiArray(decode); - const samples = this.getSampleArray(size, outputSize, bps, fn); - return function constructSampledFn(src, srcOffset, dest, destOffset) { - const cubeVertices = 1 << inputSize; - const cubeN = new Float64Array(cubeVertices).fill(1); - const cubeVertex = new Uint32Array(cubeVertices); - let i, j; - let k = outputSize, - pos = 1; - for (i = 0; i < inputSize; ++i) { - const domain_2i = domain[i][0]; - const domain_2i_1 = domain[i][1]; - const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1); - let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); - const size_i = size[i]; - e = MathClamp(e, 0, size_i - 1); - const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; - const n0 = e0 + 1 - e; - const n1 = e - e0; - const offset0 = e0 * k; - const offset1 = offset0 + k; - for (j = 0; j < cubeVertices; j++) { - if (j & pos) { - cubeN[j] *= n1; - cubeVertex[j] += offset1; - } else { - cubeN[j] *= n0; - cubeVertex[j] += offset0; - } - } - k *= size_i; - pos <<= 1; - } - for (j = 0; j < outputSize; ++j) { - let rj = 0; - for (i = 0; i < cubeVertices; i++) { - rj += samples[cubeVertex[i] + j] * cubeN[i]; - } - rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); - dest[destOffset + j] = MathClamp(rj, range[j][0], range[j][1]); - } - }; - } - static constructInterpolated(factory, dict) { - const c0 = toNumberArray(dict.getArray("C0")) || [0]; - const c1 = toNumberArray(dict.getArray("C1")) || [1]; - const n = dict.get("N"); - const diff = []; - for (let i = 0, ii = c0.length; i < ii; ++i) { - diff.push(c1[i] - c0[i]); - } - const length = diff.length; - return function constructInterpolatedFn(src, srcOffset, dest, destOffset) { - const x = n === 1 ? src[srcOffset] : src[srcOffset] ** n; - for (let j = 0; j < length; ++j) { - dest[destOffset + j] = c0[j] + x * diff[j]; - } - }; - } - static constructStiched(factory, dict) { - const domain = toNumberArray(dict.getArray("Domain")); - if (!domain) { - throw new FormatError("No domain"); - } - const inputSize = domain.length / 2; - if (inputSize !== 1) { - throw new FormatError("Bad domain for stiched function"); - } - const { - xref - } = factory; - const fns = []; - for (const fn of dict.get("Functions")) { - fns.push(this.parse(factory, xref.fetchIfRef(fn))); - } - const bounds = toNumberArray(dict.getArray("Bounds")); - const encode = toNumberArray(dict.getArray("Encode")); - const tmpBuf = new Float32Array(1); - return function constructStichedFn(src, srcOffset, dest, destOffset) { - const v = MathClamp(src[srcOffset], domain[0], domain[1]); - const length = bounds.length; - let i; - for (i = 0; i < length; ++i) { - if (v < bounds[i]) { - break; - } - } - let dmin = domain[0]; - if (i > 0) { - dmin = bounds[i - 1]; - } - let dmax = domain[1]; - if (i < bounds.length) { - dmax = bounds[i]; - } - const rmin = encode[2 * i]; - const rmax = encode[2 * i + 1]; - tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - fns[i](tmpBuf, 0, dest, destOffset); - }; - } - static constructPostScript(factory, fn, dict) { - const domain = toNumberArray(dict.getArray("Domain")); - const range = toNumberArray(dict.getArray("Range")); - if (!domain) { - throw new FormatError("No domain."); - } - if (!range) { - throw new FormatError("No range."); - } - const lexer = new PostScriptLexer(fn); - const parser = new PostScriptParser(lexer); - const code = parser.parse(); - if (factory.isEvalSupported && FeatureTest.isEvalSupported) { - const compiled = new PostScriptCompiler().compile(code, domain, range); - if (compiled) { - return new Function("src", "srcOffset", "dest", "destOffset", compiled); - } - } - info("Unable to compile PS function"); - const numOutputs = range.length >> 1; - const numInputs = domain.length >> 1; - const evaluator = new PostScriptEvaluator(code); - const cache = Object.create(null); - const MAX_CACHE_SIZE = 2048 * 4; - let cache_available = MAX_CACHE_SIZE; - const tmpBuf = new Float32Array(numInputs); - return function constructPostScriptFn(src, srcOffset, dest, destOffset) { - let i, value; - let key = ""; - const input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + "_"; - } - const cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - const output = new Float32Array(numOutputs); - const stack = evaluator.execute(input); - const stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - let bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 + 1]; - if (value > bound) { - value = bound; - } - } - output[i] = value; - } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; - } -} -function isPDFFunction(v) { - let fnDict; - if (v instanceof Dict) { - fnDict = v; - } else if (v instanceof BaseStream) { - fnDict = v.dict; - } else { - return false; - } - return fnDict.has("FunctionType"); -} -class PostScriptStack { - static MAX_STACK_SIZE = 100; - constructor(initialStack) { - this.stack = initialStack ? Array.from(initialStack) : []; - } - push(value) { - if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { - throw new Error("PostScript function stack overflow."); - } - this.stack.push(value); - } - pop() { - if (this.stack.length <= 0) { - throw new Error("PostScript function stack underflow."); - } - return this.stack.pop(); - } - copy(n) { - if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { - throw new Error("PostScript function stack overflow."); - } - const stack = this.stack; - for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { - stack.push(stack[i]); - } - } - index(n) { - this.push(this.stack[this.stack.length - n - 1]); - } - roll(n, p) { - const stack = this.stack; - const l = stack.length - n; - const r = stack.length - 1; - const c = l + (p - Math.floor(p / n) * n); - for (let i = l, j = r; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - for (let i = l, j = c - 1; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - for (let i = c, j = r; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - } -} -class PostScriptEvaluator { - constructor(operators) { - this.operators = operators; - } - execute(initialStack) { - const stack = new PostScriptStack(initialStack); - let counter = 0; - const operators = this.operators; - const length = operators.length; - let operator, a, b; - while (counter < length) { - operator = operators[counter++]; - if (typeof operator === "number") { - stack.push(operator); - continue; - } - switch (operator) { - case "jz": - b = stack.pop(); - a = stack.pop(); - if (!a) { - counter = b; - } - break; - case "j": - a = stack.pop(); - counter = a; - break; - case "abs": - a = stack.pop(); - stack.push(Math.abs(a)); - break; - case "add": - b = stack.pop(); - a = stack.pop(); - stack.push(a + b); - break; - case "and": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a && b); - } else { - stack.push(a & b); - } - break; - case "atan": - b = stack.pop(); - a = stack.pop(); - a = Math.atan2(a, b) / Math.PI * 180; - if (a < 0) { - a += 360; - } - stack.push(a); - break; - case "bitshift": - b = stack.pop(); - a = stack.pop(); - if (a > 0) { - stack.push(a << b); - } else { - stack.push(a >> b); - } - break; - case "ceiling": - a = stack.pop(); - stack.push(Math.ceil(a)); - break; - case "copy": - a = stack.pop(); - stack.copy(a); - break; - case "cos": - a = stack.pop(); - stack.push(Math.cos(a % 360 / 180 * Math.PI)); - break; - case "cvi": - a = stack.pop() | 0; - stack.push(a); - break; - case "cvr": - break; - case "div": - b = stack.pop(); - a = stack.pop(); - stack.push(a / b); - break; - case "dup": - stack.copy(1); - break; - case "eq": - b = stack.pop(); - a = stack.pop(); - stack.push(a === b); - break; - case "exch": - stack.roll(2, 1); - break; - case "exp": - b = stack.pop(); - a = stack.pop(); - stack.push(a ** b); - break; - case "false": - stack.push(false); - break; - case "floor": - a = stack.pop(); - stack.push(Math.floor(a)); - break; - case "ge": - b = stack.pop(); - a = stack.pop(); - stack.push(a >= b); - break; - case "gt": - b = stack.pop(); - a = stack.pop(); - stack.push(a > b); - break; - case "idiv": - b = stack.pop(); - a = stack.pop(); - stack.push(a / b | 0); - break; - case "index": - a = stack.pop(); - stack.index(a); - break; - case "le": - b = stack.pop(); - a = stack.pop(); - stack.push(a <= b); - break; - case "ln": - a = stack.pop(); - stack.push(Math.log(a)); - break; - case "log": - a = stack.pop(); - stack.push(Math.log10(a)); - break; - case "lt": - b = stack.pop(); - a = stack.pop(); - stack.push(a < b); - break; - case "mod": - b = stack.pop(); - a = stack.pop(); - stack.push(a % b); - break; - case "mul": - b = stack.pop(); - a = stack.pop(); - stack.push(a * b); - break; - case "ne": - b = stack.pop(); - a = stack.pop(); - stack.push(a !== b); - break; - case "neg": - a = stack.pop(); - stack.push(-a); - break; - case "not": - a = stack.pop(); - if (typeof a === "boolean") { - stack.push(!a); - } else { - stack.push(~a); - } - break; - case "or": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a || b); - } else { - stack.push(a | b); - } - break; - case "pop": - stack.pop(); - break; - case "roll": - b = stack.pop(); - a = stack.pop(); - stack.roll(a, b); - break; - case "round": - a = stack.pop(); - stack.push(Math.round(a)); - break; - case "sin": - a = stack.pop(); - stack.push(Math.sin(a % 360 / 180 * Math.PI)); - break; - case "sqrt": - a = stack.pop(); - stack.push(Math.sqrt(a)); - break; - case "sub": - b = stack.pop(); - a = stack.pop(); - stack.push(a - b); - break; - case "true": - stack.push(true); - break; - case "truncate": - a = stack.pop(); - a = a < 0 ? Math.ceil(a) : Math.floor(a); - stack.push(a); - break; - case "xor": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a !== b); - } else { - stack.push(a ^ b); - } - break; - default: - throw new FormatError(`Unknown operator ${operator}`); - } - } - return stack.stack; - } -} -class AstNode { - constructor(type) { - this.type = type; - } - visit(visitor) { - unreachable("abstract method"); - } -} -class AstArgument extends AstNode { - constructor(index, min, max) { - super("args"); - this.index = index; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitArgument(this); - } -} -class AstLiteral extends AstNode { - constructor(number) { - super("literal"); - this.number = number; - this.min = number; - this.max = number; - } - visit(visitor) { - visitor.visitLiteral(this); - } -} -class AstBinaryOperation extends AstNode { - constructor(op, arg1, arg2, min, max) { - super("binary"); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitBinaryOperation(this); - } -} -class AstMin extends AstNode { - constructor(arg, max) { - super("max"); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - visit(visitor) { - visitor.visitMin(this); - } -} -class AstVariable extends AstNode { - constructor(index, min, max) { - super("var"); - this.index = index; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitVariable(this); - } -} -class AstVariableDefinition extends AstNode { - constructor(variable, arg) { - super("definition"); - this.variable = variable; - this.arg = arg; - } - visit(visitor) { - visitor.visitVariableDefinition(this); - } -} -class ExpressionBuilderVisitor { - constructor() { - this.parts = []; - } - visitArgument(arg) { - this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); - } - visitVariable(variable) { - this.parts.push("v", variable.index); - } - visitLiteral(literal) { - this.parts.push(literal.number); - } - visitBinaryOperation(operation) { - this.parts.push("("); - operation.arg1.visit(this); - this.parts.push(" ", operation.op, " "); - operation.arg2.visit(this); - this.parts.push(")"); - } - visitVariableDefinition(definition) { - this.parts.push("var "); - definition.variable.visit(this); - this.parts.push(" = "); - definition.arg.visit(this); - this.parts.push(";"); - } - visitMin(max) { - this.parts.push("Math.min("); - max.arg.visit(this); - this.parts.push(", ", max.max, ")"); - } - toString() { - return this.parts.join(""); - } -} -function buildAddOperation(num1, num2) { - if (num2.type === "literal" && num2.number === 0) { - return num1; - } - if (num1.type === "literal" && num1.number === 0) { - return num2; - } - if (num2.type === "literal" && num1.type === "literal") { - return new AstLiteral(num1.number + num2.number); - } - return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); -} -function buildMulOperation(num1, num2) { - if (num2.type === "literal") { - if (num2.number === 0) { - return new AstLiteral(0); - } else if (num2.number === 1) { - return num1; - } else if (num1.type === "literal") { - return new AstLiteral(num1.number * num2.number); - } - } - if (num1.type === "literal") { - if (num1.number === 0) { - return new AstLiteral(0); - } else if (num1.number === 1) { - return num2; - } - } - const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); - const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation("*", num1, num2, min, max); -} -function buildSubOperation(num1, num2) { - if (num2.type === "literal") { - if (num2.number === 0) { - return num1; - } else if (num1.type === "literal") { - return new AstLiteral(num1.number - num2.number); - } - } - if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { - return num2.arg2; - } - return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); -} -function buildMinOperation(num1, max) { - if (num1.min >= max) { - return new AstLiteral(max); - } else if (num1.max <= max) { - return num1; - } - return new AstMin(num1, max); -} -class PostScriptCompiler { - compile(code, domain, range) { - const stack = []; - const instructions = []; - const inputSize = domain.length >> 1, - outputSize = range.length >> 1; - let lastRegister = 0; - let n, j; - let num1, num2, ast1, ast2, tmpVar, item; - for (let i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - for (let i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === "number") { - stack.push(new AstLiteral(item)); - continue; - } - switch (item) { - case "add": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case "cvr": - if (stack.length < 1) { - return null; - } - break; - case "mul": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case "sub": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case "exch": - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); - ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case "pop": - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case "index": - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== "literal") { - return null; - } - n = num1.number; - if (n < 0 || !Number.isInteger(n) || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === "literal" || ast1.type === "var") { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case "dup": - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) { - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack.at(-1); - if (ast1.type === "literal" || ast1.type === "var") { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case "roll": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== "literal" || num1.type !== "literal") { - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { - return null; - } - j = (j % n + n) % n; - if (j === 0) { - break; - } - stack.push(...stack.splice(stack.length - n, n - j)); - break; - default: - return null; - } - } - if (stack.length !== outputSize) { - return null; - } - const result = []; - for (const instruction of instructions) { - const statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - } - for (let i = 0, ii = stack.length; i < ii; i++) { - const expr = stack[i], - statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - const min = range[i * 2], - max = range[i * 2 + 1]; - const out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift("Math.max(", min, ", "); - out.push(")"); - } - if (max < expr.max) { - out.unshift("Math.min(", max, ", "); - out.push(")"); - } - out.unshift("dest[destOffset + ", i, "] = "); - out.push(";"); - result.push(out.join("")); - } - return result.join("\n"); - } -} - -;// ./src/core/bidi.js - -const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"]; -const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"]; -function isOdd(i) { - return (i & 1) !== 0; -} -function isEven(i) { - return (i & 1) === 0; -} -function findUnequal(arr, start, value) { - let j, jj; - for (j = start, jj = arr.length; j < jj; ++j) { - if (arr[j] !== value) { - return j; - } - } - return j; -} -function reverseValues(arr, start, end) { - for (let i = start, j = end - 1; i < j; ++i, --j) { - const temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } -} -function createBidiText(str, isLTR, vertical = false) { - let dir = "ltr"; - if (vertical) { - dir = "ttb"; - } else if (!isLTR) { - dir = "rtl"; - } - return { - str, - dir - }; -} -const chars = []; -const types = []; -function bidi(str, startLevel = -1, vertical = false) { - let isLTR = true; - const strLength = str.length; - if (strLength === 0 || vertical) { - return createBidiText(str, isLTR, vertical); - } - chars.length = strLength; - types.length = strLength; - let numBidi = 0; - let i, ii; - for (i = 0; i < strLength; ++i) { - chars[i] = str.charAt(i); - const charCode = str.charCodeAt(i); - let charType = "L"; - if (charCode <= 0x00ff) { - charType = baseTypes[charCode]; - } else if (0x0590 <= charCode && charCode <= 0x05f4) { - charType = "R"; - } else if (0x0600 <= charCode && charCode <= 0x06ff) { - charType = arabicTypes[charCode & 0xff]; - if (!charType) { - warn("Bidi: invalid Unicode character " + charCode.toString(16)); - } - } else if (0x0700 <= charCode && charCode <= 0x08ac || 0xfb50 <= charCode && charCode <= 0xfdff || 0xfe70 <= charCode && charCode <= 0xfeff) { - charType = "AL"; - } - if (charType === "R" || charType === "AL" || charType === "AN") { - numBidi++; - } - types[i] = charType; - } - if (numBidi === 0) { - isLTR = true; - return createBidiText(str, isLTR); - } - if (startLevel === -1) { - if (numBidi / strLength < 0.3 && strLength > 4) { - isLTR = true; - startLevel = 0; - } else { - isLTR = false; - startLevel = 1; - } - } - const levels = []; - for (i = 0; i < strLength; ++i) { - levels[i] = startLevel; - } - const e = isOdd(startLevel) ? "R" : "L"; - const sor = e; - const eor = sor; - let lastType = sor; - for (i = 0; i < strLength; ++i) { - if (types[i] === "NSM") { - types[i] = lastType; - } else { - lastType = types[i]; - } - } - lastType = sor; - let t; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === "EN") { - types[i] = lastType === "AL" ? "AN" : "EN"; - } else if (t === "R" || t === "L" || t === "AL") { - lastType = t; - } - } - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === "AL") { - types[i] = "R"; - } - } - for (i = 1; i < strLength - 1; ++i) { - if (types[i] === "ES" && types[i - 1] === "EN" && types[i + 1] === "EN") { - types[i] = "EN"; - } - if (types[i] === "CS" && (types[i - 1] === "EN" || types[i - 1] === "AN") && types[i + 1] === types[i - 1]) { - types[i] = types[i - 1]; - } - } - for (i = 0; i < strLength; ++i) { - if (types[i] === "EN") { - for (let j = i - 1; j >= 0; --j) { - if (types[j] !== "ET") { - break; - } - types[j] = "EN"; - } - for (let j = i + 1; j < strLength; ++j) { - if (types[j] !== "ET") { - break; - } - types[j] = "EN"; - } - } - } - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === "WS" || t === "ES" || t === "ET" || t === "CS") { - types[i] = "ON"; - } - } - lastType = sor; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === "EN") { - types[i] = lastType === "L" ? "L" : "EN"; - } else if (t === "R" || t === "L") { - lastType = t; - } - } - for (i = 0; i < strLength; ++i) { - if (types[i] === "ON") { - const end = findUnequal(types, i + 1, "ON"); - let before = sor; - if (i > 0) { - before = types[i - 1]; - } - let after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== "L") { - before = "R"; - } - if (after !== "L") { - after = "R"; - } - if (before === after) { - types.fill(before, i, end); - } - i = end - 1; - } - } - for (i = 0; i < strLength; ++i) { - if (types[i] === "ON") { - types[i] = e; - } - } - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (isEven(levels[i])) { - if (t === "R") { - levels[i] += 1; - } else if (t === "AN" || t === "EN") { - levels[i] += 2; - } - } else if (t === "L" || t === "AN" || t === "EN") { - levels[i] += 1; - } - } - let highestLevel = -1; - let lowestOddLevel = 99; - let level; - for (i = 0, ii = levels.length; i < ii; ++i) { - level = levels[i]; - if (highestLevel < level) { - highestLevel = level; - } - if (lowestOddLevel > level && isOdd(level)) { - lowestOddLevel = level; - } - } - for (level = highestLevel; level >= lowestOddLevel; --level) { - let start = -1; - for (i = 0, ii = levels.length; i < ii; ++i) { - if (levels[i] < level) { - if (start >= 0) { - reverseValues(chars, start, i); - start = -1; - } - } else if (start < 0) { - start = i; - } - } - if (start >= 0) { - reverseValues(chars, start, levels.length); - } - } - for (i = 0, ii = chars.length; i < ii; ++i) { - const ch = chars[i]; - if (ch === "<" || ch === ">") { - chars[i] = ""; - } - } - return createBidiText(chars.join(""), isLTR); -} - -;// ./src/core/font_substitutions.js - - - -const NORMAL = { - style: "normal", - weight: "normal" -}; -const BOLD = { - style: "normal", - weight: "bold" -}; -const ITALIC = { - style: "italic", - weight: "normal" -}; -const BOLDITALIC = { - style: "italic", - weight: "bold" -}; -const substitutionMap = new Map([["Times-Roman", { - local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], - style: NORMAL, - ultimate: "serif" -}], ["Times-Bold", { - alias: "Times-Roman", - style: BOLD, - ultimate: "serif" -}], ["Times-Italic", { - alias: "Times-Roman", - style: ITALIC, - ultimate: "serif" -}], ["Times-BoldItalic", { - alias: "Times-Roman", - style: BOLDITALIC, - ultimate: "serif" -}], ["Helvetica", { - local: ["Helvetica", "Helvetica Neue", "Arial", "Arial Nova", "Liberation Sans", "Arimo", "Nimbus Sans", "Nimbus Sans L", "A030", "TeX Gyre Heros", "FreeSans", "DejaVu Sans", "Albany", "Bitstream Vera Sans", "Arial Unicode MS", "Microsoft Sans Serif", "Apple Symbols", "Cantarell"], - path: "LiberationSans-Regular.ttf", - style: NORMAL, - ultimate: "sans-serif" -}], ["Helvetica-Bold", { - alias: "Helvetica", - path: "LiberationSans-Bold.ttf", - style: BOLD, - ultimate: "sans-serif" -}], ["Helvetica-Oblique", { - alias: "Helvetica", - path: "LiberationSans-Italic.ttf", - style: ITALIC, - ultimate: "sans-serif" -}], ["Helvetica-BoldOblique", { - alias: "Helvetica", - path: "LiberationSans-BoldItalic.ttf", - style: BOLDITALIC, - ultimate: "sans-serif" -}], ["Courier", { - local: ["Courier", "Courier New", "Liberation Mono", "Nimbus Mono", "Nimbus Mono L", "Cousine", "Cumberland", "TeX Gyre Cursor", "FreeMono", "Linux Libertine Mono O", "Libertinus Mono"], - style: NORMAL, - ultimate: "monospace" -}], ["Courier-Bold", { - alias: "Courier", - style: BOLD, - ultimate: "monospace" -}], ["Courier-Oblique", { - alias: "Courier", - style: ITALIC, - ultimate: "monospace" -}], ["Courier-BoldOblique", { - alias: "Courier", - style: BOLDITALIC, - ultimate: "monospace" -}], ["ArialBlack", { - local: ["Arial Black"], - style: { - style: "normal", - weight: "900" - }, - fallback: "Helvetica-Bold" -}], ["ArialBlack-Bold", { - alias: "ArialBlack" -}], ["ArialBlack-Italic", { - alias: "ArialBlack", - style: { - style: "italic", - weight: "900" - }, - fallback: "Helvetica-BoldOblique" -}], ["ArialBlack-BoldItalic", { - alias: "ArialBlack-Italic" -}], ["ArialNarrow", { - local: ["Arial Narrow", "Liberation Sans Narrow", "Helvetica Condensed", "Nimbus Sans Narrow", "TeX Gyre Heros Cn"], - style: NORMAL, - fallback: "Helvetica" -}], ["ArialNarrow-Bold", { - alias: "ArialNarrow", - style: BOLD, - fallback: "Helvetica-Bold" -}], ["ArialNarrow-Italic", { - alias: "ArialNarrow", - style: ITALIC, - fallback: "Helvetica-Oblique" -}], ["ArialNarrow-BoldItalic", { - alias: "ArialNarrow", - style: BOLDITALIC, - fallback: "Helvetica-BoldOblique" -}], ["Calibri", { - local: ["Calibri", "Carlito"], - style: NORMAL, - fallback: "Helvetica" -}], ["Calibri-Bold", { - alias: "Calibri", - style: BOLD, - fallback: "Helvetica-Bold" -}], ["Calibri-Italic", { - alias: "Calibri", - style: ITALIC, - fallback: "Helvetica-Oblique" -}], ["Calibri-BoldItalic", { - alias: "Calibri", - style: BOLDITALIC, - fallback: "Helvetica-BoldOblique" -}], ["Wingdings", { - local: ["Wingdings", "URW Dingbats"], - style: NORMAL -}], ["Wingdings-Regular", { - alias: "Wingdings" -}], ["Wingdings-Bold", { - alias: "Wingdings" -}]]); -const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); -function getStyleToAppend(style) { - switch (style) { - case BOLD: - return "Bold"; - case ITALIC: - return "Italic"; - case BOLDITALIC: - return "Bold Italic"; - default: - if (style?.weight === "bold") { - return "Bold"; - } - if (style?.style === "italic") { - return "Italic"; - } - } - return ""; -} -function getFamilyName(str) { - const keywords = new Set(["thin", "extralight", "ultralight", "demilight", "semilight", "light", "book", "regular", "normal", "medium", "demibold", "semibold", "bold", "extrabold", "ultrabold", "black", "heavy", "extrablack", "ultrablack", "roman", "italic", "oblique", "ultracondensed", "extracondensed", "condensed", "semicondensed", "normal", "semiexpanded", "expanded", "extraexpanded", "ultraexpanded", "bolditalic"]); - return str.split(/[- ,+]+/g).filter(tok => !keywords.has(tok.toLowerCase())).join(" "); -} -function generateFont({ - alias, - local, - path, - fallback, - style, - ultimate -}, src, localFontPath, useFallback = true, usePath = true, append = "") { - const result = { - style: null, - ultimate: null - }; - if (local) { - const extra = append ? ` ${append}` : ""; - for (const name of local) { - src.push(`local(${name}${extra})`); - } - } - if (alias) { - const substitution = substitutionMap.get(alias); - const aliasAppend = append || getStyleToAppend(style); - Object.assign(result, generateFont(substitution, src, localFontPath, useFallback && !fallback, usePath && !path, aliasAppend)); - } - if (style) { - result.style = style; - } - if (ultimate) { - result.ultimate = ultimate; - } - if (useFallback && fallback) { - const fallbackInfo = substitutionMap.get(fallback); - const { - ultimate: fallbackUltimate - } = generateFont(fallbackInfo, src, localFontPath, useFallback, usePath && !path, append); - result.ultimate ||= fallbackUltimate; - } - if (usePath && path && localFontPath) { - src.push(`url(${localFontPath}${path})`); - } - return result; -} -function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) { - if (baseFontName.startsWith("InvalidPDFjsFont_")) { - return null; - } - if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) { - baseFontName = baseFontName.slice(7); - } - baseFontName = normalizeFontName(baseFontName); - const key = baseFontName; - let substitutionInfo = systemFontCache.get(key); - if (substitutionInfo) { - return substitutionInfo; - } - let substitution = substitutionMap.get(baseFontName); - if (!substitution) { - for (const [alias, subst] of fontAliases) { - if (baseFontName.startsWith(alias)) { - baseFontName = `${subst}${baseFontName.substring(alias.length)}`; - substitution = substitutionMap.get(baseFontName); - break; - } - } - } - let mustAddBaseFont = false; - if (!substitution) { - substitution = substitutionMap.get(standardFontName); - mustAddBaseFont = true; - } - const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; - if (!substitution) { - if (!validateFontName(baseFontName)) { - warn(`Cannot substitute the font because of its name: ${baseFontName}`); - systemFontCache.set(key, null); - return null; - } - const bold = /bold/gi.test(baseFontName); - const italic = /oblique|italic/gi.test(baseFontName); - const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL; - substitutionInfo = { - css: `"${getFamilyName(baseFontName)}",${loadedName}`, - guessFallback: true, - loadedName, - baseFontName, - src: `local(${baseFontName})`, - style - }; - systemFontCache.set(key, substitutionInfo); - return substitutionInfo; - } - const src = []; - if (mustAddBaseFont && validateFontName(baseFontName)) { - src.push(`local(${baseFontName})`); - } - const { - style, - ultimate - } = generateFont(substitution, src, localFontPath); - const guessFallback = ultimate === null; - const fallback = guessFallback ? "" : `,${ultimate}`; - substitutionInfo = { - css: `"${getFamilyName(baseFontName)}",${loadedName}${fallback}`, - guessFallback, - loadedName, - baseFontName, - src: src.join(","), - style - }; - systemFontCache.set(key, substitutionInfo); - return substitutionInfo; -} - -;// ./src/shared/murmurhash3.js -const SEED = 0xc3d2e1f0; -const MASK_HIGH = 0xffff0000; -const MASK_LOW = 0xffff; -class MurmurHash3_64 { - constructor(seed) { - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - update(input) { - let data, length; - if (typeof input === "string") { - data = new Uint8Array(input.length * 2); - length = 0; - for (let i = 0, ii = input.length; i < ii; i++) { - const code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if (ArrayBuffer.isView(input)) { - data = input.slice(); - length = data.byteLength; - } else { - throw new Error("Invalid data format, must be a string or TypedArray."); - } - const blockCounts = length >> 2; - const tailLength = length - blockCounts * 4; - const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); - let k1 = 0, - k2 = 0; - let h1 = this.h1, - h2 = this.h2; - const C1 = 0xcc9e2d51, - C2 = 0x1b873593; - const C1_LOW = C1 & MASK_LOW, - C2_LOW = C2 & MASK_LOW; - for (let i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; - k2 = k2 << 15 | k2 >>> 17; - k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - k1 = 0; - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - case 1: - k1 ^= data[blockCounts * 4]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - this.h1 = h1; - this.h2 = h2; - } - hexdigest() { - let h1 = this.h1, - h2 = this.h2; - h1 ^= h2 >>> 1; - h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; - h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; - h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); - } -} - -;// ./src/core/image.js - - - - - - - - - - -function resizeImageMask(src, bpc, w1, h1, w2, h2) { - const length = w2 * h2; - let dest; - if (bpc <= 8) { - dest = new Uint8Array(length); - } else if (bpc <= 16) { - dest = new Uint16Array(length); - } else { - dest = new Uint32Array(length); - } - const xRatio = w1 / w2; - const yRatio = h1 / h2; - let i, - j, - py, - newIndex = 0, - oldIndex; - const xScaled = new Uint16Array(w2); - const w1Scanline = w1; - for (i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio); - } - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex]; - } - } - return dest; -} -class PDFImage { - constructor({ - xref, - res, - image, - isInline = false, - smask = null, - mask = null, - isMask = false, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }) { - this.image = image; - const dict = image.dict; - const filter = dict.get("F", "Filter"); - let filterName; - if (filter instanceof Name) { - filterName = filter.name; - } else if (Array.isArray(filter)) { - const filterZero = xref.fetchIfRef(filter[0]); - if (filterZero instanceof Name) { - filterName = filterZero.name; - } - } - switch (filterName) { - case "JPXDecode": - ({ - width: image.width, - height: image.height, - componentsCount: image.numComps, - bitsPerComponent: image.bitsPerComponent - } = JpxImage.parseImageProperties(image.stream)); - image.stream.reset(); - const reducePower = ImageResizer.getReducePowerForJPX(image.width, image.height, image.numComps); - this.jpxDecoderOptions = { - numComponents: 0, - isIndexedColormap: false, - smaskInData: dict.has("SMaskInData"), - reducePower - }; - if (reducePower) { - const factor = 2 ** reducePower; - image.width = Math.ceil(image.width / factor); - image.height = Math.ceil(image.height / factor); - } - break; - case "JBIG2Decode": - image.bitsPerComponent = 1; - image.numComps = 1; - break; - } - let width = dict.get("W", "Width"); - let height = dict.get("H", "Height"); - if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) { - warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); - width = image.width; - height = image.height; - } else { - const validWidth = typeof width === "number" && width > 0, - validHeight = typeof height === "number" && height > 0; - if (!validWidth || !validHeight) { - if (!image.fallbackDims) { - throw new FormatError(`Invalid image width: ${width} or height: ${height}`); - } - warn("PDFImage - using the Width/Height of the parent image, for SMask/Mask data."); - if (!validWidth) { - width = image.fallbackDims.width; - } - if (!validHeight) { - height = image.fallbackDims.height; - } - } - } - this.width = width; - this.height = height; - this.interpolate = dict.get("I", "Interpolate"); - this.imageMask = dict.get("IM", "ImageMask") || false; - this.matte = dict.get("Matte") || false; - let bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get("BPC", "BitsPerComponent"); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - throw new FormatError(`Bits per component missing in image: ${this.imageMask}`); - } - } - } - this.bpc = bitsPerComponent; - if (!this.imageMask) { - let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); - const hasColorSpace = !!colorSpace; - if (!hasColorSpace) { - if (this.jpxDecoderOptions) { - colorSpace = Name.get("DeviceRGBA"); - } else { - switch (image.numComps) { - case 1: - colorSpace = Name.get("DeviceGray"); - break; - case 3: - colorSpace = Name.get("DeviceRGB"); - break; - case 4: - colorSpace = Name.get("DeviceCMYK"); - break; - default: - throw new Error(`Images with ${image.numComps} color components not supported.`); - } - } - } else if (this.jpxDecoderOptions?.smaskInData) { - colorSpace = Name.get("DeviceRGBA"); - } - this.colorSpace = ColorSpaceUtils.parse({ - cs: colorSpace, - xref, - resources: isInline ? res : null, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - this.numComps = this.colorSpace.numComps; - if (this.jpxDecoderOptions) { - this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComps : 0; - this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; - } - } - this.decode = dict.getArray("D", "Decode"); - this.needsDecode = false; - if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode, bitsPerComponent) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { - this.needsDecode = true; - const max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - const isIndexed = this.colorSpace?.name === "Indexed"; - for (let i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - const dmin = this.decode[i]; - const dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = isIndexed ? (dmax - dmin) / max : dmax - dmin; - this.decodeAddends[j] = isIndexed ? dmin : max * dmin; - } - } - if (smask) { - smask.fallbackDims ??= { - width, - height - }; - this.smask = new PDFImage({ - xref, - res, - image: smask, - isInline, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - } else if (mask) { - if (mask instanceof BaseStream) { - const maskDict = mask.dict, - imageMask = maskDict.get("IM", "ImageMask"); - if (!imageMask) { - warn("Ignoring /Mask in image without /ImageMask."); - } else { - mask.fallbackDims ??= { - width, - height - }; - this.mask = new PDFImage({ - xref, - res, - image: mask, - isInline, - isMask: true, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - } - } else { - this.mask = mask; - } - } - } - static async buildImage({ - xref, - res, - image, - isInline = false, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }) { - const imageData = image; - let smaskData = null; - let maskData = null; - const smask = image.dict.get("SMask"); - const mask = image.dict.get("Mask"); - if (smask) { - if (smask instanceof BaseStream) { - smaskData = smask; - } else { - warn("Unsupported /SMask format."); - } - } else if (mask) { - if (mask instanceof BaseStream || Array.isArray(mask)) { - maskData = mask; - } else { - warn("Unsupported /Mask format."); - } - } - return new PDFImage({ - xref, - res, - image: imageData, - isInline, - smask: smaskData, - mask: maskData, - pdfFunctionFactory, - globalColorSpaceCache, - localColorSpaceCache - }); - } - static async createMask({ - image, - isOffscreenCanvasSupported = false - }) { - const { - dict - } = image; - const width = dict.get("W", "Width"); - const height = dict.get("H", "Height"); - const interpolate = dict.get("I", "Interpolate"); - const decode = dict.getArray("D", "Decode"); - const inverseDecode = decode?.[0] > 0; - const computedLength = (width + 7 >> 3) * height; - const imgArray = image.getBytes(computedLength); - const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); - if (isSingleOpaquePixel) { - return { - isSingleOpaquePixel - }; - } - if (isOffscreenCanvasSupported) { - if (ImageResizer.needsToBeResized(width, height)) { - const data = new Uint8ClampedArray(width * height * 4); - convertBlackAndWhiteToRGBA({ - src: imgArray, - dest: data, - width, - height, - nonBlackColor: 0, - inverseDecode - }); - return ImageResizer.createImage({ - kind: ImageKind.RGBA_32BPP, - data, - width, - height, - interpolate - }); - } - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d"); - const imgData = ctx.createImageData(width, height); - convertBlackAndWhiteToRGBA({ - src: imgArray, - dest: imgData.data, - width, - height, - nonBlackColor: 0, - inverseDecode - }); - ctx.putImageData(imgData, 0, 0); - const bitmap = canvas.transferToImageBitmap(); - return { - data: null, - width, - height, - interpolate, - bitmap - }; - } - const actualLength = imgArray.byteLength; - const haveFullData = computedLength === actualLength; - let data; - if (image instanceof DecodeStream && (!inverseDecode || haveFullData)) { - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - data.fill(0xff, actualLength); - } - if (inverseDecode) { - for (let i = 0; i < actualLength; i++) { - data[i] ^= 0xff; - } - } - return { - data, - width, - height, - interpolate - }; - } - get drawWidth() { - return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); - } - get drawHeight() { - return Math.max(this.height, this.smask?.height || 0, this.mask?.height || 0); - } - decodeBuffer(buffer) { - const bpc = this.bpc; - const numComps = this.numComps; - const decodeAddends = this.decodeAddends; - const decodeCoefficients = this.decodeCoefficients; - const max = (1 << bpc) - 1; - let i, ii; - if (bpc === 1) { - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!buffer[i]; - } - return; - } - let index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (let j = 0; j < numComps; j++) { - buffer[index] = MathClamp(decodeAddends[j] + buffer[index] * decodeCoefficients[j], 0, max); - index++; - } - } - } - getComponents(buffer) { - const bpc = this.bpc; - if (bpc === 8) { - return buffer; - } - const width = this.width; - const height = this.height; - const numComps = this.numComps; - const length = width * height * numComps; - let bufferPos = 0; - let output; - if (bpc <= 8) { - output = new Uint8Array(length); - } else if (bpc <= 16) { - output = new Uint16Array(length); - } else { - output = new Uint32Array(length); - } - const rowComps = width * numComps; - const max = (1 << bpc) - 1; - let i = 0, - ii, - buf; - if (bpc === 1) { - let mask, loop1End, loop2End; - for (let j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = buf >> 7 & 1; - output[i + 1] = buf >> 6 & 1; - output[i + 2] = buf >> 5 & 1; - output[i + 3] = buf >> 4 & 1; - output[i + 4] = buf >> 3 & 1; - output[i + 5] = buf >> 2 & 1; - output[i + 6] = buf >> 1 & 1; - output[i + 7] = buf & 1; - i += 8; - } - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - let bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - while (bits < bpc) { - buf = buf << 8 | buffer[bufferPos++]; - bits += 8; - } - const remainingBits = bits - bpc; - let value = buf >> remainingBits; - if (value < 0) { - value = 0; - } else if (value > max) { - value = max; - } - output[i] = value; - buf &= (1 << remainingBits) - 1; - bits = remainingBits; - } - } - return output; - } - async fillOpacity(rgbaBuf, width, height, actualHeight, image) { - const smask = this.smask; - const mask = this.mask; - let alphaBuf, sw, sh, i, ii, j; - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8ClampedArray(sw * sh); - await smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8ClampedArray(sw * sh); - mask.numComps = 1; - await mask.fillGrayBuffer(alphaBuf); - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); - } - } else if (Array.isArray(mask)) { - alphaBuf = new Uint8ClampedArray(width * height); - const numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - let opacity = 0; - const imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - const color = image[imageOffset + j]; - const maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - throw new FormatError("Unknown mask format."); - } - } - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - } - undoPreblend(buffer, width, height) { - const matte = this.smask?.matte; - if (!matte) { - return; - } - const matteRgb = this.colorSpace.getRgb(matte, 0); - const matteR = matteRgb[0]; - const matteG = matteRgb[1]; - const matteB = matteRgb[2]; - const length = width * height * 4; - for (let i = 0; i < length; i += 4) { - const alpha = buffer[i + 3]; - if (alpha === 0) { - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - const k = 255 / alpha; - buffer[i] = (buffer[i] - matteR) * k + matteR; - buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG; - buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB; - } - } - async createImageData(forceRGBA = false, isOffscreenCanvasSupported = false) { - const drawWidth = this.drawWidth; - const drawHeight = this.drawHeight; - const imgData = { - width: drawWidth, - height: drawHeight, - interpolate: this.interpolate, - kind: 0, - data: null - }; - const numComps = this.numComps; - const originalWidth = this.width; - const originalHeight = this.height; - const bpc = this.bpc; - const rowBytes = originalWidth * numComps * bpc + 7 >> 3; - const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); - if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { - imgData.kind = ImageKind.RGBA_32BPP; - const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, {}); - if (isOffscreenCanvasSupported) { - if (!mustBeResized) { - return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); - } - return ImageResizer.createImage(imgData, false); - } - return imgData; - } - if (!forceRGBA) { - let kind; - if (this.colorSpace.name === "DeviceGray" && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === "DeviceRGB" && bpc === 8 && !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { - const image = await this.#getImage(originalWidth, originalHeight); - if (image) { - return image; - } - const data = await this.getImageBytes(originalHeight * rowBytes, {}); - if (isOffscreenCanvasSupported) { - if (mustBeResized) { - return ImageResizer.createImage({ - data, - kind, - width: drawWidth, - height: drawHeight, - interpolate: this.interpolate - }, this.needsDecode); - } - return this.createBitmap(kind, originalWidth, originalHeight, data); - } - imgData.kind = kind; - imgData.data = data; - if (this.needsDecode) { - assert(kind === ImageKind.GRAYSCALE_1BPP, "PDFImage.createImageData: The image must be grayscale."); - const buffer = imgData.data; - for (let i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && !this.needsDecode) { - let imageLength = originalHeight * rowBytes; - if (isOffscreenCanvasSupported && !mustBeResized) { - let isHandled = false; - switch (this.colorSpace.name) { - case "DeviceGray": - imageLength *= 4; - isHandled = true; - break; - case "DeviceRGB": - imageLength = imageLength / 3 * 4; - isHandled = true; - break; - case "DeviceCMYK": - isHandled = true; - break; - } - if (isHandled) { - const image = await this.#getImage(drawWidth, drawHeight); - if (image) { - return image; - } - const rgba = await this.getImageBytes(imageLength, { - drawWidth, - drawHeight, - forceRGBA: true - }); - return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); - } - } else { - switch (this.colorSpace.name) { - case "DeviceGray": - imageLength *= 3; - case "DeviceRGB": - case "DeviceCMYK": - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = await this.getImageBytes(imageLength, { - drawWidth, - drawHeight, - forceRGB: true - }); - if (mustBeResized) { - return ImageResizer.createImage(imgData); - } - return imgData; - } - } - } - } - const imgArray = await this.getImageBytes(originalHeight * rowBytes, { - internal: true - }); - const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; - const comps = this.getComponents(imgArray); - let alpha01, maybeUndoPreblend; - let canvas, ctx, canvasImgData, data; - if (isOffscreenCanvasSupported && !mustBeResized) { - canvas = new OffscreenCanvas(drawWidth, drawHeight); - ctx = canvas.getContext("2d"); - canvasImgData = ctx.createImageData(drawWidth, drawHeight); - data = canvasImgData.data; - } - imgData.kind = ImageKind.RGBA_32BPP; - if (!forceRGBA && !this.smask && !this.mask) { - if (!isOffscreenCanvasSupported || mustBeResized) { - imgData.kind = ImageKind.RGB_24BPP; - data = new Uint8ClampedArray(drawWidth * drawHeight * 3); - alpha01 = 0; - } else { - const arr = new Uint32Array(data.buffer); - arr.fill(FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff); - alpha01 = 1; - } - maybeUndoPreblend = false; - } else { - if (!isOffscreenCanvasSupported || mustBeResized) { - data = new Uint8ClampedArray(drawWidth * drawHeight * 4); - } - alpha01 = 1; - maybeUndoPreblend = true; - await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); - } - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(data, drawWidth, actualHeight); - } - if (isOffscreenCanvasSupported && !mustBeResized) { - ctx.putImageData(canvasImgData, 0, 0); - const bitmap = canvas.transferToImageBitmap(); - return { - data: null, - width: drawWidth, - height: drawHeight, - bitmap, - interpolate: this.interpolate - }; - } - imgData.data = data; - if (mustBeResized) { - return ImageResizer.createImage(imgData); - } - return imgData; - } - async fillGrayBuffer(buffer) { - const numComps = this.numComps; - if (numComps !== 1) { - throw new FormatError(`Reading gray scale from a color image: ${numComps}`); - } - const width = this.width; - const height = this.height; - const bpc = this.bpc; - const rowBytes = width * numComps * bpc + 7 >> 3; - const imgArray = await this.getImageBytes(height * rowBytes, { - internal: true - }); - const comps = this.getComponents(imgArray); - let i, length; - if (bpc === 1) { - length = width * height; - if (this.needsDecode) { - for (i = 0; i < length; ++i) { - buffer[i] = comps[i] - 1 & 255; - } - } else { - for (i = 0; i < length; ++i) { - buffer[i] = -comps[i] & 255; - } - } - return; - } - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - const scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = scale * comps[i]; - } - } - createBitmap(kind, width, height, src) { - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d"); - let imgData; - if (kind === ImageKind.RGBA_32BPP) { - imgData = new ImageData(src, width, height); - } else { - imgData = ctx.createImageData(width, height); - convertToRGBA({ - kind, - src, - dest: new Uint32Array(imgData.data.buffer), - width, - height, - inverseDecode: this.needsDecode - }); - } - ctx.putImageData(imgData, 0, 0); - const bitmap = canvas.transferToImageBitmap(); - return { - data: null, - width, - height, - bitmap, - interpolate: this.interpolate - }; - } - async #getImage(width, height) { - const bitmap = await this.image.getTransferableImage(); - if (!bitmap) { - return null; - } - return { - data: null, - width, - height, - bitmap, - interpolate: this.interpolate - }; - } - async getImageBytes(length, { - drawWidth, - drawHeight, - forceRGBA = false, - forceRGB = false, - internal = false - }) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGBA = !!forceRGBA; - this.image.forceRGB = !!forceRGB; - const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); - if (internal || this.image instanceof DecodeStream) { - return imageBytes; - } - assert(imageBytes instanceof Uint8Array, 'PDFImage.getImageBytes: Unsupported "imageBytes" type.'); - return new Uint8Array(imageBytes); - } -} - -;// ./src/core/evaluator.js - - - - - - - - - - - - - - - - - - - - - - - - - - -const DefaultPartialEvaluatorOptions = Object.freeze({ - maxImageSize: -1, - disableFontFace: false, - ignoreErrors: false, - isEvalSupported: true, - isOffscreenCanvasSupported: false, - isImageDecoderSupported: false, - canvasMaxAreaInBytes: -1, - fontExtraProperties: false, - useSystemFonts: true, - useWasm: true, - useWorkerFetch: true, - cMapUrl: null, - iccUrl: null, - standardFontDataUrl: null, - wasmUrl: null -}); -const PatternType = { - TILING: 1, - SHADING: 2 -}; -const TEXT_CHUNK_BATCH_SIZE = 10; -const deferred = Promise.resolve(); -function normalizeBlendMode(value, parsingArray = false) { - if (Array.isArray(value)) { - for (const val of value) { - const maybeBM = normalizeBlendMode(val, true); - if (maybeBM) { - return maybeBM; - } - } - warn(`Unsupported blend mode Array: ${value}`); - return "source-over"; - } - if (!(value instanceof Name)) { - if (parsingArray) { - return null; - } - return "source-over"; - } - switch (value.name) { - case "Normal": - case "Compatible": - return "source-over"; - case "Multiply": - return "multiply"; - case "Screen": - return "screen"; - case "Overlay": - return "overlay"; - case "Darken": - return "darken"; - case "Lighten": - return "lighten"; - case "ColorDodge": - return "color-dodge"; - case "ColorBurn": - return "color-burn"; - case "HardLight": - return "hard-light"; - case "SoftLight": - return "soft-light"; - case "Difference": - return "difference"; - case "Exclusion": - return "exclusion"; - case "Hue": - return "hue"; - case "Saturation": - return "saturation"; - case "Color": - return "color"; - case "Luminosity": - return "luminosity"; - } - if (parsingArray) { - return null; - } - warn(`Unsupported blend mode: ${value.name}`); - return "source-over"; -} -function addCachedImageOps(opList, { - objId, - fn, - args, - optionalContent, - hasMask -}) { - if (objId) { - opList.addDependency(objId); - } - opList.addImageOps(fn, args, optionalContent, hasMask); - if (fn === OPS.paintImageMaskXObject && args[0]?.count > 0) { - args[0].count++; - } -} -class TimeSlotManager { - static TIME_SLOT_DURATION_MS = 20; - static CHECK_TIME_EVERY = 100; - constructor() { - this.reset(); - } - check() { - if (++this.checked < TimeSlotManager.CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - } - reset() { - this.endTime = Date.now() + TimeSlotManager.TIME_SLOT_DURATION_MS; - this.checked = 0; - } -} -class PartialEvaluator { - constructor({ - xref, - handler, - pageIndex, - idFactory, - fontCache, - builtInCMapCache, - standardFontDataCache, - globalColorSpaceCache, - globalImageCache, - systemFontCache, - options = null - }) { - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.idFactory = idFactory; - this.fontCache = fontCache; - this.builtInCMapCache = builtInCMapCache; - this.standardFontDataCache = standardFontDataCache; - this.globalColorSpaceCache = globalColorSpaceCache; - this.globalImageCache = globalImageCache; - this.systemFontCache = systemFontCache; - this.options = options || DefaultPartialEvaluatorOptions; - this.type3FontRefs = null; - this._regionalImageCache = new RegionalImageCache(); - this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); - } - get _pdfFunctionFactory() { - const pdfFunctionFactory = new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.options.isEvalSupported - }); - return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); - } - get parsingType3Font() { - return !!this.type3FontRefs; - } - clone(newOptions = null) { - const newEvaluator = Object.create(this); - newEvaluator.options = Object.assign(Object.create(null), this.options, newOptions); - return newEvaluator; - } - hasBlendModes(resources, nonBlendModesSet) { - if (!(resources instanceof Dict)) { - return false; - } - if (resources.objId && nonBlendModesSet.has(resources.objId)) { - return false; - } - const processed = new RefSet(nonBlendModesSet); - if (resources.objId) { - processed.put(resources.objId); - } - const nodes = [resources], - xref = this.xref; - while (nodes.length) { - const node = nodes.shift(); - const graphicStates = node.get("ExtGState"); - if (graphicStates instanceof Dict) { - for (let graphicState of graphicStates.getRawValues()) { - if (graphicState instanceof Ref) { - if (processed.has(graphicState)) { - continue; - } - try { - graphicState = xref.fetch(graphicState); - } catch (ex) { - processed.put(graphicState); - info(`hasBlendModes - ignoring ExtGState: "${ex}".`); - continue; - } - } - if (!(graphicState instanceof Dict)) { - continue; - } - if (graphicState.objId) { - processed.put(graphicState.objId); - } - const bm = graphicState.get("BM"); - if (bm instanceof Name) { - if (bm.name !== "Normal") { - return true; - } - continue; - } - if (bm !== undefined && Array.isArray(bm)) { - for (const element of bm) { - if (element instanceof Name && element.name !== "Normal") { - return true; - } - } - } - } - } - const xObjects = node.get("XObject"); - if (!(xObjects instanceof Dict)) { - continue; - } - for (let xObject of xObjects.getRawValues()) { - if (xObject instanceof Ref) { - if (processed.has(xObject)) { - continue; - } - try { - xObject = xref.fetch(xObject); - } catch (ex) { - processed.put(xObject); - info(`hasBlendModes - ignoring XObject: "${ex}".`); - continue; - } - } - if (!(xObject instanceof BaseStream)) { - continue; - } - if (xObject.dict.objId) { - processed.put(xObject.dict.objId); - } - const xResources = xObject.dict.get("Resources"); - if (!(xResources instanceof Dict)) { - continue; - } - if (xResources.objId && processed.has(xResources.objId)) { - continue; - } - nodes.push(xResources); - if (xResources.objId) { - processed.put(xResources.objId); - } - } - } - for (const ref of processed) { - nonBlendModesSet.put(ref); - } - return false; - } - async fetchBuiltInCMap(name) { - const cachedData = this.builtInCMapCache.get(name); - if (cachedData) { - return cachedData; - } - let data; - if (this.options.useWorkerFetch) { - data = { - cMapData: await fetchBinaryData(`${this.options.cMapUrl}${name}.bcmap`), - isCompressed: true - }; - } else { - data = await this.handler.sendWithPromise("FetchBinaryData", { - type: "cMapReaderFactory", - name - }); - } - this.builtInCMapCache.set(name, data); - return data; - } - async fetchStandardFontData(name) { - const cachedData = this.standardFontDataCache.get(name); - if (cachedData) { - return new Stream(cachedData); - } - if (this.options.useSystemFonts && name !== "Symbol" && name !== "ZapfDingbats") { - return null; - } - const standardFontNameToFileName = getFontNameToFileMap(), - filename = standardFontNameToFileName[name]; - let data; - try { - if (this.options.useWorkerFetch) { - data = await fetchBinaryData(`${this.options.standardFontDataUrl}${filename}`); - } else { - data = await this.handler.sendWithPromise("FetchBinaryData", { - type: "standardFontDataFactory", - filename - }); - } - } catch (ex) { - warn(ex); - return null; - } - this.standardFontDataCache.set(name, data); - return new Stream(data); - } - async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache, seenRefs) { - const { - dict - } = xobj; - const matrix = lookupMatrix(dict.getArray("Matrix"), null); - const bbox = lookupNormalRect(dict.getArray("BBox"), null); - let optionalContent, groupOptions; - if (dict.has("OC")) { - optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); - } - if (optionalContent !== undefined) { - operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); - } - const group = dict.get("Group"); - if (group) { - groupOptions = { - matrix, - bbox, - smask, - isolated: false, - knockout: false - }; - const groupSubtype = group.get("S"); - let colorSpace = null; - if (isName(groupSubtype, "Transparency")) { - groupOptions.isolated = group.get("I") || false; - groupOptions.knockout = group.get("K") || false; - if (group.has("CS")) { - const cs = this._getColorSpace(group.getRaw("CS"), resources, localColorSpaceCache); - colorSpace = cs instanceof ColorSpace ? cs : await this._handleColorSpace(cs); - } - } - if (smask?.backdrop) { - colorSpace ||= ColorSpaceUtils.rgb; - smask.backdrop = colorSpace.getRgbHex(smask.backdrop, 0); - } - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - const f32matrix = matrix && new Float32Array(matrix); - const f32bbox = !group && bbox && new Float32Array(bbox) || null; - const args = [f32matrix, f32bbox]; - operatorList.addOp(OPS.paintFormXObjectBegin, args); - const localResources = dict.get("Resources"); - await this.getOperatorList({ - stream: xobj, - task, - resources: localResources instanceof Dict ? localResources : resources, - operatorList, - initialState, - prevRefs: seenRefs - }); - operatorList.addOp(OPS.paintFormXObjectEnd, []); - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - if (optionalContent !== undefined) { - operatorList.addOp(OPS.endMarkedContent, []); - } - } - _sendImgData(objId, imgData, cacheGlobally = false) { - const transfers = imgData ? [imgData.bitmap || imgData.data.buffer] : null; - if (this.parsingType3Font || cacheGlobally) { - return this.handler.send("commonobj", [objId, "Image", imgData], transfers); - } - return this.handler.send("obj", [objId, this.pageIndex, "Image", imgData], transfers); - } - async buildPaintImageXObject({ - resources, - image, - isInline = false, - operatorList, - cacheKey, - localImageCache, - localColorSpaceCache - }) { - const { - maxImageSize, - ignoreErrors, - isOffscreenCanvasSupported - } = this.options; - const { - dict - } = image; - const imageRef = dict.objId; - const w = dict.get("W", "Width"); - const h = dict.get("H", "Height"); - if (!(w && typeof w === "number") || !(h && typeof h === "number")) { - warn("Image dimensions are missing, or not numbers."); - return; - } - if (maxImageSize !== -1 && w * h > maxImageSize) { - const msg = "Image exceeded maximum allowed size and was removed."; - if (!ignoreErrors) { - throw new Error(msg); - } - warn(msg); - return; - } - let optionalContent; - if (dict.has("OC")) { - optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); - } - const imageMask = dict.get("IM", "ImageMask") || false; - let imgData, fn, args; - if (imageMask) { - imgData = await PDFImage.createMask({ - image, - isOffscreenCanvasSupported: isOffscreenCanvasSupported && !this.parsingType3Font - }); - if (imgData.isSingleOpaquePixel) { - fn = OPS.paintSolidColorImageMask; - args = []; - operatorList.addImageOps(fn, args, optionalContent); - if (cacheKey) { - const cacheData = { - fn, - args, - optionalContent - }; - localImageCache.set(cacheKey, imageRef, cacheData); - if (imageRef) { - this._regionalImageCache.set(null, imageRef, cacheData); - } - } - return; - } - if (this.parsingType3Font) { - args = compileType3Glyph(imgData); - if (args) { - operatorList.addImageOps(OPS.constructPath, args, optionalContent); - return; - } - warn("Cannot compile Type3 glyph."); - operatorList.addImageOps(OPS.paintImageMaskXObject, [imgData], optionalContent); - return; - } - const objId = `mask_${this.idFactory.createObjId()}`; - operatorList.addDependency(objId); - imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; - this._sendImgData(objId, imgData); - fn = OPS.paintImageMaskXObject; - args = [{ - data: objId, - width: imgData.width, - height: imgData.height, - interpolate: imgData.interpolate, - count: 1 - }]; - operatorList.addImageOps(fn, args, optionalContent); - if (cacheKey) { - const cacheData = { - objId, - fn, - args, - optionalContent - }; - localImageCache.set(cacheKey, imageRef, cacheData); - if (imageRef) { - this._regionalImageCache.set(null, imageRef, cacheData); - } - } - return; - } - const SMALL_IMAGE_DIMENSIONS = 200; - const hasMask = dict.has("SMask") || dict.has("Mask"); - if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) { - try { - const imageObj = new PDFImage({ - xref: this.xref, - res: resources, - image, - isInline, - pdfFunctionFactory: this._pdfFunctionFactory, - globalColorSpaceCache: this.globalColorSpaceCache, - localColorSpaceCache - }); - imgData = await imageObj.createImageData(true, false); - operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); - } catch (reason) { - const msg = `Unable to decode inline image: "${reason}".`; - if (!ignoreErrors) { - throw new Error(msg); - } - warn(msg); - } - return; - } - let objId = `img_${this.idFactory.createObjId()}`, - cacheGlobally = false, - globalCacheData = null; - if (this.parsingType3Font) { - objId = `${this.idFactory.getDocId()}_type3_${objId}`; - } else if (cacheKey && imageRef) { - cacheGlobally = this.globalImageCache.shouldCache(imageRef, this.pageIndex); - if (cacheGlobally) { - assert(!isInline, "Cannot cache an inline image globally."); - objId = `${this.idFactory.getDocId()}_${objId}`; - } - } - operatorList.addDependency(objId); - fn = OPS.paintImageXObject; - args = [objId, w, h]; - operatorList.addImageOps(fn, args, optionalContent, hasMask); - if (cacheGlobally) { - globalCacheData = { - objId, - fn, - args, - optionalContent, - hasMask, - byteSize: 0 - }; - if (this.globalImageCache.hasDecodeFailed(imageRef)) { - this.globalImageCache.setData(imageRef, globalCacheData); - this._sendImgData(objId, null, cacheGlobally); - return; - } - if (w * h > 250000 || hasMask) { - const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { - imageRef - }]); - if (localLength) { - this.globalImageCache.setData(imageRef, globalCacheData); - this.globalImageCache.addByteSize(imageRef, localLength); - return; - } - } - } - PDFImage.buildImage({ - xref: this.xref, - res: resources, - image, - isInline, - pdfFunctionFactory: this._pdfFunctionFactory, - globalColorSpaceCache: this.globalColorSpaceCache, - localColorSpaceCache - }).then(async imageObj => { - imgData = await imageObj.createImageData(false, isOffscreenCanvasSupported); - imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; - imgData.ref = imageRef; - if (cacheGlobally) { - this.globalImageCache.addByteSize(imageRef, imgData.dataLen); - } - return this._sendImgData(objId, imgData, cacheGlobally); - }).catch(reason => { - warn(`Unable to decode image "${objId}": "${reason}".`); - if (imageRef) { - this.globalImageCache.addDecodeFailed(imageRef); - } - return this._sendImgData(objId, null, cacheGlobally); - }); - if (cacheKey) { - const cacheData = { - objId, - fn, - args, - optionalContent, - hasMask - }; - localImageCache.set(cacheKey, imageRef, cacheData); - if (imageRef) { - this._regionalImageCache.set(null, imageRef, cacheData); - if (cacheGlobally) { - assert(globalCacheData, "The global cache-data must be available."); - this.globalImageCache.setData(imageRef, globalCacheData); - } - } - } - } - handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs) { - const smaskContent = smask.get("G"); - const smaskOptions = { - subtype: smask.get("S").name, - backdrop: smask.get("BC") - }; - const transferObj = smask.get("TR"); - if (isPDFFunction(transferObj)) { - const transferFn = this._pdfFunctionFactory.create(transferObj); - const transferMap = new Uint8Array(256); - const tmp = new Float32Array(1); - for (let i = 0; i < 256; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = tmp[0] * 255 | 0; - } - smaskOptions.transferMap = transferMap; - } - return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone({ - newPath: true - }), localColorSpaceCache, seenRefs); - } - handleTransferFunction(tr) { - let transferArray; - if (Array.isArray(tr)) { - transferArray = tr; - } else if (isPDFFunction(tr)) { - transferArray = [tr]; - } else { - return null; - } - const transferMaps = []; - let numFns = 0, - numEffectfulFns = 0; - for (const entry of transferArray) { - const transferObj = this.xref.fetchIfRef(entry); - numFns++; - if (isName(transferObj, "Identity")) { - transferMaps.push(null); - continue; - } else if (!isPDFFunction(transferObj)) { - return null; - } - const transferFn = this._pdfFunctionFactory.create(transferObj); - const transferMap = new Uint8Array(256), - tmp = new Float32Array(1); - for (let j = 0; j < 256; j++) { - tmp[0] = j / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[j] = tmp[0] * 255 | 0; - } - transferMaps.push(transferMap); - numEffectfulFns++; - } - if (!(numFns === 1 || numFns === 4)) { - return null; - } - if (numEffectfulFns === 0) { - return null; - } - return transferMaps; - } - handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { - const tilingOpList = new OperatorList(); - const patternResources = Dict.merge({ - xref: this.xref, - dictArray: [patternDict.get("Resources"), resources] - }); - return this.getOperatorList({ - stream: pattern, - task, - resources: patternResources, - operatorList: tilingOpList - }).then(function () { - const operatorListIR = tilingOpList.getIR(); - const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color); - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, tilingPatternIR); - if (patternDict.objId) { - localTilingPatternCache.set(null, patternDict.objId, { - operatorListIR, - dict: patternDict - }); - } - }).catch(reason => { - if (reason instanceof AbortException) { - return; - } - if (this.options.ignoreErrors) { - warn(`handleTilingType - ignoring pattern: "${reason}".`); - return; - } - throw reason; - }); - } - async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) { - const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; - const translated = await this.loadFont(fontName, fontRef, resources, task, fallbackFontDict, cssFontInfo); - if (translated.font.isType3Font) { - operatorList.addDependencies(translated.type3Dependencies); - } - state.font = translated.font; - translated.send(this.handler); - return translated.loadedName; - } - handleText(chars, state) { - const font = state.font; - const glyphs = font.charsToGlyphs(chars); - if (font.data) { - const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); - if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace) { - PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); - } - } - return glyphs; - } - ensureStateFont(state) { - if (state.font) { - return; - } - const reason = new FormatError("Missing setFont (Tf) operator before text rendering operator."); - if (this.options.ignoreErrors) { - warn(`ensureStateFont: "${reason}".`); - return; - } - throw reason; - } - async setGState({ - resources, - gState, - operatorList, - cacheKey, - task, - stateManager, - localGStateCache, - localColorSpaceCache, - seenRefs - }) { - const gStateRef = gState.objId; - let isSimpleGState = true; - const gStateObj = []; - let promise = Promise.resolve(); - for (const [key, value] of gState) { - switch (key) { - case "Type": - break; - case "LW": - if (typeof value !== "number") { - warn(`Invalid LW (line width): ${value}`); - break; - } - gStateObj.push([key, Math.abs(value)]); - break; - case "LC": - case "LJ": - case "ML": - case "D": - case "RI": - case "FL": - case "CA": - case "ca": - gStateObj.push([key, value]); - break; - case "Font": - isSimpleGState = false; - promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - })); - break; - case "BM": - gStateObj.push([key, normalizeBlendMode(value)]); - break; - case "SMask": - if (isName(value, "None")) { - gStateObj.push([key, false]); - break; - } - if (value instanceof Dict) { - isSimpleGState = false; - promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs)); - gStateObj.push([key, true]); - } else { - warn("Unsupported SMask type"); - } - break; - case "TR": - const transferMaps = this.handleTransferFunction(value); - gStateObj.push([key, transferMaps]); - break; - case "OP": - case "op": - case "OPM": - case "BG": - case "BG2": - case "UCR": - case "UCR2": - case "TR2": - case "HT": - case "SM": - case "SA": - case "AIS": - case "TK": - info("graphic state operator " + key); - break; - default: - info("Unknown graphic state operator " + key); - break; - } - } - await promise; - if (gStateObj.length > 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - if (isSimpleGState) { - localGStateCache.set(cacheKey, gStateRef, gStateObj); - } - } - loadFont(fontName, font, resources, task, fallbackFontDict = null, cssFontInfo = null) { - const errorFont = async () => new TranslatedFont({ - loadedName: "g_font_error", - font: new ErrorFont(`Font "${fontName}" is not available.`), - dict: font - }); - let fontRef; - if (font) { - if (font instanceof Ref) { - fontRef = font; - } - } else { - const fontRes = resources.get("Font"); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } - } - if (fontRef) { - if (this.type3FontRefs?.has(fontRef)) { - return errorFont(); - } - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - try { - font = this.xref.fetchIfRef(fontRef); - } catch (ex) { - warn(`loadFont - lookup failed: "${ex}".`); - } - } - if (!(font instanceof Dict)) { - if (!this.options.ignoreErrors && !this.parsingType3Font) { - warn(`Font "${fontName}" is not available.`); - return errorFont(); - } - warn(`Font "${fontName}" is not available -- attempting to fallback to a default font.`); - font = fallbackFontDict || PartialEvaluator.fallbackFontDict; - } - if (font.cacheKey && this.fontCache.has(font.cacheKey)) { - return this.fontCache.get(font.cacheKey); - } - const { - promise, - resolve - } = Promise.withResolvers(); - let preEvaluatedFont; - try { - preEvaluatedFont = this.preEvaluateFont(font); - preEvaluatedFont.cssFontInfo = cssFontInfo; - } catch (reason) { - warn(`loadFont - preEvaluateFont failed: "${reason}".`); - return errorFont(); - } - const { - descriptor, - hash - } = preEvaluatedFont; - const fontRefIsRef = fontRef instanceof Ref; - let fontID; - if (hash && descriptor instanceof Dict) { - const fontAliases = descriptor.fontAliases ||= Object.create(null); - if (fontAliases[hash]) { - const aliasFontRef = fontAliases[hash].aliasRef; - if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } else { - fontAliases[hash] = { - fontID: this.idFactory.createFontId() - }; - } - if (fontRefIsRef) { - fontAliases[hash].aliasRef = fontRef; - } - fontID = fontAliases[hash].fontID; - } else { - fontID = this.idFactory.createFontId(); - } - assert(fontID?.startsWith("f"), 'The "fontID" must be (correctly) defined.'); - if (fontRefIsRef) { - this.fontCache.put(fontRef, promise); - } else { - font.cacheKey = `cacheKey_${fontID}`; - this.fontCache.put(font.cacheKey, promise); - } - font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; - this.translateFont(preEvaluatedFont).then(async translatedFont => { - const translated = new TranslatedFont({ - loadedName: font.loadedName, - font: translatedFont, - dict: font - }); - if (translatedFont.isType3Font) { - try { - await translated.loadType3Data(this, resources, task); - } catch (reason) { - throw new Error(`Type3 font load error: ${reason}`); - } - } - resolve(translated); - }).catch(reason => { - warn(`loadFont - translateFont failed: "${reason}".`); - resolve(new TranslatedFont({ - loadedName: font.loadedName, - font: new ErrorFont(reason?.message), - dict: font - })); - }); - return promise; - } - buildPath(fn, args, state) { - const { - pathMinMax: minMax, - pathBuffer - } = state; - switch (fn | 0) { - case OPS.rectangle: - { - const x = state.currentPointX = args[0]; - const y = state.currentPointY = args[1]; - const width = args[2]; - const height = args[3]; - const xw = x + width; - const yh = y + height; - if (width === 0 || height === 0) { - pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, yh, DrawOPS.closePath); - } else { - pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, y, DrawOPS.lineTo, xw, yh, DrawOPS.lineTo, x, yh, DrawOPS.closePath); - } - Util.rectBoundingBox(x, y, xw, yh, minMax); - break; - } - case OPS.moveTo: - { - const x = state.currentPointX = args[0]; - const y = state.currentPointY = args[1]; - pathBuffer.push(DrawOPS.moveTo, x, y); - Util.pointBoundingBox(x, y, minMax); - break; - } - case OPS.lineTo: - { - const x = state.currentPointX = args[0]; - const y = state.currentPointY = args[1]; - pathBuffer.push(DrawOPS.lineTo, x, y); - Util.pointBoundingBox(x, y, minMax); - break; - } - case OPS.curveTo: - { - const startX = state.currentPointX; - const startY = state.currentPointY; - const [x1, y1, x2, y2, x, y] = args; - state.currentPointX = x; - state.currentPointY = y; - pathBuffer.push(DrawOPS.curveTo, x1, y1, x2, y2, x, y); - Util.bezierBoundingBox(startX, startY, x1, y1, x2, y2, x, y, minMax); - break; - } - case OPS.curveTo2: - { - const startX = state.currentPointX; - const startY = state.currentPointY; - const [x1, y1, x, y] = args; - state.currentPointX = x; - state.currentPointY = y; - pathBuffer.push(DrawOPS.curveTo, startX, startY, x1, y1, x, y); - Util.bezierBoundingBox(startX, startY, startX, startY, x1, y1, x, y, minMax); - break; - } - case OPS.curveTo3: - { - const startX = state.currentPointX; - const startY = state.currentPointY; - const [x1, y1, x, y] = args; - state.currentPointX = x; - state.currentPointY = y; - pathBuffer.push(DrawOPS.curveTo, x1, y1, x, y, x, y); - Util.bezierBoundingBox(startX, startY, x1, y1, x, y, x, y, minMax); - break; - } - case OPS.closePath: - pathBuffer.push(DrawOPS.closePath); - break; - } - } - _getColorSpace(cs, resources, localColorSpaceCache) { - return ColorSpaceUtils.parse({ - cs, - xref: this.xref, - resources, - pdfFunctionFactory: this._pdfFunctionFactory, - globalColorSpaceCache: this.globalColorSpaceCache, - localColorSpaceCache, - asyncIfNotCached: true - }); - } - async _handleColorSpace(csPromise) { - try { - return await csPromise; - } catch (ex) { - if (ex instanceof AbortException) { - return null; - } - if (this.options.ignoreErrors) { - warn(`_handleColorSpace - ignoring ColorSpace: "${ex}".`); - return null; - } - throw ex; - } - } - parseShading({ - shading, - resources, - localColorSpaceCache, - localShadingPatternCache - }) { - let id = localShadingPatternCache.get(shading); - if (id) { - return id; - } - let patternIR; - try { - const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, this.globalColorSpaceCache, localColorSpaceCache); - patternIR = shadingFill.getIR(); - } catch (reason) { - if (reason instanceof AbortException) { - return null; - } - if (this.options.ignoreErrors) { - warn(`parseShading - ignoring shading: "${reason}".`); - localShadingPatternCache.set(shading, null); - return null; - } - throw reason; - } - id = `pattern_${this.idFactory.createObjId()}`; - if (this.parsingType3Font) { - id = `${this.idFactory.getDocId()}_type3_${id}`; - } - localShadingPatternCache.set(shading, id); - if (this.parsingType3Font) { - this.handler.send("commonobj", [id, "Pattern", patternIR]); - } else { - this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); - } - return id; - } - handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { - const patternName = args.pop(); - if (patternName instanceof Name) { - const rawPattern = patterns.getRaw(patternName.name); - const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern); - if (localTilingPattern) { - try { - const color = cs.base ? cs.base.getRgbHex(args, 0) : null; - const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color); - operatorList.addOp(fn, tilingPatternIR); - return undefined; - } catch {} - } - const pattern = this.xref.fetchIfRef(rawPattern); - if (pattern) { - const dict = pattern instanceof BaseStream ? pattern.dict : pattern; - const typeNum = dict.get("PatternType"); - if (typeNum === PatternType.TILING) { - const color = cs.base ? cs.base.getRgbHex(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); - } else if (typeNum === PatternType.SHADING) { - const shading = dict.get("Shading"); - const objId = this.parseShading({ - shading, - resources, - localColorSpaceCache, - localShadingPatternCache - }); - if (objId) { - const matrix = lookupMatrix(dict.getArray("Matrix"), null); - operatorList.addOp(fn, ["Shading", objId, matrix]); - } - return undefined; - } - throw new FormatError(`Unknown PatternType: ${typeNum}`); - } - } - throw new FormatError(`Unknown PatternName: ${patternName}`); - } - _parseVisibilityExpression(array, nestingCounter, currentResult) { - const MAX_NESTING = 10; - if (++nestingCounter > MAX_NESTING) { - warn("Visibility expression is too deeply nested"); - return; - } - const length = array.length; - const operator = this.xref.fetchIfRef(array[0]); - if (length < 2 || !(operator instanceof Name)) { - warn("Invalid visibility expression"); - return; - } - switch (operator.name) { - case "And": - case "Or": - case "Not": - currentResult.push(operator.name); - break; - default: - warn(`Invalid operator ${operator.name} in visibility expression`); - return; - } - for (let i = 1; i < length; i++) { - const raw = array[i]; - const object = this.xref.fetchIfRef(raw); - if (Array.isArray(object)) { - const nestedResult = []; - currentResult.push(nestedResult); - this._parseVisibilityExpression(object, nestingCounter, nestedResult); - } else if (raw instanceof Ref) { - currentResult.push(raw.toString()); - } - } - } - async parseMarkedContentProps(contentProperties, resources) { - let optionalContent; - if (contentProperties instanceof Name) { - const properties = resources.get("Properties"); - optionalContent = properties.get(contentProperties.name); - } else if (contentProperties instanceof Dict) { - optionalContent = contentProperties; - } else { - throw new FormatError("Optional content properties malformed."); - } - const optionalContentType = optionalContent.get("Type")?.name; - if (optionalContentType === "OCG") { - return { - type: optionalContentType, - id: optionalContent.objId - }; - } else if (optionalContentType === "OCMD") { - const expression = optionalContent.get("VE"); - if (Array.isArray(expression)) { - const result = []; - this._parseVisibilityExpression(expression, 0, result); - if (result.length > 0) { - return { - type: "OCMD", - expression: result - }; - } - } - const optionalContentGroups = optionalContent.get("OCGs"); - if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { - const groupIds = []; - if (Array.isArray(optionalContentGroups)) { - for (const ocg of optionalContentGroups) { - groupIds.push(ocg.toString()); - } - } else { - groupIds.push(optionalContentGroups.objId); - } - return { - type: optionalContentType, - ids: groupIds, - policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null, - expression: null - }; - } else if (optionalContentGroups instanceof Ref) { - return { - type: optionalContentType, - id: optionalContentGroups.toString() - }; - } - } - return null; - } - getOperatorList({ - stream, - task, - resources, - operatorList, - initialState = null, - fallbackFontDict = null, - prevRefs = null - }) { - const objId = stream.dict?.objId; - const seenRefs = new RefSet(prevRefs); - if (objId) { - if (prevRefs?.has(objId)) { - throw new Error(`getOperatorList - ignoring circular reference: ${objId}`); - } - seenRefs.put(objId); - } - resources ||= Dict.empty; - initialState ||= new EvalState(); - if (!operatorList) { - throw new Error('getOperatorList: missing "operatorList" parameter'); - } - const self = this; - const xref = this.xref; - const localImageCache = new LocalImageCache(); - const localColorSpaceCache = new LocalColorSpaceCache(); - const localGStateCache = new LocalGStateCache(); - const localTilingPatternCache = new LocalTilingPatternCache(); - const localShadingPatternCache = new Map(); - const xobjs = resources.get("XObject") || Dict.empty; - const patterns = resources.get("Pattern") || Dict.empty; - const stateManager = new StateManager(initialState); - const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - const timeSlotManager = new TimeSlotManager(); - function closePendingRestoreOPS(argument) { - for (let i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - } - return new Promise(function promiseBody(resolve, reject) { - const next = function (promise) { - Promise.all([promise, operatorList.ready]).then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - const operation = {}; - let stop, i, ii, cs, name, isValidName; - while (!(stop = timeSlotManager.check())) { - operation.args = null; - if (!preprocessor.read(operation)) { - break; - } - let args = operation.args; - let fn = operation.fn; - switch (fn | 0) { - case OPS.paintXObject: - isValidName = args[0] instanceof Name; - name = args[0].name; - if (isValidName) { - const localImage = localImageCache.getByName(name); - if (localImage) { - addCachedImageOps(operatorList, localImage); - args = null; - continue; - } - } - next(new Promise(function (resolveXObject, rejectXObject) { - if (!isValidName) { - throw new FormatError("XObject must be referred to by name."); - } - let xobj = xobjs.getRaw(name); - if (xobj instanceof Ref) { - const cachedImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj) || self.globalImageCache.getData(xobj, self.pageIndex); - if (cachedImage) { - addCachedImageOps(operatorList, cachedImage); - resolveXObject(); - return; - } - xobj = xref.fetch(xobj); - } - if (!(xobj instanceof BaseStream)) { - throw new FormatError("XObject should be a stream"); - } - const type = xobj.dict.get("Subtype"); - if (!(type instanceof Name)) { - throw new FormatError("XObject should have a Name subtype"); - } - if (type.name === "Form") { - stateManager.save(); - self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone({ - newPath: true - }), localColorSpaceCache, seenRefs).then(function () { - stateManager.restore(); - resolveXObject(); - }, rejectXObject); - return; - } else if (type.name === "Image") { - self.buildPaintImageXObject({ - resources, - image: xobj, - operatorList, - cacheKey: name, - localImageCache, - localColorSpaceCache - }).then(resolveXObject, rejectXObject); - return; - } else if (type.name === "PS") { - info("Ignored XObject subtype PS"); - } else { - throw new FormatError(`Unhandled XObject subtype ${type.name}`); - } - resolveXObject(); - }).catch(function (reason) { - if (reason instanceof AbortException) { - return; - } - if (self.options.ignoreErrors) { - warn(`getOperatorList - ignoring XObject: "${reason}".`); - return; - } - throw reason; - })); - return; - case OPS.setFont: - const fontSize = args[1]; - next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - })); - return; - case OPS.endInlineImage: - const cacheKey = args[0].cacheKey; - if (cacheKey) { - const localImage = localImageCache.getByName(cacheKey); - if (localImage) { - addCachedImageOps(operatorList, localImage); - args = null; - continue; - } - } - next(self.buildPaintImageXObject({ - resources, - image: args[0], - isInline: true, - operatorList, - cacheKey, - localImageCache, - localColorSpaceCache - })); - return; - case OPS.showText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - const combinedGlyphs = [], - state = stateManager.state; - for (const arrItem of args[0]) { - if (typeof arrItem === "string") { - combinedGlyphs.push(...self.handleText(arrItem, state)); - } else if (typeof arrItem === "number") { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - case OPS.setFillColorSpace: - { - const fillCS = self._getColorSpace(args[0], resources, localColorSpaceCache); - if (fillCS instanceof ColorSpace) { - stateManager.state.fillColorSpace = fillCS; - continue; - } - next(self._handleColorSpace(fillCS).then(colorSpace => { - stateManager.state.fillColorSpace = colorSpace || ColorSpaceUtils.gray; - })); - return; - } - case OPS.setStrokeColorSpace: - { - const strokeCS = self._getColorSpace(args[0], resources, localColorSpaceCache); - if (strokeCS instanceof ColorSpace) { - stateManager.state.strokeColorSpace = strokeCS; - continue; - } - next(self._handleColorSpace(strokeCS).then(colorSpace => { - stateManager.state.strokeColorSpace = colorSpace || ColorSpaceUtils.gray; - })); - return; - } - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = [cs.getRgbHex(args, 0)]; - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = [cs.getRgbHex(args, 0)]; - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpaceUtils.gray; - args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpaceUtils.gray; - args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpaceUtils.cmyk; - args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpaceUtils.cmyk; - args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpaceUtils.rgb; - args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpaceUtils.rgb; - args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; - break; - case OPS.setFillColorN: - cs = stateManager.state.patternFillColorSpace; - if (!cs) { - if (isNumberArray(args, null)) { - args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; - fn = OPS.setFillRGBColor; - break; - } - args = []; - fn = OPS.setFillTransparent; - break; - } - if (cs.name === "Pattern") { - next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); - return; - } - args = [cs.getRgbHex(args, 0)]; - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.patternStrokeColorSpace; - if (!cs) { - if (isNumberArray(args, null)) { - args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; - fn = OPS.setStrokeRGBColor; - break; - } - args = []; - fn = OPS.setStrokeTransparent; - break; - } - if (cs.name === "Pattern") { - next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); - return; - } - args = [cs.getRgbHex(args, 0)]; - fn = OPS.setStrokeRGBColor; - break; - case OPS.shadingFill: - let shading; - try { - const shadingRes = resources.get("Shading"); - if (!shadingRes) { - throw new FormatError("No shading resource found"); - } - shading = shadingRes.get(args[0].name); - if (!shading) { - throw new FormatError("No shading object found"); - } - } catch (reason) { - if (reason instanceof AbortException) { - continue; - } - if (self.options.ignoreErrors) { - warn(`getOperatorList - ignoring Shading: "${reason}".`); - continue; - } - throw reason; - } - const patternId = self.parseShading({ - shading, - resources, - localColorSpaceCache, - localShadingPatternCache - }); - if (!patternId) { - continue; - } - args = [patternId]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - isValidName = args[0] instanceof Name; - name = args[0].name; - if (isValidName) { - const localGStateObj = localGStateCache.getByName(name); - if (localGStateObj) { - if (localGStateObj.length > 0) { - operatorList.addOp(OPS.setGState, [localGStateObj]); - } - args = null; - continue; - } - } - next(new Promise(function (resolveGState, rejectGState) { - if (!isValidName) { - throw new FormatError("GState must be referred to by name."); - } - const extGState = resources.get("ExtGState"); - if (!(extGState instanceof Dict)) { - throw new FormatError("ExtGState should be a dictionary."); - } - const gState = extGState.get(name); - if (!(gState instanceof Dict)) { - throw new FormatError("GState should be a dictionary."); - } - self.setGState({ - resources, - gState, - operatorList, - cacheKey: name, - task, - stateManager, - localGStateCache, - localColorSpaceCache, - seenRefs - }).then(resolveGState, rejectGState); - }).catch(function (reason) { - if (reason instanceof AbortException) { - return; - } - if (self.options.ignoreErrors) { - warn(`getOperatorList - ignoring ExtGState: "${reason}".`); - return; - } - throw reason; - })); - return; - case OPS.setLineWidth: - { - const [thickness] = args; - if (typeof thickness !== "number") { - warn(`Invalid setLineWidth: ${thickness}`); - continue; - } - args[0] = Math.abs(thickness); - break; - } - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - case OPS.rectangle: - self.buildPath(fn, args, stateManager.state); - continue; - case OPS.stroke: - case OPS.closeStroke: - case OPS.fill: - case OPS.eoFill: - case OPS.fillStroke: - case OPS.eoFillStroke: - case OPS.closeFillStroke: - case OPS.closeEOFillStroke: - case OPS.endPath: - { - const { - state: { - pathBuffer, - pathMinMax - } - } = stateManager; - if (fn === OPS.closeStroke || fn === OPS.closeFillStroke || fn === OPS.closeEOFillStroke) { - pathBuffer.push(DrawOPS.closePath); - } - if (pathBuffer.length === 0) { - operatorList.addOp(OPS.constructPath, [fn, [null], null]); - } else { - operatorList.addOp(OPS.constructPath, [fn, [new Float32Array(pathBuffer)], pathMinMax.slice()]); - pathBuffer.length = 0; - pathMinMax.set([Infinity, Infinity, -Infinity, -Infinity], 0); - } - continue; - } - case OPS.setTextMatrix: - operatorList.addOp(fn, [new Float32Array(args)]); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginCompat: - case OPS.endCompat: - continue; - case OPS.beginMarkedContentProps: - if (!(args[0] instanceof Name)) { - warn(`Expected name for beginMarkedContentProps arg0=${args[0]}`); - operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); - continue; - } - if (args[0].name === "OC") { - next(self.parseMarkedContentProps(args[1], resources).then(data => { - operatorList.addOp(OPS.beginMarkedContentProps, ["OC", data]); - }).catch(reason => { - if (reason instanceof AbortException) { - return; - } - if (self.options.ignoreErrors) { - warn(`getOperatorList - ignoring beginMarkedContentProps: "${reason}".`); - operatorList.addOp(OPS.beginMarkedContentProps, ["OC", null]); - return; - } - throw reason; - })); - return; - } - args = [args[0].name, args[1] instanceof Dict ? args[1].get("MCID") : null]; - break; - case OPS.beginMarkedContent: - case OPS.endMarkedContent: - default: - if (args !== null) { - for (i = 0, ii = args.length; i < ii; i++) { - if (args[i] instanceof Dict) { - break; - } - } - if (i < ii) { - warn("getOperatorList - ignoring operator: " + fn); - continue; - } - } - } - operatorList.addOp(fn, args); - } - if (stop) { - next(deferred); - return; - } - closePendingRestoreOPS(); - resolve(); - }).catch(reason => { - if (reason instanceof AbortException) { - return; - } - if (this.options.ignoreErrors) { - warn(`getOperatorList - ignoring errors during "${task.name}" ` + `task: "${reason}".`); - closePendingRestoreOPS(); - return; - } - throw reason; - }); - } - getTextContent({ - stream, - task, - resources, - stateManager = null, - includeMarkedContent = false, - sink, - seenStyles = new Set(), - viewBox, - lang = null, - markedContentData = null, - disableNormalization = false, - keepWhiteSpace = false, - prevRefs = null, - intersector = null - }) { - const objId = stream.dict?.objId; - const seenRefs = new RefSet(prevRefs); - if (objId) { - if (prevRefs?.has(objId)) { - throw new Error(`getTextContent - ignoring circular reference: ${objId}`); - } - seenRefs.put(objId); - } - resources ||= Dict.empty; - stateManager ||= new StateManager(new TextState()); - if (includeMarkedContent) { - markedContentData ||= { - level: 0 - }; - } - const textContent = { - items: [], - styles: Object.create(null), - lang - }; - const textContentItem = { - initialized: false, - str: [], - totalWidth: 0, - totalHeight: 0, - width: 0, - height: 0, - vertical: false, - prevTransform: null, - textAdvanceScale: 0, - spaceInFlowMin: 0, - spaceInFlowMax: 0, - trackingSpaceMin: Infinity, - negativeSpaceMax: -Infinity, - notASpace: -Infinity, - transform: null, - fontName: null, - hasEOL: false - }; - const twoLastChars = [" ", " "]; - let twoLastCharsPos = 0; - function saveLastChar(char) { - const nextPos = (twoLastCharsPos + 1) % 2; - const ret = twoLastChars[twoLastCharsPos] !== " " && twoLastChars[nextPos] === " "; - twoLastChars[twoLastCharsPos] = char; - twoLastCharsPos = nextPos; - return !keepWhiteSpace && ret; - } - function shouldAddWhitepsace() { - return !keepWhiteSpace && twoLastChars[twoLastCharsPos] !== " " && twoLastChars[(twoLastCharsPos + 1) % 2] === " "; - } - function resetLastChars() { - twoLastChars[0] = twoLastChars[1] = " "; - twoLastCharsPos = 0; - } - const TRACKING_SPACE_FACTOR = 0.102; - const NOT_A_SPACE_FACTOR = 0.03; - const NEGATIVE_SPACE_FACTOR = -0.2; - const SPACE_IN_FLOW_MIN_FACTOR = 0.102; - const SPACE_IN_FLOW_MAX_FACTOR = 0.6; - const VERTICAL_SHIFT_RATIO = 0.25; - const self = this; - const xref = this.xref; - const showSpacedTextBuffer = []; - let xobjs = null; - const emptyXObjectCache = new LocalImageCache(); - const emptyGStateCache = new LocalGStateCache(); - const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - let textState; - function pushWhitespace({ - width = 0, - height = 0, - transform = textContentItem.prevTransform, - fontName = textContentItem.fontName - }) { - intersector?.addExtraChar(" "); - textContent.items.push({ - str: " ", - dir: "ltr", - width, - height, - transform, - fontName, - hasEOL: false - }); - } - function getCurrentTextTransform() { - const font = textState.font; - const tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise]; - if (font.isType3Font && (textState.fontSize <= 1 || font.isCharBBox) && !isArrayEqual(textState.fontMatrix, FONT_IDENTITY_MATRIX)) { - const glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - tsm[3] *= glyphHeight * textState.fontMatrix[3]; - } - } - return Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); - } - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - const { - font, - loadedName - } = textState; - if (!seenStyles.has(loadedName)) { - seenStyles.add(loadedName); - textContent.styles[loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - if (self.options.fontExtraProperties && font.systemFontInfo) { - const style = textContent.styles[loadedName]; - style.fontSubstitution = font.systemFontInfo.css; - style.fontSubstitutionLoadedName = font.systemFontInfo.loadedName; - } - } - textContentItem.fontName = loadedName; - const trm = textContentItem.transform = getCurrentTextTransform(); - if (!font.vertical) { - textContentItem.width = textContentItem.totalWidth = 0; - textContentItem.height = textContentItem.totalHeight = Math.hypot(trm[2], trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = textContentItem.totalWidth = Math.hypot(trm[0], trm[1]); - textContentItem.height = textContentItem.totalHeight = 0; - textContentItem.vertical = true; - } - const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); - const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - const { - fontSize - } = textState; - textContentItem.trackingSpaceMin = fontSize * TRACKING_SPACE_FACTOR; - textContentItem.notASpace = fontSize * NOT_A_SPACE_FACTOR; - textContentItem.negativeSpaceMax = fontSize * NEGATIVE_SPACE_FACTOR; - textContentItem.spaceInFlowMin = fontSize * SPACE_IN_FLOW_MIN_FACTOR; - textContentItem.spaceInFlowMax = fontSize * SPACE_IN_FLOW_MAX_FACTOR; - textContentItem.hasEOL = false; - textContentItem.initialized = true; - return textContentItem; - } - function updateAdvanceScale() { - if (!textContentItem.initialized) { - return; - } - const scaleLineX = Math.hypot(textState.textLineMatrix[0], textState.textLineMatrix[1]); - const scaleCtmX = Math.hypot(textState.ctm[0], textState.ctm[1]); - const scaleFactor = scaleCtmX * scaleLineX; - if (scaleFactor === textContentItem.textAdvanceScale) { - return; - } - if (!textContentItem.vertical) { - textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; - textContentItem.width = 0; - } else { - textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; - textContentItem.height = 0; - } - textContentItem.textAdvanceScale = scaleFactor; - } - function runBidiTransform(textChunk) { - let text = textChunk.str.join(""); - if (!disableNormalization) { - text = normalizeUnicode(text); - } - const bidiResult = bidi(text, -1, textChunk.vertical); - return { - str: bidiResult.str, - dir: bidiResult.dir, - width: Math.abs(textChunk.totalWidth), - height: Math.abs(textChunk.totalHeight), - transform: textChunk.transform, - fontName: textChunk.fontName, - hasEOL: textChunk.hasEOL - }; - } - async function handleSetFont(fontName, fontRef) { - const translated = await self.loadFont(fontName, fontRef, resources, task); - textState.loadedName = translated.loadedName; - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; - } - function applyInverseRotation(x, y, matrix) { - const scale = Math.hypot(matrix[0], matrix[1]); - return [(matrix[0] * x + matrix[1] * y) / scale, (matrix[2] * x + matrix[3] * y) / scale]; - } - function compareWithLastPosition(glyphWidth) { - const currentTransform = getCurrentTextTransform(); - let posX = currentTransform[4]; - let posY = currentTransform[5]; - if (textState.font?.vertical) { - if (posX < viewBox[0] || posX > viewBox[2] || posY + glyphWidth < viewBox[1] || posY > viewBox[3]) { - return false; - } - } else if (posX + glyphWidth < viewBox[0] || posX > viewBox[2] || posY < viewBox[1] || posY > viewBox[3]) { - return false; - } - if (!textState.font || !textContentItem.prevTransform) { - return true; - } - let lastPosX = textContentItem.prevTransform[4]; - let lastPosY = textContentItem.prevTransform[5]; - if (lastPosX === posX && lastPosY === posY) { - return true; - } - let rotate = -1; - if (currentTransform[0] && currentTransform[1] === 0 && currentTransform[2] === 0) { - rotate = currentTransform[0] > 0 ? 0 : 180; - } else if (currentTransform[1] && currentTransform[0] === 0 && currentTransform[3] === 0) { - rotate = currentTransform[1] > 0 ? 90 : 270; - } - switch (rotate) { - case 0: - break; - case 90: - [posX, posY] = [posY, posX]; - [lastPosX, lastPosY] = [lastPosY, lastPosX]; - break; - case 180: - [posX, posY, lastPosX, lastPosY] = [-posX, -posY, -lastPosX, -lastPosY]; - break; - case 270: - [posX, posY] = [-posY, -posX]; - [lastPosX, lastPosY] = [-lastPosY, -lastPosX]; - break; - default: - [posX, posY] = applyInverseRotation(posX, posY, currentTransform); - [lastPosX, lastPosY] = applyInverseRotation(lastPosX, lastPosY, textContentItem.prevTransform); - } - if (textState.font.vertical) { - const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; - const advanceX = posX - lastPosX; - const textOrientation = Math.sign(textContentItem.height); - if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { - if (Math.abs(advanceX) > 0.5 * textContentItem.width) { - appendEOL(); - return true; - } - resetLastChars(); - flushTextContentItem(); - return true; - } - if (Math.abs(advanceX) > textContentItem.width) { - appendEOL(); - return true; - } - if (advanceY <= textOrientation * textContentItem.notASpace) { - resetLastChars(); - } - if (advanceY <= textOrientation * textContentItem.trackingSpaceMin) { - if (shouldAddWhitepsace()) { - resetLastChars(); - flushTextContentItem(); - pushWhitespace({ - height: Math.abs(advanceY) - }); - } else { - textContentItem.height += advanceY; - } - } else if (!addFakeSpaces(advanceY, textContentItem.prevTransform, textOrientation)) { - if (textContentItem.str.length === 0) { - resetLastChars(); - pushWhitespace({ - height: Math.abs(advanceY) - }); - } else { - textContentItem.height += advanceY; - } - } - if (Math.abs(advanceX) > textContentItem.width * VERTICAL_SHIFT_RATIO) { - flushTextContentItem(); - } - return true; - } - const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; - const advanceY = posY - lastPosY; - const textOrientation = Math.sign(textContentItem.width); - if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { - if (Math.abs(advanceY) > 0.5 * textContentItem.height) { - appendEOL(); - return true; - } - resetLastChars(); - flushTextContentItem(); - return true; - } - if (Math.abs(advanceY) > textContentItem.height) { - appendEOL(); - return true; - } - if (advanceX <= textOrientation * textContentItem.notASpace) { - resetLastChars(); - } - if (advanceX <= textOrientation * textContentItem.trackingSpaceMin) { - if (shouldAddWhitepsace()) { - resetLastChars(); - flushTextContentItem(); - pushWhitespace({ - width: Math.abs(advanceX) - }); - } else { - textContentItem.width += advanceX; - } - } else if (!addFakeSpaces(advanceX, textContentItem.prevTransform, textOrientation)) { - if (textContentItem.str.length === 0) { - resetLastChars(); - pushWhitespace({ - width: Math.abs(advanceX) - }); - } else { - textContentItem.width += advanceX; - } - } - if (Math.abs(advanceY) > textContentItem.height * VERTICAL_SHIFT_RATIO) { - flushTextContentItem(); - } - return true; - } - function buildTextContentItem({ - chars, - extraSpacing - }) { - const font = textState.font; - if (!chars) { - const charSpacing = textState.charSpacing + extraSpacing; - if (charSpacing) { - if (!font.vertical) { - textState.translateTextMatrix(charSpacing * textState.textHScale, 0); - } else { - textState.translateTextMatrix(0, -charSpacing); - } - } - if (keepWhiteSpace) { - compareWithLastPosition(0); - } - return; - } - const glyphs = font.charsToGlyphs(chars); - const scale = textState.fontMatrix[0] * textState.fontSize; - for (let i = 0, ii = glyphs.length; i < ii; i++) { - const glyph = glyphs[i]; - const { - category - } = glyph; - if (category.isInvisibleFormatMark) { - continue; - } - let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); - let glyphWidth = glyph.width; - if (font.vertical) { - glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; - } - let scaledDim = glyphWidth * scale; - if (!keepWhiteSpace && category.isWhitespace) { - if (!font.vertical) { - charSpacing += scaledDim + textState.wordSpacing; - textState.translateTextMatrix(charSpacing * textState.textHScale, 0); - } else { - charSpacing += -scaledDim + textState.wordSpacing; - textState.translateTextMatrix(0, -charSpacing); - } - saveLastChar(" "); - continue; - } - if (!category.isZeroWidthDiacritic && !compareWithLastPosition(scaledDim)) { - if (!font.vertical) { - textState.translateTextMatrix(scaledDim * textState.textHScale, 0); - } else { - textState.translateTextMatrix(0, scaledDim); - } - continue; - } - const textChunk = ensureTextContentItem(); - if (category.isZeroWidthDiacritic) { - scaledDim = 0; - } - if (!font.vertical) { - scaledDim *= textState.textHScale; - intersector?.addGlyph(getCurrentTextTransform(), scaledDim, 0, glyph.unicode); - textState.translateTextMatrix(scaledDim, 0); - textChunk.width += scaledDim; - } else { - intersector?.addGlyph(getCurrentTextTransform(), 0, scaledDim, glyph.unicode); - textState.translateTextMatrix(0, scaledDim); - scaledDim = Math.abs(scaledDim); - textChunk.height += scaledDim; - } - if (scaledDim) { - textChunk.prevTransform = getCurrentTextTransform(); - } - const glyphUnicode = glyph.unicode; - if (saveLastChar(glyphUnicode)) { - textChunk.str.push(" "); - intersector?.addExtraChar(" "); - } - if (!intersector) { - textChunk.str.push(glyphUnicode); - } - if (charSpacing) { - if (!font.vertical) { - textState.translateTextMatrix(charSpacing * textState.textHScale, 0); - } else { - textState.translateTextMatrix(0, -charSpacing); - } - } - } - } - function appendEOL() { - intersector?.addExtraChar("\n"); - resetLastChars(); - if (textContentItem.initialized) { - textContentItem.hasEOL = true; - flushTextContentItem(); - } else { - textContent.items.push({ - str: "", - dir: "ltr", - width: 0, - height: 0, - transform: getCurrentTextTransform(), - fontName: textState.loadedName, - hasEOL: true - }); - } - } - function addFakeSpaces(width, transf, textOrientation) { - if (textOrientation * textContentItem.spaceInFlowMin <= width && width <= textOrientation * textContentItem.spaceInFlowMax) { - if (textContentItem.initialized) { - resetLastChars(); - textContentItem.str.push(" "); - intersector?.addExtraChar(" "); - } - return false; - } - const fontName = textContentItem.fontName; - let height = 0; - if (textContentItem.vertical) { - height = width; - width = 0; - } - flushTextContentItem(); - resetLastChars(); - pushWhitespace({ - width: Math.abs(width), - height: Math.abs(height), - transform: transf || getCurrentTextTransform(), - fontName - }); - return true; - } - function flushTextContentItem() { - if (!textContentItem.initialized || !textContentItem.str) { - return; - } - if (!textContentItem.vertical) { - textContentItem.totalWidth += textContentItem.width * textContentItem.textAdvanceScale; - } else { - textContentItem.totalHeight += textContentItem.height * textContentItem.textAdvanceScale; - } - textContent.items.push(runBidiTransform(textContentItem)); - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - function enqueueChunk(batch = false) { - const length = textContent.items.length; - if (length === 0) { - return; - } - if (batch && length < TEXT_CHUNK_BATCH_SIZE) { - return; - } - sink?.enqueue(textContent, length); - textContent.items = []; - textContent.styles = Object.create(null); - } - const timeSlotManager = new TimeSlotManager(); - return new Promise(function promiseBody(resolve, reject) { - const next = function (promise) { - enqueueChunk(true); - Promise.all([promise, sink?.ready]).then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - const operation = {}; - let stop, - name, - isValidName, - args = []; - while (!(stop = timeSlotManager.check())) { - args.length = 0; - operation.args = args; - if (!preprocessor.read(operation)) { - break; - } - const previousState = textState; - textState = stateManager.state; - const fn = operation.fn; - args = operation.args; - switch (fn | 0) { - case OPS.setFont: - const fontNameArg = args[0].name, - fontSizeArg = args[1]; - if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { - break; - } - flushTextContentItem(); - textState.fontName = fontNameArg; - textState.fontSize = fontSizeArg; - next(handleSetFont(fontNameArg, null)); - return; - case OPS.setTextRise: - textState.textRise = args[0]; - break; - case OPS.setHScale: - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - textState.leading = args[0]; - break; - case OPS.moveText: - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); - updateAdvanceScale(); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - const spaceFactor = (textState.font.vertical ? 1 : -1) * textState.fontSize / 1000; - const elements = args[0]; - for (let i = 0, ii = elements.length; i < ii; i++) { - const item = elements[i]; - if (typeof item === "string") { - showSpacedTextBuffer.push(item); - } else if (typeof item === "number" && item !== 0) { - const str = showSpacedTextBuffer.join(""); - showSpacedTextBuffer.length = 0; - buildTextContentItem({ - chars: str, - extraSpacing: item * spaceFactor - }); - } - } - if (showSpacedTextBuffer.length > 0) { - const str = showSpacedTextBuffer.join(""); - showSpacedTextBuffer.length = 0; - buildTextContentItem({ - chars: str, - extraSpacing: 0 - }); - } - break; - case OPS.showText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - buildTextContentItem({ - chars: args[0], - extraSpacing: 0 - }); - break; - case OPS.nextLineShowText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - textState.carriageReturn(); - buildTextContentItem({ - chars: args[0], - extraSpacing: 0 - }); - break; - case OPS.nextLineSetSpacingShowText: - if (!stateManager.state.font) { - self.ensureStateFont(stateManager.state); - continue; - } - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem({ - chars: args[2], - extraSpacing: 0 - }); - break; - case OPS.paintXObject: - flushTextContentItem(); - xobjs ??= resources.get("XObject") || Dict.empty; - isValidName = args[0] instanceof Name; - name = args[0].name; - if (isValidName && emptyXObjectCache.getByName(name)) { - break; - } - next(new Promise(function (resolveXObject, rejectXObject) { - if (!isValidName) { - throw new FormatError("XObject must be referred to by name."); - } - let xobj = xobjs.getRaw(name); - if (xobj instanceof Ref) { - if (emptyXObjectCache.getByRef(xobj)) { - resolveXObject(); - return; - } - const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); - if (globalImage) { - resolveXObject(); - return; - } - xobj = xref.fetch(xobj); - } - if (!(xobj instanceof BaseStream)) { - throw new FormatError("XObject should be a stream"); - } - const { - dict - } = xobj; - const type = dict.get("Subtype"); - if (!(type instanceof Name)) { - throw new FormatError("XObject should have a Name subtype"); - } - if (type.name !== "Form") { - emptyXObjectCache.set(name, dict.objId, true); - resolveXObject(); - return; - } - const currentState = stateManager.state.clone(); - const xObjStateManager = new StateManager(currentState); - const matrix = lookupMatrix(dict.getArray("Matrix"), null); - if (matrix) { - xObjStateManager.transform(matrix); - } - const localResources = dict.get("Resources"); - enqueueChunk(); - const sinkWrapper = { - enqueueInvoked: false, - enqueue(chunk, size) { - this.enqueueInvoked = true; - sink.enqueue(chunk, size); - }, - get desiredSize() { - return sink.desiredSize ?? 0; - }, - get ready() { - return sink.ready; - } - }; - self.getTextContent({ - stream: xobj, - task, - resources: localResources instanceof Dict ? localResources : resources, - stateManager: xObjStateManager, - includeMarkedContent, - sink: sink && sinkWrapper, - seenStyles, - viewBox, - lang, - markedContentData, - disableNormalization, - keepWhiteSpace, - prevRefs: seenRefs - }).then(function () { - if (!sinkWrapper.enqueueInvoked) { - emptyXObjectCache.set(name, dict.objId, true); - } - resolveXObject(); - }, rejectXObject); - }).catch(function (reason) { - if (reason instanceof AbortException) { - return; - } - if (self.options.ignoreErrors) { - warn(`getTextContent - ignoring XObject: "${reason}".`); - return; - } - throw reason; - })); - return; - case OPS.setGState: - isValidName = args[0] instanceof Name; - name = args[0].name; - if (isValidName && emptyGStateCache.getByName(name)) { - break; - } - next(new Promise(function (resolveGState, rejectGState) { - if (!isValidName) { - throw new FormatError("GState must be referred to by name."); - } - const extGState = resources.get("ExtGState"); - if (!(extGState instanceof Dict)) { - throw new FormatError("ExtGState should be a dictionary."); - } - const gState = extGState.get(name); - if (!(gState instanceof Dict)) { - throw new FormatError("GState should be a dictionary."); - } - const gStateFont = gState.get("Font"); - if (!gStateFont) { - emptyGStateCache.set(name, gState.objId, true); - resolveGState(); - return; - } - flushTextContentItem(); - textState.fontName = null; - textState.fontSize = gStateFont[1]; - handleSetFont(null, gStateFont[0]).then(resolveGState, rejectGState); - }).catch(function (reason) { - if (reason instanceof AbortException) { - return; - } - if (self.options.ignoreErrors) { - warn(`getTextContent - ignoring ExtGState: "${reason}".`); - return; - } - throw reason; - })); - return; - case OPS.beginMarkedContent: - flushTextContentItem(); - if (includeMarkedContent) { - markedContentData.level++; - textContent.items.push({ - type: "beginMarkedContent", - tag: args[0] instanceof Name ? args[0].name : null - }); - } - break; - case OPS.beginMarkedContentProps: - flushTextContentItem(); - if (includeMarkedContent) { - markedContentData.level++; - let mcid = null; - if (args[1] instanceof Dict) { - mcid = args[1].get("MCID"); - } - textContent.items.push({ - type: "beginMarkedContentProps", - id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, - tag: args[0] instanceof Name ? args[0].name : null - }); - } - break; - case OPS.endMarkedContent: - flushTextContentItem(); - if (includeMarkedContent) { - if (markedContentData.level === 0) { - break; - } - markedContentData.level--; - textContent.items.push({ - type: "endMarkedContent" - }); - } - break; - case OPS.restore: - if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) { - flushTextContentItem(); - } - break; - } - if (textContent.items.length >= (sink?.desiredSize ?? 1)) { - stop = true; - break; - } - } - if (stop) { - next(deferred); - return; - } - flushTextContentItem(); - enqueueChunk(); - resolve(); - }).catch(reason => { - if (reason instanceof AbortException) { - return; - } - if (this.options.ignoreErrors) { - warn(`getTextContent - ignoring errors during "${task.name}" ` + `task: "${reason}".`); - flushTextContentItem(); - enqueueChunk(); - return; - } - throw reason; - }); - } - async extractDataStructures(dict, properties) { - const xref = this.xref; - let cidToGidBytes; - const toUnicodePromise = this.readToUnicode(properties.toUnicode); - if (properties.composite) { - const cidSystemInfo = dict.get("CIDSystemInfo"); - if (cidSystemInfo instanceof Dict) { - properties.cidSystemInfo = { - registry: stringToPDFString(cidSystemInfo.get("Registry")), - ordering: stringToPDFString(cidSystemInfo.get("Ordering")), - supplement: cidSystemInfo.get("Supplement") - }; - } - try { - const cidToGidMap = dict.get("CIDToGIDMap"); - if (cidToGidMap instanceof BaseStream) { - cidToGidBytes = cidToGidMap.getBytes(); - } - } catch (ex) { - if (!this.options.ignoreErrors) { - throw ex; - } - warn(`extractDataStructures - ignoring CIDToGIDMap data: "${ex}".`); - } - } - const differences = []; - let baseEncodingName = null; - let encoding; - if (dict.has("Encoding")) { - encoding = dict.get("Encoding"); - if (encoding instanceof Dict) { - baseEncodingName = encoding.get("BaseEncoding"); - baseEncodingName = baseEncodingName instanceof Name ? baseEncodingName.name : null; - if (encoding.has("Differences")) { - const diffEncoding = encoding.get("Differences"); - let index = 0; - for (const entry of diffEncoding) { - const data = xref.fetchIfRef(entry); - if (typeof data === "number") { - index = data; - } else if (data instanceof Name) { - differences[index++] = data.name; - } else { - throw new FormatError(`Invalid entry in 'Differences' array: ${data}`); - } - } - } - } else if (encoding instanceof Name) { - baseEncodingName = encoding.name; - } else { - const msg = "Encoding is not a Name nor a Dict"; - if (!this.options.ignoreErrors) { - throw new FormatError(msg); - } - warn(msg); - } - if (baseEncodingName !== "MacRomanEncoding" && baseEncodingName !== "MacExpertEncoding" && baseEncodingName !== "WinAnsiEncoding") { - baseEncodingName = null; - } - } - const nonEmbeddedFont = !properties.file || properties.isInternalFont, - isSymbolsFontName = getSymbolsFonts()[properties.name]; - if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { - baseEncodingName = null; - } - if (baseEncodingName) { - properties.defaultEncoding = getEncoding(baseEncodingName); - } else { - const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); - encoding = StandardEncoding; - if (properties.type === "TrueType" && !isNonsymbolicFont) { - encoding = WinAnsiEncoding; - } - if (isSymbolicFont || isSymbolsFontName) { - encoding = MacRomanEncoding; - if (nonEmbeddedFont) { - if (/Symbol/i.test(properties.name)) { - encoding = SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = ZapfDingbatsEncoding; - } else if (/Wingdings/i.test(properties.name)) { - encoding = WinAnsiEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.hasEncoding = !!baseEncodingName || differences.length > 0; - properties.dict = dict; - properties.toUnicode = await toUnicodePromise; - const builtToUnicode = await this.buildToUnicode(properties); - properties.toUnicode = builtToUnicode; - if (cidToGidBytes) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidBytes, builtToUnicode); - } - return properties; - } - _simpleFontToUnicode(properties, forceGlyphs = false) { - assert(!properties.composite, "Must be a simple font."); - const toUnicode = []; - const encoding = properties.defaultEncoding.slice(); - const baseEncodingName = properties.baseEncodingName; - const differences = properties.differences; - for (const charcode in differences) { - const glyphName = differences[charcode]; - if (glyphName === ".notdef") { - continue; - } - encoding[charcode] = glyphName; - } - const glyphsUnicodeMap = getGlyphsUnicode(); - for (const charcode in encoding) { - let glyphName = encoding[charcode]; - if (glyphName === "") { - continue; - } - let unicode = glyphsUnicodeMap[glyphName]; - if (unicode !== undefined) { - toUnicode[charcode] = String.fromCharCode(unicode); - continue; - } - let code = 0; - switch (glyphName[0]) { - case "G": - if (glyphName.length === 3) { - code = parseInt(glyphName.substring(1), 16); - } - break; - case "g": - if (glyphName.length === 5) { - code = parseInt(glyphName.substring(1), 16); - } - break; - case "C": - case "c": - if (glyphName.length >= 3 && glyphName.length <= 4) { - const codeStr = glyphName.substring(1); - if (forceGlyphs) { - code = parseInt(codeStr, 16); - break; - } - code = +codeStr; - if (Number.isNaN(code) && Number.isInteger(parseInt(codeStr, 16))) { - return this._simpleFontToUnicode(properties, true); - } - } - break; - case "u": - unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - code = unicode; - } - break; - default: - switch (glyphName) { - case "f_h": - case "f_t": - case "T_h": - toUnicode[charcode] = glyphName.replaceAll("_", ""); - continue; - } - break; - } - if (code > 0 && code <= 0x10ffff && Number.isInteger(code)) { - if (baseEncodingName && code === +charcode) { - const baseEncoding = getEncoding(baseEncodingName); - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCodePoint(code); - } - } - return toUnicode; - } - async buildToUnicode(properties) { - properties.hasIncludedToUnicodeMap = properties.toUnicode?.length > 0; - if (properties.hasIncludedToUnicodeMap) { - if (!properties.composite && properties.hasEncoding) { - properties.fallbackToUnicode = this._simpleFontToUnicode(properties); - } - return properties.toUnicode; - } - if (!properties.composite) { - return new ToUnicodeMap(this._simpleFontToUnicode(properties)); - } - if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo?.registry === "Adobe" && (properties.cidSystemInfo.ordering === "GB1" || properties.cidSystemInfo.ordering === "CNS1" || properties.cidSystemInfo.ordering === "Japan1" || properties.cidSystemInfo.ordering === "Korea1"))) { - const { - registry, - ordering - } = properties.cidSystemInfo; - const ucs2CMapName = Name.get(`${registry}-${ordering}-UCS2`); - const ucs2CMap = await CMapFactory.create({ - encoding: ucs2CMapName, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null - }); - const toUnicode = [], - buf = []; - properties.cMap.forEach(function (charcode, cid) { - if (cid > 0xffff) { - throw new FormatError("Max size of CID is 65,535"); - } - const ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - buf.length = 0; - for (let i = 0, ii = ucs2.length; i < ii; i += 2) { - buf.push((ucs2.charCodeAt(i) << 8) + ucs2.charCodeAt(i + 1)); - } - toUnicode[charcode] = String.fromCharCode(...buf); - } - }); - return new ToUnicodeMap(toUnicode); - } - return new IdentityToUnicodeMap(properties.firstChar, properties.lastChar); - } - async readToUnicode(cmapObj) { - if (!cmapObj) { - return null; - } - if (cmapObj instanceof Name) { - const cmap = await CMapFactory.create({ - encoding: cmapObj, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null - }); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xffff); - } - return new ToUnicodeMap(cmap.getMap()); - } - if (cmapObj instanceof BaseStream) { - try { - const cmap = await CMapFactory.create({ - encoding: cmapObj, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null - }); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xffff); - } - const map = new Array(cmap.length); - cmap.forEach(function (charCode, token) { - if (typeof token === "number") { - map[charCode] = String.fromCodePoint(token); - return; - } - if (token.length % 2 !== 0) { - token = "\u0000" + token; - } - const str = []; - for (let k = 0; k < token.length; k += 2) { - const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); - if ((w1 & 0xf800) !== 0xd800) { - str.push(w1); - continue; - } - k += 2; - const w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCodePoint(...str); - }); - return new ToUnicodeMap(map); - } catch (reason) { - if (reason instanceof AbortException) { - return null; - } - if (this.options.ignoreErrors) { - warn(`readToUnicode - ignoring ToUnicode data: "${reason}".`); - return null; - } - throw reason; - } - } - return null; - } - readCidToGidMap(glyphsData, toUnicode) { - const result = []; - for (let j = 0, jj = glyphsData.length; j < jj; j++) { - const glyphID = glyphsData[j++] << 8 | glyphsData[j]; - const code = j >> 1; - if (glyphID === 0 && !toUnicode.has(code)) { - continue; - } - result[code] = glyphID; - } - return result; - } - extractWidths(dict, descriptor, properties) { - const xref = this.xref; - let glyphsWidths = []; - let defaultWidth = 0; - const glyphsVMetrics = []; - let defaultVMetrics; - if (properties.composite) { - const dw = dict.get("DW"); - defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; - const widths = dict.get("W"); - if (Array.isArray(widths)) { - for (let i = 0, ii = widths.length; i < ii; i++) { - let start = xref.fetchIfRef(widths[i++]); - if (!Number.isInteger(start)) { - break; - } - const code = xref.fetchIfRef(widths[i]); - if (Array.isArray(code)) { - for (const c of code) { - const width = xref.fetchIfRef(c); - if (typeof width === "number") { - glyphsWidths[start] = width; - } - start++; - } - } else if (Number.isInteger(code)) { - const width = xref.fetchIfRef(widths[++i]); - if (typeof width !== "number") { - continue; - } - for (let j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } else { - break; - } - } - } - if (properties.vertical) { - const dw2 = dict.getArray("DW2"); - let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get("W2"); - if (Array.isArray(vmetrics)) { - for (let i = 0, ii = vmetrics.length; i < ii; i++) { - let start = xref.fetchIfRef(vmetrics[i++]); - if (!Number.isInteger(start)) { - break; - } - const code = xref.fetchIfRef(vmetrics[i]); - if (Array.isArray(code)) { - for (let j = 0, jj = code.length; j < jj; j++) { - const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; - if (isNumberArray(vmetric, null)) { - glyphsVMetrics[start] = vmetric; - } - start++; - } - } else if (Number.isInteger(code)) { - const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; - if (!isNumberArray(vmetric, null)) { - continue; - } - for (let j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } else { - break; - } - } - } - } - } else { - const widths = dict.get("Widths"); - if (Array.isArray(widths)) { - let j = properties.firstChar; - for (const w of widths) { - const width = xref.fetchIfRef(w); - if (typeof width === "number") { - glyphsWidths[j] = width; - } - j++; - } - const missingWidth = descriptor.get("MissingWidth"); - defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; - } else { - const baseFontName = dict.get("BaseFont"); - if (baseFontName instanceof Name) { - const metrics = this.getBaseFontMetrics(baseFontName.name); - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); - defaultWidth = metrics.defaultWidth; - } - } - } - let isMonospace = true; - let firstWidth = defaultWidth; - for (const glyph in glyphsWidths) { - const glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } else { - properties.flags &= ~FontFlags.FixedPitch; - } - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - } - isSerifFont(baseFontName) { - const fontNameWoStyle = baseFontName.split("-", 1)[0]; - return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle); - } - getBaseFontMetrics(name) { - let defaultWidth = 0; - let widths = Object.create(null); - let monospace = false; - const stdFontMap = getStdFontMap(); - let lookupName = stdFontMap[name] || name; - const Metrics = getMetrics(); - if (!(lookupName in Metrics)) { - lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; - } - const glyphWidths = Metrics[lookupName]; - if (typeof glyphWidths === "number") { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths(); - } - return { - defaultWidth, - monospace, - widths - }; - } - buildCharCodeToWidth(widthsByGlyphName, properties) { - const widths = Object.create(null); - const differences = properties.differences; - const encoding = properties.defaultEncoding; - for (let charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - } - preEvaluateFont(dict) { - const baseDict = dict; - let type = dict.get("Subtype"); - if (!(type instanceof Name)) { - throw new FormatError("invalid font Subtype"); - } - let composite = false; - let hash; - if (type.name === "Type0") { - const df = dict.get("DescendantFonts"); - if (!df) { - throw new FormatError("Descendant fonts are not specified"); - } - dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df; - if (!(dict instanceof Dict)) { - throw new FormatError("Descendant font is not a dictionary."); - } - type = dict.get("Subtype"); - if (!(type instanceof Name)) { - throw new FormatError("invalid font Subtype"); - } - composite = true; - } - let firstChar = dict.get("FirstChar"); - if (!Number.isInteger(firstChar)) { - firstChar = 0; - } - let lastChar = dict.get("LastChar"); - if (!Number.isInteger(lastChar)) { - lastChar = composite ? 0xffff : 0xff; - } - const descriptor = dict.get("FontDescriptor"); - const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); - if (descriptor) { - hash = new MurmurHash3_64(); - const encoding = baseDict.getRaw("Encoding"); - if (encoding instanceof Name) { - hash.update(encoding.name); - } else if (encoding instanceof Ref) { - hash.update(encoding.toString()); - } else if (encoding instanceof Dict) { - for (const entry of encoding.getRawValues()) { - if (entry instanceof Name) { - hash.update(entry.name); - } else if (entry instanceof Ref) { - hash.update(entry.toString()); - } else if (Array.isArray(entry)) { - const diffLength = entry.length, - diffBuf = new Array(diffLength); - for (let j = 0; j < diffLength; j++) { - const diffEntry = entry[j]; - if (diffEntry instanceof Name) { - diffBuf[j] = diffEntry.name; - } else if (typeof diffEntry === "number" || diffEntry instanceof Ref) { - diffBuf[j] = diffEntry.toString(); - } - } - hash.update(diffBuf.join()); - } - } - } - hash.update(`${firstChar}-${lastChar}`); - if (toUnicode instanceof BaseStream) { - const stream = toUnicode.str || toUnicode; - const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); - hash.update(uint8array); - } else if (toUnicode instanceof Name) { - hash.update(toUnicode.name); - } - const widths = dict.get("Widths") || baseDict.get("Widths"); - if (Array.isArray(widths)) { - const widthsBuf = []; - for (const entry of widths) { - if (typeof entry === "number" || entry instanceof Ref) { - widthsBuf.push(entry.toString()); - } - } - hash.update(widthsBuf.join()); - } - if (composite) { - hash.update("compositeFont"); - const compositeWidths = dict.get("W") || baseDict.get("W"); - if (Array.isArray(compositeWidths)) { - const widthsBuf = []; - for (const entry of compositeWidths) { - if (typeof entry === "number" || entry instanceof Ref) { - widthsBuf.push(entry.toString()); - } else if (Array.isArray(entry)) { - const subWidthsBuf = []; - for (const element of entry) { - if (typeof element === "number" || element instanceof Ref) { - subWidthsBuf.push(element.toString()); - } - } - widthsBuf.push(`[${subWidthsBuf.join()}]`); - } - } - hash.update(widthsBuf.join()); - } - const cidToGidMap = dict.getRaw("CIDToGIDMap") || baseDict.getRaw("CIDToGIDMap"); - if (cidToGidMap instanceof Name) { - hash.update(cidToGidMap.name); - } else if (cidToGidMap instanceof Ref) { - hash.update(cidToGidMap.toString()); - } else if (cidToGidMap instanceof BaseStream) { - hash.update(cidToGidMap.peekBytes()); - } - } - } - return { - descriptor, - dict, - baseDict, - composite, - type: type.name, - firstChar, - lastChar, - toUnicode, - hash: hash ? hash.hexdigest() : "" - }; - } - async translateFont({ - descriptor, - dict, - baseDict, - composite, - type, - firstChar, - lastChar, - toUnicode, - cssFontInfo - }) { - const isType3Font = type === "Type3"; - if (!descriptor) { - if (isType3Font) { - descriptor = Dict.empty; - } else { - let baseFontName = dict.get("BaseFont"); - if (!(baseFontName instanceof Name)) { - throw new FormatError("Base font is not specified"); - } - baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); - const metrics = this.getBaseFontMetrics(baseFontName); - const fontNameWoStyle = baseFontName.split("-", 1)[0]; - const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); - const properties = { - type, - name: baseFontName, - loadedName: baseDict.loadedName, - systemFontInfo: null, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - isSimulatedFlags: true, - flags, - firstChar, - lastChar, - toUnicode, - xHeight: 0, - capHeight: 0, - italicAngle: 0, - isType3Font - }; - const widths = dict.get("Widths"); - const standardFontName = getStandardFontName(baseFontName); - let file = null; - if (standardFontName) { - file = await this.fetchStandardFontData(standardFontName); - properties.isInternalFont = !!file; - } - if (!properties.isInternalFont && this.options.useSystemFonts) { - properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type); - } - const newProperties = await this.extractDataStructures(dict, properties); - if (Array.isArray(widths)) { - const glyphWidths = []; - let j = firstChar; - for (const w of widths) { - const width = this.xref.fetchIfRef(w); - if (typeof width === "number") { - glyphWidths[j] = width; - } - j++; - } - newProperties.widths = glyphWidths; - } else { - newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); - } - return new Font(baseFontName, file, newProperties, this.options); - } - } - let fontName = descriptor.get("FontName"); - let baseFont = dict.get("BaseFont"); - if (typeof fontName === "string") { - fontName = Name.get(fontName); - } - if (typeof baseFont === "string") { - baseFont = Name.get(baseFont); - } - const fontNameStr = fontName?.name; - const baseFontStr = baseFont?.name; - if (isType3Font) { - if (!fontNameStr) { - fontName = Name.get(type); - } - } else if (fontNameStr !== baseFontStr) { - info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); - if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { - fontName = null; - } - fontName ||= baseFont; - } - if (!(fontName instanceof Name)) { - throw new FormatError("invalid font name"); - } - let fontFile, subtype, length1, length2, length3; - try { - fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); - if (fontFile) { - if (!(fontFile instanceof BaseStream)) { - throw new FormatError("FontFile should be a stream"); - } else if (fontFile.isEmpty) { - throw new FormatError("FontFile is empty"); - } - } - } catch (ex) { - if (!this.options.ignoreErrors) { - throw ex; - } - warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); - fontFile = null; - } - let isInternalFont = false; - let glyphScaleFactors = null; - let systemFontInfo = null; - if (fontFile) { - if (fontFile.dict) { - const subtypeEntry = fontFile.dict.get("Subtype"); - if (subtypeEntry instanceof Name) { - subtype = subtypeEntry.name; - } - length1 = fontFile.dict.get("Length1"); - length2 = fontFile.dict.get("Length2"); - length3 = fontFile.dict.get("Length3"); - } - } else if (cssFontInfo) { - const standardFontName = getXfaFontName(fontName.name); - if (standardFontName) { - cssFontInfo.fontFamily = `${cssFontInfo.fontFamily}-PdfJS-XFA`; - cssFontInfo.metrics = standardFontName.metrics || null; - glyphScaleFactors = standardFontName.factors || null; - fontFile = await this.fetchStandardFontData(standardFontName.name); - isInternalFont = !!fontFile; - baseDict = dict = getXfaFontDict(fontName.name); - composite = true; - } - } else if (!isType3Font) { - const standardFontName = getStandardFontName(fontName.name); - if (standardFontName) { - fontFile = await this.fetchStandardFontData(standardFontName); - isInternalFont = !!fontFile; - } - if (!isInternalFont && this.options.useSystemFonts) { - systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); - } - } - const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); - const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), isType3Font ? [0, 0, 0, 0] : undefined); - let ascent = descriptor.get("Ascent"); - if (typeof ascent !== "number") { - ascent = undefined; - } - let descent = descriptor.get("Descent"); - if (typeof descent !== "number") { - descent = undefined; - } - let xHeight = descriptor.get("XHeight"); - if (typeof xHeight !== "number") { - xHeight = 0; - } - let capHeight = descriptor.get("CapHeight"); - if (typeof capHeight !== "number") { - capHeight = 0; - } - let flags = descriptor.get("Flags"); - if (!Number.isInteger(flags)) { - flags = 0; - } - let italicAngle = descriptor.get("ItalicAngle"); - if (typeof italicAngle !== "number") { - italicAngle = 0; - } - const properties = { - type, - name: fontName.name, - subtype, - file: fontFile, - length1, - length2, - length3, - isInternalFont, - loadedName: baseDict.loadedName, - composite, - fixedPitch: false, - fontMatrix, - firstChar, - lastChar, - toUnicode, - bbox, - ascent, - descent, - xHeight, - capHeight, - flags, - italicAngle, - isType3Font, - cssFontInfo, - scaleFactors: glyphScaleFactors, - systemFontInfo - }; - if (composite) { - const cidEncoding = baseDict.get("Encoding"); - if (cidEncoding instanceof Name) { - properties.cidEncoding = cidEncoding.name; - } - const cMap = await CMapFactory.create({ - encoding: cidEncoding, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null - }); - properties.cMap = cMap; - properties.vertical = properties.cMap.vertical; - } - const newProperties = await this.extractDataStructures(dict, properties); - this.extractWidths(dict, descriptor, newProperties); - return new Font(fontName.name, fontFile, newProperties, this.options); - } - static buildFontPaths(font, glyphs, handler, evaluatorOptions) { - function buildPath(fontChar) { - const glyphName = `${font.loadedName}_path_${fontChar}`; - try { - if (font.renderer.hasBuiltPath(fontChar)) { - return; - } - handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); - } catch (reason) { - if (evaluatorOptions.ignoreErrors) { - warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); - return; - } - throw reason; - } - } - for (const glyph of glyphs) { - buildPath(glyph.fontChar); - const accent = glyph.accent; - if (accent?.fontChar) { - buildPath(accent.fontChar); - } - } - } - static get fallbackFontDict() { - const dict = new Dict(); - dict.set("BaseFont", Name.get("Helvetica")); - dict.set("Type", Name.get("FallbackType")); - dict.set("Subtype", Name.get("FallbackType")); - dict.set("Encoding", Name.get("WinAnsiEncoding")); - return shadow(this, "fallbackFontDict", dict); - } -} -class TranslatedFont { - #sent = false; - #type3Loaded = null; - constructor({ - loadedName, - font, - dict - }) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Dependencies = font.isType3Font ? new Set() : null; - } - send(handler) { - if (this.#sent) { - return; - } - this.#sent = true; - handler.send("commonobj", [this.loadedName, "Font", this.font.exportData()]); - } - fallback(handler, evaluatorOptions) { - if (!this.font.data) { - return; - } - this.font.disableFontFace = true; - PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, evaluatorOptions); - } - loadType3Data(evaluator, resources, task) { - if (this.#type3Loaded) { - return this.#type3Loaded; - } - const { - font, - type3Dependencies - } = this; - assert(font.isType3Font, "Must be a Type3 font."); - const type3Evaluator = evaluator.clone({ - ignoreErrors: false - }); - const type3FontRefs = new RefSet(evaluator.type3FontRefs); - if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { - type3FontRefs.put(this.dict.objId); - } - type3Evaluator.type3FontRefs = type3FontRefs; - let loadCharProcsPromise = Promise.resolve(); - const charProcs = this.dict.get("CharProcs"); - const fontResources = this.dict.get("Resources") || resources; - const charProcOperatorList = Object.create(null); - const [x0, y0, x1, y1] = font.bbox, - width = x1 - x0, - height = y1 - y0; - const fontBBoxSize = Math.hypot(width, height); - for (const key of charProcs.getKeys()) { - loadCharProcsPromise = loadCharProcsPromise.then(() => { - const glyphStream = charProcs.get(key); - const operatorList = new OperatorList(); - return type3Evaluator.getOperatorList({ - stream: glyphStream, - task, - resources: fontResources, - operatorList - }).then(() => { - switch (operatorList.fnArray[0]) { - case OPS.setCharWidthAndBounds: - this.#removeType3ColorOperators(operatorList, fontBBoxSize); - break; - case OPS.setCharWidth: - if (!fontBBoxSize) { - this.#guessType3FontBBox(operatorList); - } - break; - } - charProcOperatorList[key] = operatorList.getIR(); - for (const dependency of operatorList.dependencies) { - type3Dependencies.add(dependency); - } - }).catch(function (reason) { - warn(`Type3 font resource "${key}" is not available.`); - const dummyOperatorList = new OperatorList(); - charProcOperatorList[key] = dummyOperatorList.getIR(); - }); - }); - } - this.#type3Loaded = loadCharProcsPromise.then(() => { - font.charProcOperatorList = charProcOperatorList; - if (this._bbox) { - font.isCharBBox = true; - font.bbox = this._bbox; - } - }); - return this.#type3Loaded; - } - #removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { - const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), - width = charBBox[2] - charBBox[0], - height = charBBox[3] - charBBox[1]; - const charBBoxSize = Math.hypot(width, height); - if (width === 0 || height === 0) { - operatorList.fnArray.splice(0, 1); - operatorList.argsArray.splice(0, 1); - } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { - this._bbox ??= [Infinity, Infinity, -Infinity, -Infinity]; - Util.rectBoundingBox(...charBBox, this._bbox); - } - let i = 0, - ii = operatorList.length; - while (i < ii) { - switch (operatorList.fnArray[i]) { - case OPS.setCharWidthAndBounds: - break; - case OPS.setStrokeColorSpace: - case OPS.setFillColorSpace: - case OPS.setStrokeColor: - case OPS.setStrokeColorN: - case OPS.setFillColor: - case OPS.setFillColorN: - case OPS.setStrokeGray: - case OPS.setFillGray: - case OPS.setStrokeRGBColor: - case OPS.setFillRGBColor: - case OPS.setStrokeCMYKColor: - case OPS.setFillCMYKColor: - case OPS.shadingFill: - case OPS.setRenderingIntent: - operatorList.fnArray.splice(i, 1); - operatorList.argsArray.splice(i, 1); - ii--; - continue; - case OPS.setGState: - const [gStateObj] = operatorList.argsArray[i]; - let j = 0, - jj = gStateObj.length; - while (j < jj) { - const [gStateKey] = gStateObj[j]; - switch (gStateKey) { - case "TR": - case "TR2": - case "HT": - case "BG": - case "BG2": - case "UCR": - case "UCR2": - gStateObj.splice(j, 1); - jj--; - continue; - } - j++; - } - break; - } - i++; - } - } - #guessType3FontBBox(operatorList) { - let i = 1; - const ii = operatorList.length; - while (i < ii) { - switch (operatorList.fnArray[i]) { - case OPS.constructPath: - const minMax = operatorList.argsArray[i][2]; - this._bbox ??= [Infinity, Infinity, -Infinity, -Infinity]; - Util.rectBoundingBox(...minMax, this._bbox); - break; - } - i++; - } - } -} -class StateManager { - constructor(initialState = new EvalState()) { - this.state = initialState; - this.stateStack = []; - } - save() { - const old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - } - restore() { - const prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - } - transform(args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } -} -class TextState { - constructor() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontName = null; - this.fontSize = 0; - this.loadedName = null; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - setTextMatrix(a, b, c, d, e, f) { - const m = this.textMatrix; - m[0] = a; - m[1] = b; - m[2] = c; - m[3] = d; - m[4] = e; - m[5] = f; - } - setTextLineMatrix(a, b, c, d, e, f) { - const m = this.textLineMatrix; - m[0] = a; - m[1] = b; - m[2] = c; - m[3] = d; - m[4] = e; - m[5] = f; - } - translateTextMatrix(x, y) { - const m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - } - translateTextLineMatrix(x, y) { - const m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - } - carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - } - clone() { - const clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } -} -class EvalState { - constructor() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this._fillColorSpace = this._strokeColorSpace = ColorSpaceUtils.gray; - this.patternFillColorSpace = null; - this.patternStrokeColorSpace = null; - this.currentPointX = this.currentPointY = 0; - this.pathMinMax = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); - this.pathBuffer = []; - } - get fillColorSpace() { - return this._fillColorSpace; - } - set fillColorSpace(colorSpace) { - this._fillColorSpace = this.patternFillColorSpace = colorSpace; - } - get strokeColorSpace() { - return this._strokeColorSpace; - } - set strokeColorSpace(colorSpace) { - this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; - } - clone({ - newPath = false - } = {}) { - const clone = Object.create(this); - if (newPath) { - clone.pathBuffer = []; - clone.pathMinMax = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); - } - return clone; - } -} -class EvaluatorPreprocessor { - static get opMap() { - return shadow(this, "opMap", Object.assign(Object.create(null), { - w: { - id: OPS.setLineWidth, - numArgs: 1, - variableArgs: false - }, - J: { - id: OPS.setLineCap, - numArgs: 1, - variableArgs: false - }, - j: { - id: OPS.setLineJoin, - numArgs: 1, - variableArgs: false - }, - M: { - id: OPS.setMiterLimit, - numArgs: 1, - variableArgs: false - }, - d: { - id: OPS.setDash, - numArgs: 2, - variableArgs: false - }, - ri: { - id: OPS.setRenderingIntent, - numArgs: 1, - variableArgs: false - }, - i: { - id: OPS.setFlatness, - numArgs: 1, - variableArgs: false - }, - gs: { - id: OPS.setGState, - numArgs: 1, - variableArgs: false - }, - q: { - id: OPS.save, - numArgs: 0, - variableArgs: false - }, - Q: { - id: OPS.restore, - numArgs: 0, - variableArgs: false - }, - cm: { - id: OPS.transform, - numArgs: 6, - variableArgs: false - }, - m: { - id: OPS.moveTo, - numArgs: 2, - variableArgs: false - }, - l: { - id: OPS.lineTo, - numArgs: 2, - variableArgs: false - }, - c: { - id: OPS.curveTo, - numArgs: 6, - variableArgs: false - }, - v: { - id: OPS.curveTo2, - numArgs: 4, - variableArgs: false - }, - y: { - id: OPS.curveTo3, - numArgs: 4, - variableArgs: false - }, - h: { - id: OPS.closePath, - numArgs: 0, - variableArgs: false - }, - re: { - id: OPS.rectangle, - numArgs: 4, - variableArgs: false - }, - S: { - id: OPS.stroke, - numArgs: 0, - variableArgs: false - }, - s: { - id: OPS.closeStroke, - numArgs: 0, - variableArgs: false - }, - f: { - id: OPS.fill, - numArgs: 0, - variableArgs: false - }, - F: { - id: OPS.fill, - numArgs: 0, - variableArgs: false - }, - "f*": { - id: OPS.eoFill, - numArgs: 0, - variableArgs: false - }, - B: { - id: OPS.fillStroke, - numArgs: 0, - variableArgs: false - }, - "B*": { - id: OPS.eoFillStroke, - numArgs: 0, - variableArgs: false - }, - b: { - id: OPS.closeFillStroke, - numArgs: 0, - variableArgs: false - }, - "b*": { - id: OPS.closeEOFillStroke, - numArgs: 0, - variableArgs: false - }, - n: { - id: OPS.endPath, - numArgs: 0, - variableArgs: false - }, - W: { - id: OPS.clip, - numArgs: 0, - variableArgs: false - }, - "W*": { - id: OPS.eoClip, - numArgs: 0, - variableArgs: false - }, - BT: { - id: OPS.beginText, - numArgs: 0, - variableArgs: false - }, - ET: { - id: OPS.endText, - numArgs: 0, - variableArgs: false - }, - Tc: { - id: OPS.setCharSpacing, - numArgs: 1, - variableArgs: false - }, - Tw: { - id: OPS.setWordSpacing, - numArgs: 1, - variableArgs: false - }, - Tz: { - id: OPS.setHScale, - numArgs: 1, - variableArgs: false - }, - TL: { - id: OPS.setLeading, - numArgs: 1, - variableArgs: false - }, - Tf: { - id: OPS.setFont, - numArgs: 2, - variableArgs: false - }, - Tr: { - id: OPS.setTextRenderingMode, - numArgs: 1, - variableArgs: false - }, - Ts: { - id: OPS.setTextRise, - numArgs: 1, - variableArgs: false - }, - Td: { - id: OPS.moveText, - numArgs: 2, - variableArgs: false - }, - TD: { - id: OPS.setLeadingMoveText, - numArgs: 2, - variableArgs: false - }, - Tm: { - id: OPS.setTextMatrix, - numArgs: 6, - variableArgs: false - }, - "T*": { - id: OPS.nextLine, - numArgs: 0, - variableArgs: false - }, - Tj: { - id: OPS.showText, - numArgs: 1, - variableArgs: false - }, - TJ: { - id: OPS.showSpacedText, - numArgs: 1, - variableArgs: false - }, - "'": { - id: OPS.nextLineShowText, - numArgs: 1, - variableArgs: false - }, - '"': { - id: OPS.nextLineSetSpacingShowText, - numArgs: 3, - variableArgs: false - }, - d0: { - id: OPS.setCharWidth, - numArgs: 2, - variableArgs: false - }, - d1: { - id: OPS.setCharWidthAndBounds, - numArgs: 6, - variableArgs: false - }, - CS: { - id: OPS.setStrokeColorSpace, - numArgs: 1, - variableArgs: false - }, - cs: { - id: OPS.setFillColorSpace, - numArgs: 1, - variableArgs: false - }, - SC: { - id: OPS.setStrokeColor, - numArgs: 4, - variableArgs: true - }, - SCN: { - id: OPS.setStrokeColorN, - numArgs: 33, - variableArgs: true - }, - sc: { - id: OPS.setFillColor, - numArgs: 4, - variableArgs: true - }, - scn: { - id: OPS.setFillColorN, - numArgs: 33, - variableArgs: true - }, - G: { - id: OPS.setStrokeGray, - numArgs: 1, - variableArgs: false - }, - g: { - id: OPS.setFillGray, - numArgs: 1, - variableArgs: false - }, - RG: { - id: OPS.setStrokeRGBColor, - numArgs: 3, - variableArgs: false - }, - rg: { - id: OPS.setFillRGBColor, - numArgs: 3, - variableArgs: false - }, - K: { - id: OPS.setStrokeCMYKColor, - numArgs: 4, - variableArgs: false - }, - k: { - id: OPS.setFillCMYKColor, - numArgs: 4, - variableArgs: false - }, - sh: { - id: OPS.shadingFill, - numArgs: 1, - variableArgs: false - }, - BI: { - id: OPS.beginInlineImage, - numArgs: 0, - variableArgs: false - }, - ID: { - id: OPS.beginImageData, - numArgs: 0, - variableArgs: false - }, - EI: { - id: OPS.endInlineImage, - numArgs: 1, - variableArgs: false - }, - Do: { - id: OPS.paintXObject, - numArgs: 1, - variableArgs: false - }, - MP: { - id: OPS.markPoint, - numArgs: 1, - variableArgs: false - }, - DP: { - id: OPS.markPointProps, - numArgs: 2, - variableArgs: false - }, - BMC: { - id: OPS.beginMarkedContent, - numArgs: 1, - variableArgs: false - }, - BDC: { - id: OPS.beginMarkedContentProps, - numArgs: 2, - variableArgs: false - }, - EMC: { - id: OPS.endMarkedContent, - numArgs: 0, - variableArgs: false - }, - BX: { - id: OPS.beginCompat, - numArgs: 0, - variableArgs: false - }, - EX: { - id: OPS.endCompat, - numArgs: 0, - variableArgs: false - }, - BM: null, - BD: null, - true: null, - fa: null, - fal: null, - fals: null, - false: null, - nu: null, - nul: null, - null: null - })); - } - static MAX_INVALID_PATH_OPS = 10; - constructor(stream, xref, stateManager = new StateManager()) { - this.parser = new Parser({ - lexer: new Lexer(stream, EvaluatorPreprocessor.opMap), - xref - }); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - this._isPathOp = false; - this._numInvalidPathOPS = 0; - } - get savedStatesDepth() { - return this.stateManager.stateStack.length; - } - read(operation) { - let args = operation.args; - while (true) { - const obj = this.parser.getObj(); - if (obj instanceof Cmd) { - const cmd = obj.cmd; - const opSpec = EvaluatorPreprocessor.opMap[cmd]; - if (!opSpec) { - warn(`Unknown command "${cmd}".`); - continue; - } - const fn = opSpec.id; - const numArgs = opSpec.numArgs; - let argsLength = args !== null ? args.length : 0; - if (!this._isPathOp) { - this._numInvalidPathOPS = 0; - } - this._isPathOp = fn >= OPS.moveTo && fn <= OPS.endPath; - if (!opSpec.variableArgs) { - if (argsLength !== numArgs) { - const nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (args === null) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - if (argsLength < numArgs) { - const partialMsg = `command ${cmd}: expected ${numArgs} args, ` + `but received ${argsLength} args.`; - if (this._isPathOp && ++this._numInvalidPathOPS > EvaluatorPreprocessor.MAX_INVALID_PATH_OPS) { - throw new FormatError(`Invalid ${partialMsg}`); - } - warn(`Skipping ${partialMsg}`); - if (args !== null) { - args.length = 0; - } - continue; - } - } else if (argsLength > numArgs) { - info(`Command ${cmd}: expected [0, ${numArgs}] args, ` + `but received ${argsLength} args.`); - } - this.preprocessCommand(fn, args); - operation.fn = fn; - operation.args = args; - return true; - } - if (obj === EOF) { - return false; - } - if (obj !== null) { - if (args === null) { - args = []; - } - args.push(obj); - if (args.length > 33) { - throw new FormatError("Too many arguments"); - } - } - } - } - preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } -} - -;// ./src/core/default_appearance.js - - - - - - - - -class DefaultAppearanceEvaluator extends EvaluatorPreprocessor { - constructor(str) { - super(new StringStream(str)); - } - parse() { - const operation = { - fn: 0, - args: [] - }; - const result = { - fontSize: 0, - fontName: "", - fontColor: new Uint8ClampedArray(3) - }; - try { - while (true) { - operation.args.length = 0; - if (!this.read(operation)) { - break; - } - if (this.savedStatesDepth !== 0) { - continue; - } - const { - fn, - args - } = operation; - switch (fn | 0) { - case OPS.setFont: - const [fontName, fontSize] = args; - if (fontName instanceof Name) { - result.fontName = fontName.name; - } - if (typeof fontSize === "number" && fontSize > 0) { - result.fontSize = fontSize; - } - break; - case OPS.setFillRGBColor: - ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.setFillGray: - ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.setFillCMYKColor: - ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); - break; - } - } - } catch (reason) { - warn(`parseDefaultAppearance - ignoring errors: "${reason}".`); - } - return result; - } -} -function parseDefaultAppearance(str) { - return new DefaultAppearanceEvaluator(str).parse(); -} -class AppearanceStreamEvaluator extends EvaluatorPreprocessor { - constructor(stream, evaluatorOptions, xref, globalColorSpaceCache) { - super(stream); - this.stream = stream; - this.evaluatorOptions = evaluatorOptions; - this.xref = xref; - this.globalColorSpaceCache = globalColorSpaceCache; - this.resources = stream.dict?.get("Resources"); - } - parse() { - const operation = { - fn: 0, - args: [] - }; - let result = { - scaleFactor: 1, - fontSize: 0, - fontName: "", - fontColor: new Uint8ClampedArray(3), - fillColorSpace: ColorSpaceUtils.gray - }; - let breakLoop = false; - const stack = []; - try { - while (true) { - operation.args.length = 0; - if (breakLoop || !this.read(operation)) { - break; - } - const { - fn, - args - } = operation; - switch (fn | 0) { - case OPS.save: - stack.push({ - scaleFactor: result.scaleFactor, - fontSize: result.fontSize, - fontName: result.fontName, - fontColor: result.fontColor.slice(), - fillColorSpace: result.fillColorSpace - }); - break; - case OPS.restore: - result = stack.pop() || result; - break; - case OPS.setTextMatrix: - result.scaleFactor *= Math.hypot(args[0], args[1]); - break; - case OPS.setFont: - const [fontName, fontSize] = args; - if (fontName instanceof Name) { - result.fontName = fontName.name; - } - if (typeof fontSize === "number" && fontSize > 0) { - result.fontSize = fontSize * result.scaleFactor; - } - break; - case OPS.setFillColorSpace: - result.fillColorSpace = ColorSpaceUtils.parse({ - cs: args[0], - xref: this.xref, - resources: this.resources, - pdfFunctionFactory: this._pdfFunctionFactory, - globalColorSpaceCache: this.globalColorSpaceCache, - localColorSpaceCache: this._localColorSpaceCache - }); - break; - case OPS.setFillColor: - const cs = result.fillColorSpace; - cs.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.setFillRGBColor: - ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.setFillGray: - ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.setFillCMYKColor: - ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); - break; - case OPS.showText: - case OPS.showSpacedText: - case OPS.nextLineShowText: - case OPS.nextLineSetSpacingShowText: - breakLoop = true; - break; - } - } - } catch (reason) { - warn(`parseAppearanceStream - ignoring errors: "${reason}".`); - } - this.stream.reset(); - delete result.scaleFactor; - delete result.fillColorSpace; - return result; - } - get _localColorSpaceCache() { - return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); - } - get _pdfFunctionFactory() { - const pdfFunctionFactory = new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.evaluatorOptions.isEvalSupported - }); - return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); - } -} -function parseAppearanceStream(stream, evaluatorOptions, xref, globalColorSpaceCache) { - return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref, globalColorSpaceCache).parse(); -} -function getPdfColor(color, isFill) { - if (color[0] === color[1] && color[1] === color[2]) { - const gray = color[0] / 255; - return `${numberToString(gray)} ${isFill ? "g" : "G"}`; - } - return Array.from(color, c => numberToString(c / 255)).join(" ") + ` ${isFill ? "rg" : "RG"}`; -} -function createDefaultAppearance({ - fontSize, - fontName, - fontColor -}) { - return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; -} -class FakeUnicodeFont { - constructor(xref, fontFamily) { - this.xref = xref; - this.widths = null; - this.firstChar = Infinity; - this.lastChar = -Infinity; - this.fontFamily = fontFamily; - const canvas = new OffscreenCanvas(1, 1); - this.ctxMeasure = canvas.getContext("2d", { - willReadFrequently: true - }); - if (!FakeUnicodeFont._fontNameId) { - FakeUnicodeFont._fontNameId = 1; - } - this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); - } - get fontDescriptorRef() { - if (!FakeUnicodeFont._fontDescriptorRef) { - const fontDescriptor = new Dict(this.xref); - fontDescriptor.setIfName("Type", "FontDescriptor"); - fontDescriptor.set("FontName", this.fontName); - fontDescriptor.set("FontFamily", "MyriadPro Regular"); - fontDescriptor.set("FontBBox", [0, 0, 0, 0]); - fontDescriptor.setIfName("FontStretch", "Normal"); - fontDescriptor.set("FontWeight", 400); - fontDescriptor.set("ItalicAngle", 0); - FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); - } - return FakeUnicodeFont._fontDescriptorRef; - } - get descendantFontRef() { - const descendantFont = new Dict(this.xref); - descendantFont.set("BaseFont", this.fontName); - descendantFont.setIfName("Type", "Font"); - descendantFont.setIfName("Subtype", "CIDFontType0"); - descendantFont.setIfName("CIDToGIDMap", "Identity"); - descendantFont.set("FirstChar", this.firstChar); - descendantFont.set("LastChar", this.lastChar); - descendantFont.set("FontDescriptor", this.fontDescriptorRef); - descendantFont.set("DW", 1000); - const widths = []; - const chars = [...this.widths.entries()].sort(); - let currentChar = null; - let currentWidths = null; - for (const [char, width] of chars) { - if (!currentChar) { - currentChar = char; - currentWidths = [width]; - continue; - } - if (char === currentChar + currentWidths.length) { - currentWidths.push(width); - } else { - widths.push(currentChar, currentWidths); - currentChar = char; - currentWidths = [width]; - } - } - if (currentChar) { - widths.push(currentChar, currentWidths); - } - descendantFont.set("W", widths); - const cidSystemInfo = new Dict(this.xref); - cidSystemInfo.set("Ordering", "Identity"); - cidSystemInfo.set("Registry", "Adobe"); - cidSystemInfo.set("Supplement", 0); - descendantFont.set("CIDSystemInfo", cidSystemInfo); - return this.xref.getNewPersistentRef(descendantFont); - } - get baseFontRef() { - const baseFont = new Dict(this.xref); - baseFont.set("BaseFont", this.fontName); - baseFont.setIfName("Type", "Font"); - baseFont.setIfName("Subtype", "Type0"); - baseFont.setIfName("Encoding", "Identity-H"); - baseFont.set("DescendantFonts", [this.descendantFontRef]); - baseFont.setIfName("ToUnicode", "Identity-H"); - return this.xref.getNewPersistentRef(baseFont); - } - get resources() { - const resources = new Dict(this.xref); - const font = new Dict(this.xref); - font.set(this.fontName.name, this.baseFontRef); - resources.set("Font", font); - return resources; - } - _createContext() { - this.widths = new Map(); - this.ctxMeasure.font = `1000px ${this.fontFamily}`; - return this.ctxMeasure; - } - createFontResources(text) { - const ctx = this._createContext(); - for (const line of text.split(/\r\n?|\n/)) { - for (const char of line.split("")) { - const code = char.charCodeAt(0); - if (this.widths.has(code)) { - continue; - } - const metrics = ctx.measureText(char); - const width = Math.ceil(metrics.width); - this.widths.set(code, width); - this.firstChar = Math.min(code, this.firstChar); - this.lastChar = Math.max(code, this.lastChar); - } - } - return this.resources; - } - static getFirstPositionInfo(rect, rotation, fontSize) { - const [x1, y1, x2, y2] = rect; - let w = x2 - x1; - let h = y2 - y1; - if (rotation % 180 !== 0) { - [w, h] = [h, w]; - } - const lineHeight = LINE_FACTOR * fontSize; - const lineDescent = LINE_DESCENT_FACTOR * fontSize; - return { - coords: [0, h + lineDescent - lineHeight], - bbox: [0, 0, w, h], - matrix: rotation !== 0 ? getRotationMatrix(rotation, h, lineHeight) : undefined - }; - } - createAppearance(text, rect, rotation, fontSize, bgColor, strokeAlpha) { - const ctx = this._createContext(); - const lines = []; - let maxWidth = -Infinity; - for (const line of text.split(/\r\n?|\n/)) { - lines.push(line); - const lineWidth = ctx.measureText(line).width; - maxWidth = Math.max(maxWidth, lineWidth); - for (const code of codePointIter(line)) { - const char = String.fromCodePoint(code); - let width = this.widths.get(code); - if (width === undefined) { - const metrics = ctx.measureText(char); - width = Math.ceil(metrics.width); - this.widths.set(code, width); - this.firstChar = Math.min(code, this.firstChar); - this.lastChar = Math.max(code, this.lastChar); - } - } - } - maxWidth *= fontSize / 1000; - const [x1, y1, x2, y2] = rect; - let w = x2 - x1; - let h = y2 - y1; - if (rotation % 180 !== 0) { - [w, h] = [h, w]; - } - let hscale = 1; - if (maxWidth > w) { - hscale = w / maxWidth; - } - let vscale = 1; - const lineHeight = LINE_FACTOR * fontSize; - const lineDescent = LINE_DESCENT_FACTOR * fontSize; - const maxHeight = lineHeight * lines.length; - if (maxHeight > h) { - vscale = h / maxHeight; - } - const fscale = Math.min(hscale, vscale); - const newFontSize = fontSize * fscale; - const buffer = ["q", `0 0 ${numberToString(w)} ${numberToString(h)} re W n`, `BT`, `1 0 0 1 0 ${numberToString(h + lineDescent)} Tm 0 Tc ${getPdfColor(bgColor, true)}`, `/${this.fontName.name} ${numberToString(newFontSize)} Tf`]; - const { - resources - } = this; - strokeAlpha = typeof strokeAlpha === "number" && strokeAlpha >= 0 && strokeAlpha <= 1 ? strokeAlpha : 1; - if (strokeAlpha !== 1) { - buffer.push("/R0 gs"); - const extGState = new Dict(this.xref); - const r0 = new Dict(this.xref); - r0.set("ca", strokeAlpha); - r0.set("CA", strokeAlpha); - r0.setIfName("Type", "ExtGState"); - extGState.set("R0", r0); - resources.set("ExtGState", extGState); - } - const vShift = numberToString(lineHeight); - for (const line of lines) { - buffer.push(`0 -${vShift} Td <${stringToUTF16HexString(line)}> Tj`); - } - buffer.push("ET", "Q"); - const appearance = buffer.join("\n"); - const appearanceStreamDict = new Dict(this.xref); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", [0, 0, w, h]); - appearanceStreamDict.set("Length", appearance.length); - appearanceStreamDict.set("Resources", resources); - if (rotation) { - const matrix = getRotationMatrix(rotation, w, h); - appearanceStreamDict.set("Matrix", matrix); - } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } -} - -;// ./src/shared/scripting_utils.js -function makeColorComp(n) { - return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); -} -function scaleAndClamp(x) { - return Math.max(0, Math.min(255, 255 * x)); -} -class ColorConverters { - static CMYK_G([c, y, m, k]) { - return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; - } - static G_CMYK([g]) { - return ["CMYK", 0, 0, 0, 1 - g]; - } - static G_RGB([g]) { - return ["RGB", g, g, g]; - } - static G_rgb([g]) { - g = scaleAndClamp(g); - return [g, g, g]; - } - static G_HTML([g]) { - const G = makeColorComp(g); - return `#${G}${G}${G}`; - } - static RGB_G([r, g, b]) { - return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; - } - static RGB_rgb(color) { - return color.map(scaleAndClamp); - } - static RGB_HTML(color) { - return `#${color.map(makeColorComp).join("")}`; - } - static T_HTML() { - return "#00000000"; - } - static T_rgb() { - return [null]; - } - static CMYK_RGB([c, y, m, k]) { - return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; - } - static CMYK_rgb([c, y, m, k]) { - return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; - } - static CMYK_HTML(components) { - const rgb = this.CMYK_RGB(components).slice(1); - return this.RGB_HTML(rgb); - } - static RGB_CMYK([r, g, b]) { - const c = 1 - r; - const m = 1 - g; - const y = 1 - b; - const k = Math.min(c, m, y); - return ["CMYK", c, m, y, k]; - } -} -const DateFormats = ["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"]; -const TimeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"]; - -;// ./src/core/name_number_tree.js - - -class NameOrNumberTree { - constructor(root, xref, type) { - this.root = root; - this.xref = xref; - this._type = type; - } - getAll() { - const map = new Map(); - if (!this.root) { - return map; - } - const xref = this.xref; - const processed = new RefSet(); - processed.put(this.root); - const queue = [this.root]; - while (queue.length > 0) { - const obj = xref.fetchIfRef(queue.shift()); - if (!(obj instanceof Dict)) { - continue; - } - if (obj.has("Kids")) { - const kids = obj.get("Kids"); - if (!Array.isArray(kids)) { - continue; - } - for (const kid of kids) { - if (processed.has(kid)) { - throw new FormatError(`Duplicate entry in "${this._type}" tree.`); - } - queue.push(kid); - processed.put(kid); - } - continue; - } - const entries = obj.get(this._type); - if (!Array.isArray(entries)) { - continue; - } - for (let i = 0, ii = entries.length; i < ii; i += 2) { - map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); - } - } - return map; - } - getRaw(key) { - if (!this.root) { - return null; - } - const xref = this.xref; - let kidsOrEntries = xref.fetchIfRef(this.root); - let loopCount = 0; - const MAX_LEVELS = 10; - while (kidsOrEntries.has("Kids")) { - if (++loopCount > MAX_LEVELS) { - warn(`Search depth limit reached for "${this._type}" tree.`); - return null; - } - const kids = kidsOrEntries.get("Kids"); - if (!Array.isArray(kids)) { - return null; - } - let l = 0, - r = kids.length - 1; - while (l <= r) { - const m = l + r >> 1; - const kid = xref.fetchIfRef(kids[m]); - const limits = kid.get("Limits"); - if (key < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (key > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrEntries = kid; - break; - } - } - if (l > r) { - return null; - } - } - const entries = kidsOrEntries.get(this._type); - if (Array.isArray(entries)) { - let l = 0, - r = entries.length - 2; - while (l <= r) { - const tmp = l + r >> 1, - m = tmp + (tmp & 1); - const currentKey = xref.fetchIfRef(entries[m]); - if (key < currentKey) { - r = m - 2; - } else if (key > currentKey) { - l = m + 2; - } else { - return entries[m + 1]; - } - } - } - return null; - } - get(key) { - return this.xref.fetchIfRef(this.getRaw(key)); - } -} -class NameTree extends NameOrNumberTree { - constructor(root, xref) { - super(root, xref, "Names"); - } -} -class NumberTree extends NameOrNumberTree { - constructor(root, xref) { - super(root, xref, "Nums"); - } -} - -;// ./src/core/cleanup_helper.js - - - - -function clearGlobalCaches() { - clearPatternCaches(); - clearPrimitiveCaches(); - clearUnicodeCaches(); - JpxImage.cleanup(); -} - -;// ./src/core/file_spec.js - - - -function pickPlatformItem(dict) { - if (!(dict instanceof Dict)) { - return null; - } - if (dict.has("UF")) { - return dict.get("UF"); - } else if (dict.has("F")) { - return dict.get("F"); - } else if (dict.has("Unix")) { - return dict.get("Unix"); - } else if (dict.has("Mac")) { - return dict.get("Mac"); - } else if (dict.has("DOS")) { - return dict.get("DOS"); - } - return null; -} -function stripPath(str) { - return str.substring(str.lastIndexOf("/") + 1); -} -class FileSpec { - #contentAvailable = false; - constructor(root, xref, skipContent = false) { - if (!(root instanceof Dict)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has("FS")) { - this.fs = root.get("FS"); - } - if (root.has("RF")) { - warn("Related file specifications are not supported"); - } - if (!skipContent) { - if (root.has("EF")) { - this.#contentAvailable = true; - } else { - warn("Non-embedded file specifications are not supported"); - } - } - } - get filename() { - let filename = ""; - const item = pickPlatformItem(this.root); - if (item && typeof item === "string") { - filename = stringToPDFString(item, true).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); - } - return shadow(this, "filename", filename || "unnamed"); - } - get content() { - if (!this.#contentAvailable) { - return null; - } - this._contentRef ||= pickPlatformItem(this.root?.get("EF")); - let content = null; - if (this._contentRef) { - const fileObj = this.xref.fetchIfRef(this._contentRef); - if (fileObj instanceof BaseStream) { - content = fileObj.getBytes(); - } else { - warn("Embedded file specification points to non-existing/invalid content"); - } - } else { - warn("Embedded file specification does not have any content"); - } - return content; - } - get description() { - let description = ""; - const desc = this.root?.get("Desc"); - if (desc && typeof desc === "string") { - description = stringToPDFString(desc); - } - return shadow(this, "description", description); - } - get serializable() { - return { - rawFilename: this.filename, - filename: stripPath(this.filename), - content: this.content, - description: this.description - }; - } -} - -;// ./src/core/xml_parser.js - -const XMLParserErrorCode = { - NoError: 0, - EndOfDocument: -1, - UnterminatedCdat: -2, - UnterminatedXmlDeclaration: -3, - UnterminatedDoctypeDeclaration: -4, - UnterminatedComment: -5, - MalformedElement: -6, - OutOfMemory: -7, - UnterminatedAttributeValue: -8, - UnterminatedElement: -9, - ElementNeverBegun: -10 -}; -function isWhitespace(s, index) { - const ch = s[index]; - return ch === " " || ch === "\n" || ch === "\r" || ch === "\t"; -} -function isWhitespaceString(s) { - for (let i = 0, ii = s.length; i < ii; i++) { - if (!isWhitespace(s, i)) { - return false; - } - } - return true; -} -class XMLParserBase { - _resolveEntities(s) { - return s.replaceAll(/&([^;]+);/g, (all, entity) => { - if (entity.substring(0, 2) === "#x") { - return String.fromCodePoint(parseInt(entity.substring(2), 16)); - } else if (entity.substring(0, 1) === "#") { - return String.fromCodePoint(parseInt(entity.substring(1), 10)); - } - switch (entity) { - case "lt": - return "<"; - case "gt": - return ">"; - case "amp": - return "&"; - case "quot": - return '"'; - case "apos": - return "'"; - } - return this.onResolveEntity(entity); - }); - } - _parseContent(s, start) { - const attributes = []; - let pos = start; - function skipWs() { - while (pos < s.length && isWhitespace(s, pos)) { - ++pos; - } - } - while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "/") { - ++pos; - } - const name = s.substring(start, pos); - skipWs(); - while (pos < s.length && s[pos] !== ">" && s[pos] !== "/" && s[pos] !== "?") { - skipWs(); - let attrName = "", - attrValue = ""; - while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== "=") { - attrName += s[pos]; - ++pos; - } - skipWs(); - if (s[pos] !== "=") { - return null; - } - ++pos; - skipWs(); - const attrEndChar = s[pos]; - if (attrEndChar !== '"' && attrEndChar !== "'") { - return null; - } - const attrEndIndex = s.indexOf(attrEndChar, ++pos); - if (attrEndIndex < 0) { - return null; - } - attrValue = s.substring(pos, attrEndIndex); - attributes.push({ - name: attrName, - value: this._resolveEntities(attrValue) - }); - pos = attrEndIndex + 1; - skipWs(); - } - return { - name, - attributes, - parsed: pos - start - }; - } - _parseProcessingInstruction(s, start) { - let pos = start; - function skipWs() { - while (pos < s.length && isWhitespace(s, pos)) { - ++pos; - } - } - while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== ">" && s[pos] !== "?" && s[pos] !== "/") { - ++pos; - } - const name = s.substring(start, pos); - skipWs(); - const attrStart = pos; - while (pos < s.length && (s[pos] !== "?" || s[pos + 1] !== ">")) { - ++pos; - } - const value = s.substring(attrStart, pos); - return { - name, - value, - parsed: pos - start - }; - } - parseXml(s) { - let i = 0; - while (i < s.length) { - const ch = s[i]; - let j = i; - if (ch === "<") { - ++j; - const ch2 = s[j]; - let q; - switch (ch2) { - case "/": - ++j; - q = s.indexOf(">", j); - if (q < 0) { - this.onError(XMLParserErrorCode.UnterminatedElement); - return; - } - this.onEndElement(s.substring(j, q)); - j = q + 1; - break; - case "?": - ++j; - const pi = this._parseProcessingInstruction(s, j); - if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== "?>") { - this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration); - return; - } - this.onPi(pi.name, pi.value); - j += pi.parsed + 2; - break; - case "!": - if (s.substring(j + 1, j + 3) === "--") { - q = s.indexOf("-->", j + 3); - if (q < 0) { - this.onError(XMLParserErrorCode.UnterminatedComment); - return; - } - this.onComment(s.substring(j + 3, q)); - j = q + 3; - } else if (s.substring(j + 1, j + 8) === "[CDATA[") { - q = s.indexOf("]]>", j + 8); - if (q < 0) { - this.onError(XMLParserErrorCode.UnterminatedCdat); - return; - } - this.onCdata(s.substring(j + 8, q)); - j = q + 3; - } else if (s.substring(j + 1, j + 8) === "DOCTYPE") { - const q2 = s.indexOf("[", j + 8); - let complexDoctype = false; - q = s.indexOf(">", j + 8); - if (q < 0) { - this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); - return; - } - if (q2 > 0 && q > q2) { - q = s.indexOf("]>", j + 8); - if (q < 0) { - this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); - return; - } - complexDoctype = true; - } - const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); - this.onDoctype(doctypeContent); - j = q + (complexDoctype ? 2 : 1); - } else { - this.onError(XMLParserErrorCode.MalformedElement); - return; - } - break; - default: - const content = this._parseContent(s, j); - if (content === null) { - this.onError(XMLParserErrorCode.MalformedElement); - return; - } - let isClosed = false; - if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { - isClosed = true; - } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { - this.onError(XMLParserErrorCode.UnterminatedElement); - return; - } - this.onBeginElement(content.name, content.attributes, isClosed); - j += content.parsed + (isClosed ? 2 : 1); - break; - } - } else { - while (j < s.length && s[j] !== "<") { - j++; - } - const text = s.substring(i, j); - this.onText(this._resolveEntities(text)); - } - i = j; - } - } - onResolveEntity(name) { - return `&${name};`; - } - onPi(name, value) {} - onComment(text) {} - onCdata(text) {} - onDoctype(doctypeContent) {} - onText(text) {} - onBeginElement(name, attributes, isEmpty) {} - onEndElement(name) {} - onError(code) {} -} -class SimpleDOMNode { - constructor(nodeName, nodeValue) { - this.nodeName = nodeName; - this.nodeValue = nodeValue; - Object.defineProperty(this, "parentNode", { - value: null, - writable: true - }); - } - get firstChild() { - return this.childNodes?.[0]; - } - get nextSibling() { - const childNodes = this.parentNode.childNodes; - if (!childNodes) { - return undefined; - } - const index = childNodes.indexOf(this); - if (index === -1) { - return undefined; - } - return childNodes[index + 1]; - } - get textContent() { - if (!this.childNodes) { - return this.nodeValue || ""; - } - return this.childNodes.map(child => child.textContent).join(""); - } - get children() { - return this.childNodes || []; - } - hasChildNodes() { - return this.childNodes?.length > 0; - } - searchNode(paths, pos) { - if (pos >= paths.length) { - return this; - } - const component = paths[pos]; - if (component.name.startsWith("#") && pos < paths.length - 1) { - return this.searchNode(paths, pos + 1); - } - const stack = []; - let node = this; - while (true) { - if (component.name === node.nodeName) { - if (component.pos === 0) { - const res = node.searchNode(paths, pos + 1); - if (res !== null) { - return res; - } - } else if (stack.length === 0) { - return null; - } else { - const [parent] = stack.pop(); - let siblingPos = 0; - for (const child of parent.childNodes) { - if (component.name === child.nodeName) { - if (siblingPos === component.pos) { - return child.searchNode(paths, pos + 1); - } - siblingPos++; - } - } - return node.searchNode(paths, pos + 1); - } - } - if (node.childNodes?.length > 0) { - stack.push([node, 0]); - node = node.childNodes[0]; - } else if (stack.length === 0) { - return null; - } else { - while (stack.length !== 0) { - const [parent, currentPos] = stack.pop(); - const newPos = currentPos + 1; - if (newPos < parent.childNodes.length) { - stack.push([parent, newPos]); - node = parent.childNodes[newPos]; - break; - } - } - if (stack.length === 0) { - return null; - } - } - } - } - dump(buffer) { - if (this.nodeName === "#text") { - buffer.push(encodeToXmlString(this.nodeValue)); - return; - } - buffer.push(`<${this.nodeName}`); - if (this.attributes) { - for (const attribute of this.attributes) { - buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); - } - } - if (this.hasChildNodes()) { - buffer.push(">"); - for (const child of this.childNodes) { - child.dump(buffer); - } - buffer.push(``); - } else if (this.nodeValue) { - buffer.push(`>${encodeToXmlString(this.nodeValue)}`); - } else { - buffer.push("/>"); - } - } -} -class SimpleXMLParser extends XMLParserBase { - constructor({ - hasAttributes = false, - lowerCaseName = false - }) { - super(); - this._currentFragment = null; - this._stack = null; - this._errorCode = XMLParserErrorCode.NoError; - this._hasAttributes = hasAttributes; - this._lowerCaseName = lowerCaseName; - } - parseFromString(data) { - this._currentFragment = []; - this._stack = []; - this._errorCode = XMLParserErrorCode.NoError; - this.parseXml(data); - if (this._errorCode !== XMLParserErrorCode.NoError) { - return undefined; - } - const [documentElement] = this._currentFragment; - if (!documentElement) { - return undefined; - } - return { - documentElement - }; - } - onText(text) { - if (isWhitespaceString(text)) { - return; - } - const node = new SimpleDOMNode("#text", text); - this._currentFragment.push(node); - } - onCdata(text) { - const node = new SimpleDOMNode("#text", text); - this._currentFragment.push(node); - } - onBeginElement(name, attributes, isEmpty) { - if (this._lowerCaseName) { - name = name.toLowerCase(); - } - const node = new SimpleDOMNode(name); - node.childNodes = []; - if (this._hasAttributes) { - node.attributes = attributes; - } - this._currentFragment.push(node); - if (isEmpty) { - return; - } - this._stack.push(this._currentFragment); - this._currentFragment = node.childNodes; - } - onEndElement(name) { - this._currentFragment = this._stack.pop() || []; - const lastElement = this._currentFragment.at(-1); - if (!lastElement) { - return null; - } - for (const childNode of lastElement.childNodes) { - childNode.parentNode = lastElement; - } - return lastElement; - } - onError(code) { - this._errorCode = code; - } -} - -;// ./src/core/metadata_parser.js - -class MetadataParser { - constructor(data) { - data = this._repair(data); - const parser = new SimpleXMLParser({ - lowerCaseName: true - }); - const xmlDocument = parser.parseFromString(data); - this._metadataMap = new Map(); - this._data = data; - if (xmlDocument) { - this._parse(xmlDocument); - } - } - _repair(data) { - return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { - const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { - switch (name) { - case "amp": - return "&"; - case "apos": - return "'"; - case "gt": - return ">"; - case "lt": - return "<"; - case "quot": - return '"'; - } - throw new Error(`_repair: ${name} isn't defined.`); - }); - const charBuf = [">"]; - for (let i = 0, ii = bytes.length; i < ii; i += 2) { - const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { - charBuf.push(String.fromCharCode(code)); - } else { - charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); - } - } - return charBuf.join(""); - }); - } - _getSequence(entry) { - const name = entry.nodeName; - if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { - return null; - } - return entry.childNodes.filter(node => node.nodeName === "rdf:li"); - } - _parseArray(entry) { - if (!entry.hasChildNodes()) { - return; - } - const [seqNode] = entry.childNodes; - const sequence = this._getSequence(seqNode) || []; - this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); - } - _parse(xmlDocument) { - let rdf = xmlDocument.documentElement; - if (rdf.nodeName !== "rdf:rdf") { - rdf = rdf.firstChild; - while (rdf && rdf.nodeName !== "rdf:rdf") { - rdf = rdf.nextSibling; - } - } - if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { - return; - } - for (const desc of rdf.childNodes) { - if (desc.nodeName !== "rdf:description") { - continue; - } - for (const entry of desc.childNodes) { - const name = entry.nodeName; - switch (name) { - case "#text": - continue; - case "dc:creator": - case "dc:subject": - this._parseArray(entry); - continue; - } - this._metadataMap.set(name, entry.textContent.trim()); - } - } - } - get serializable() { - return { - parsedData: this._metadataMap, - rawData: this._data - }; - } -} - -;// ./src/core/struct_tree.js - - - - -const MAX_DEPTH = 40; -const StructElementType = { - PAGE_CONTENT: 1, - STREAM_CONTENT: 2, - OBJECT: 3, - ANNOTATION: 4, - ELEMENT: 5 -}; -class StructTreeRoot { - constructor(xref, rootDict, rootRef) { - this.xref = xref; - this.dict = rootDict; - this.ref = rootRef instanceof Ref ? rootRef : null; - this.roleMap = new Map(); - this.structParentIds = null; - } - init() { - this.readRoleMap(); - } - #addIdToPage(pageRef, id, type) { - if (!(pageRef instanceof Ref) || id < 0) { - return; - } - this.structParentIds ||= new RefSetCache(); - let ids = this.structParentIds.get(pageRef); - if (!ids) { - ids = []; - this.structParentIds.put(pageRef, ids); - } - ids.push([id, type]); - } - addAnnotationIdToPage(pageRef, id) { - this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); - } - readRoleMap() { - const roleMapDict = this.dict.get("RoleMap"); - if (!(roleMapDict instanceof Dict)) { - return; - } - for (const [key, value] of roleMapDict) { - if (value instanceof Name) { - this.roleMap.set(key, value.name); - } - } - } - static async canCreateStructureTree({ - catalogRef, - pdfManager, - newAnnotationsByPage - }) { - if (!(catalogRef instanceof Ref)) { - warn("Cannot save the struct tree: no catalog reference."); - return false; - } - let nextKey = 0; - let hasNothingToUpdate = true; - for (const [pageIndex, elements] of newAnnotationsByPage) { - const { - ref: pageRef - } = await pdfManager.getPage(pageIndex); - if (!(pageRef instanceof Ref)) { - warn(`Cannot save the struct tree: page ${pageIndex} has no ref.`); - hasNothingToUpdate = true; - break; - } - for (const element of elements) { - if (element.accessibilityData?.type) { - element.parentTreeId = nextKey++; - hasNothingToUpdate = false; - } - } - } - if (hasNothingToUpdate) { - for (const elements of newAnnotationsByPage.values()) { - for (const element of elements) { - delete element.parentTreeId; - } - } - return false; - } - return true; - } - static async createStructureTree({ - newAnnotationsByPage, - xref, - catalogRef, - pdfManager, - changes - }) { - const root = await pdfManager.ensureCatalog("cloneDict"); - const cache = new RefSetCache(); - cache.put(catalogRef, root); - const structTreeRootRef = xref.getNewTemporaryRef(); - root.set("StructTreeRoot", structTreeRootRef); - const structTreeRoot = new Dict(xref); - structTreeRoot.set("Type", Name.get("StructTreeRoot")); - const parentTreeRef = xref.getNewTemporaryRef(); - structTreeRoot.set("ParentTree", parentTreeRef); - const kids = []; - structTreeRoot.set("K", kids); - cache.put(structTreeRootRef, structTreeRoot); - const parentTree = new Dict(xref); - const nums = []; - parentTree.set("Nums", nums); - const nextKey = await this.#writeKids({ - newAnnotationsByPage, - structTreeRootRef, - structTreeRoot: null, - kids, - nums, - xref, - pdfManager, - changes, - cache - }); - structTreeRoot.set("ParentTreeNextKey", nextKey); - cache.put(parentTreeRef, parentTree); - for (const [ref, obj] of cache.items()) { - changes.put(ref, { - data: obj - }); - } - } - async canUpdateStructTree({ - pdfManager, - newAnnotationsByPage - }) { - if (!this.ref) { - warn("Cannot update the struct tree: no root reference."); - return false; - } - let nextKey = this.dict.get("ParentTreeNextKey"); - if (!Number.isInteger(nextKey) || nextKey < 0) { - warn("Cannot update the struct tree: invalid next key."); - return false; - } - const parentTree = this.dict.get("ParentTree"); - if (!(parentTree instanceof Dict)) { - warn("Cannot update the struct tree: ParentTree isn't a dict."); - return false; - } - const nums = parentTree.get("Nums"); - if (!Array.isArray(nums)) { - warn("Cannot update the struct tree: nums isn't an array."); - return false; - } - const numberTree = new NumberTree(parentTree, this.xref); - for (const pageIndex of newAnnotationsByPage.keys()) { - const { - pageDict - } = await pdfManager.getPage(pageIndex); - if (!pageDict.has("StructParents")) { - continue; - } - const id = pageDict.get("StructParents"); - if (!Number.isInteger(id) || !Array.isArray(numberTree.get(id))) { - warn(`Cannot save the struct tree: page ${pageIndex} has a wrong id.`); - return false; - } - } - let hasNothingToUpdate = true; - for (const [pageIndex, elements] of newAnnotationsByPage) { - const { - pageDict - } = await pdfManager.getPage(pageIndex); - StructTreeRoot.#collectParents({ - elements, - xref: this.xref, - pageDict, - numberTree - }); - for (const element of elements) { - if (element.accessibilityData?.type) { - if (!(element.accessibilityData.structParent >= 0)) { - element.parentTreeId = nextKey++; - } - hasNothingToUpdate = false; - } - } - } - if (hasNothingToUpdate) { - for (const elements of newAnnotationsByPage.values()) { - for (const element of elements) { - delete element.parentTreeId; - delete element.structTreeParent; - } - } - return false; - } - return true; - } - async updateStructureTree({ - newAnnotationsByPage, - pdfManager, - changes - }) { - const { - ref: structTreeRootRef, - xref - } = this; - const structTreeRoot = this.dict.clone(); - const cache = new RefSetCache(); - cache.put(structTreeRootRef, structTreeRoot); - let parentTreeRef = structTreeRoot.getRaw("ParentTree"); - let parentTree; - if (parentTreeRef instanceof Ref) { - parentTree = xref.fetch(parentTreeRef); - } else { - parentTree = parentTreeRef; - parentTreeRef = xref.getNewTemporaryRef(); - structTreeRoot.set("ParentTree", parentTreeRef); - } - parentTree = parentTree.clone(); - cache.put(parentTreeRef, parentTree); - let nums = parentTree.getRaw("Nums"); - let numsRef = null; - if (nums instanceof Ref) { - numsRef = nums; - nums = xref.fetch(numsRef); - } - nums = nums.slice(); - if (!numsRef) { - parentTree.set("Nums", nums); - } - const newNextKey = await StructTreeRoot.#writeKids({ - newAnnotationsByPage, - structTreeRootRef, - structTreeRoot: this, - kids: null, - nums, - xref, - pdfManager, - changes, - cache - }); - if (newNextKey === -1) { - return; - } - structTreeRoot.set("ParentTreeNextKey", newNextKey); - if (numsRef) { - cache.put(numsRef, nums); - } - for (const [ref, obj] of cache.items()) { - changes.put(ref, { - data: obj - }); - } - } - static async #writeKids({ - newAnnotationsByPage, - structTreeRootRef, - structTreeRoot, - kids, - nums, - xref, - pdfManager, - changes, - cache - }) { - const objr = Name.get("OBJR"); - let nextKey = -1; - let structTreePageObjs; - for (const [pageIndex, elements] of newAnnotationsByPage) { - const page = await pdfManager.getPage(pageIndex); - const { - ref: pageRef - } = page; - const isPageRef = pageRef instanceof Ref; - for (const { - accessibilityData, - ref, - parentTreeId, - structTreeParent - } of elements) { - if (!accessibilityData?.type) { - continue; - } - const { - structParent - } = accessibilityData; - if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) { - let objs = (structTreePageObjs ||= new Map()).get(pageIndex); - if (objs === undefined) { - const structTreePage = new StructTreePage(structTreeRoot, page.pageDict); - objs = structTreePage.collectObjects(pageRef); - structTreePageObjs.set(pageIndex, objs); - } - const objRef = objs?.get(structParent); - if (objRef) { - const tagDict = xref.fetch(objRef).clone(); - StructTreeRoot.#writeProperties(tagDict, accessibilityData); - changes.put(objRef, { - data: tagDict - }); - continue; - } - } - nextKey = Math.max(nextKey, parentTreeId); - const tagRef = xref.getNewTemporaryRef(); - const tagDict = new Dict(xref); - StructTreeRoot.#writeProperties(tagDict, accessibilityData); - await this.#updateParentTag({ - structTreeParent, - tagDict, - newTagRef: tagRef, - structTreeRootRef, - fallbackKids: kids, - xref, - cache - }); - const objDict = new Dict(xref); - tagDict.set("K", objDict); - objDict.set("Type", objr); - if (isPageRef) { - objDict.set("Pg", pageRef); - } - objDict.set("Obj", ref); - cache.put(tagRef, tagDict); - nums.push(parentTreeId, tagRef); - } - } - return nextKey + 1; - } - static #writeProperties(tagDict, { - type, - title, - lang, - alt, - expanded, - actualText - }) { - tagDict.set("S", Name.get(type)); - if (title) { - tagDict.set("T", stringToAsciiOrUTF16BE(title)); - } - if (lang) { - tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); - } - if (alt) { - tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); - } - if (expanded) { - tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); - } - if (actualText) { - tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); - } - } - static #collectParents({ - elements, - xref, - pageDict, - numberTree - }) { - const idToElements = new Map(); - for (const element of elements) { - if (element.structTreeParentId) { - const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); - let elems = idToElements.get(id); - if (!elems) { - elems = []; - idToElements.set(id, elems); - } - elems.push(element); - } - } - const id = pageDict.get("StructParents"); - if (!Number.isInteger(id)) { - return; - } - const parentArray = numberTree.get(id); - const updateElement = (kid, pageKid, kidRef) => { - const elems = idToElements.get(kid); - if (elems) { - const parentRef = pageKid.getRaw("P"); - const parentDict = xref.fetchIfRef(parentRef); - if (parentRef instanceof Ref && parentDict instanceof Dict) { - const params = { - ref: kidRef, - dict: pageKid - }; - for (const element of elems) { - element.structTreeParent = params; - } - } - return true; - } - return false; - }; - for (const kidRef of parentArray) { - if (!(kidRef instanceof Ref)) { - continue; - } - const pageKid = xref.fetch(kidRef); - const k = pageKid.get("K"); - if (Number.isInteger(k)) { - updateElement(k, pageKid, kidRef); - continue; - } - if (!Array.isArray(k)) { - continue; - } - for (let kid of k) { - kid = xref.fetchIfRef(kid); - if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { - break; - } - if (!(kid instanceof Dict)) { - continue; - } - if (!isName(kid.get("Type"), "MCR")) { - break; - } - const mcid = kid.get("MCID"); - if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { - break; - } - } - } - } - static async #updateParentTag({ - structTreeParent, - tagDict, - newTagRef, - structTreeRootRef, - fallbackKids, - xref, - cache - }) { - let ref = null; - let parentRef; - if (structTreeParent) { - ({ - ref - } = structTreeParent); - parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; - } else { - parentRef = structTreeRootRef; - } - tagDict.set("P", parentRef); - const parentDict = xref.fetchIfRef(parentRef); - if (!parentDict) { - fallbackKids.push(newTagRef); - return; - } - let cachedParentDict = cache.get(parentRef); - if (!cachedParentDict) { - cachedParentDict = parentDict.clone(); - cache.put(parentRef, cachedParentDict); - } - const parentKidsRaw = cachedParentDict.getRaw("K"); - let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; - if (!cachedParentKids) { - cachedParentKids = xref.fetchIfRef(parentKidsRaw); - cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw]; - const parentKidsRef = xref.getNewTemporaryRef(); - cachedParentDict.set("K", parentKidsRef); - cache.put(parentKidsRef, cachedParentKids); - } - const index = cachedParentKids.indexOf(ref); - cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef); - } -} -class StructElementNode { - constructor(tree, dict) { - this.tree = tree; - this.xref = tree.xref; - this.dict = dict; - this.kids = []; - this.parseKids(); - } - get role() { - const nameObj = this.dict.get("S"); - const name = nameObj instanceof Name ? nameObj.name : ""; - const { - root - } = this.tree; - return root.roleMap.get(name) ?? name; - } - parseKids() { - let pageObjId = null; - const objRef = this.dict.getRaw("Pg"); - if (objRef instanceof Ref) { - pageObjId = objRef.toString(); - } - const kids = this.dict.get("K"); - if (Array.isArray(kids)) { - for (const kid of kids) { - const element = this.parseKid(pageObjId, this.xref.fetchIfRef(kid)); - if (element) { - this.kids.push(element); - } - } - } else { - const element = this.parseKid(pageObjId, kids); - if (element) { - this.kids.push(element); - } - } - } - parseKid(pageObjId, kid) { - if (Number.isInteger(kid)) { - if (this.tree.pageDict.objId !== pageObjId) { - return null; - } - return new StructElement({ - type: StructElementType.PAGE_CONTENT, - mcid: kid, - pageObjId - }); - } - if (!(kid instanceof Dict)) { - return null; - } - const pageRef = kid.getRaw("Pg"); - if (pageRef instanceof Ref) { - pageObjId = pageRef.toString(); - } - const type = kid.get("Type") instanceof Name ? kid.get("Type").name : null; - if (type === "MCR") { - if (this.tree.pageDict.objId !== pageObjId) { - return null; - } - const kidRef = kid.getRaw("Stm"); - return new StructElement({ - type: StructElementType.STREAM_CONTENT, - refObjId: kidRef instanceof Ref ? kidRef.toString() : null, - pageObjId, - mcid: kid.get("MCID") - }); - } - if (type === "OBJR") { - if (this.tree.pageDict.objId !== pageObjId) { - return null; - } - const kidRef = kid.getRaw("Obj"); - return new StructElement({ - type: StructElementType.OBJECT, - refObjId: kidRef instanceof Ref ? kidRef.toString() : null, - pageObjId - }); - } - return new StructElement({ - type: StructElementType.ELEMENT, - dict: kid - }); - } -} -class StructElement { - constructor({ - type, - dict = null, - mcid = null, - pageObjId = null, - refObjId = null - }) { - this.type = type; - this.dict = dict; - this.mcid = mcid; - this.pageObjId = pageObjId; - this.refObjId = refObjId; - this.parentNode = null; - } -} -class StructTreePage { - constructor(structTreeRoot, pageDict) { - this.root = structTreeRoot; - this.xref = structTreeRoot?.xref ?? null; - this.rootDict = structTreeRoot?.dict ?? null; - this.pageDict = pageDict; - this.nodes = []; - } - collectObjects(pageRef) { - if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { - return null; - } - const parentTree = this.rootDict.get("ParentTree"); - if (!parentTree) { - return null; - } - const ids = this.root.structParentIds?.get(pageRef); - if (!ids) { - return null; - } - const map = new Map(); - const numberTree = new NumberTree(parentTree, this.xref); - for (const [elemId] of ids) { - const obj = numberTree.getRaw(elemId); - if (obj instanceof Ref) { - map.set(elemId, obj); - } - } - return map; - } - parse(pageRef) { - if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { - return; - } - const parentTree = this.rootDict.get("ParentTree"); - if (!parentTree) { - return; - } - const id = this.pageDict.get("StructParents"); - const ids = this.root.structParentIds?.get(pageRef); - if (!Number.isInteger(id) && !ids) { - return; - } - const map = new Map(); - const numberTree = new NumberTree(parentTree, this.xref); - if (Number.isInteger(id)) { - const parentArray = numberTree.get(id); - if (Array.isArray(parentArray)) { - for (const ref of parentArray) { - if (ref instanceof Ref) { - this.addNode(this.xref.fetch(ref), map); - } - } - } - } - if (!ids) { - return; - } - for (const [elemId, type] of ids) { - const obj = numberTree.get(elemId); - if (obj) { - const elem = this.addNode(this.xref.fetchIfRef(obj), map); - if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) { - elem.kids[0].type = type; - } - } - } - } - addNode(dict, map, level = 0) { - if (level > MAX_DEPTH) { - warn("StructTree MAX_DEPTH reached."); - return null; - } - if (!(dict instanceof Dict)) { - return null; - } - if (map.has(dict)) { - return map.get(dict); - } - const element = new StructElementNode(this, dict); - map.set(dict, element); - const parent = dict.get("P"); - if (!(parent instanceof Dict) || isName(parent.get("Type"), "StructTreeRoot")) { - if (!this.addTopLevelNode(dict, element)) { - map.delete(dict); - } - return element; - } - const parentNode = this.addNode(parent, map, level + 1); - if (!parentNode) { - return element; - } - let save = false; - for (const kid of parentNode.kids) { - if (kid.type === StructElementType.ELEMENT && kid.dict === dict) { - kid.parentNode = element; - save = true; - } - } - if (!save) { - map.delete(dict); - } - return element; - } - addTopLevelNode(dict, element) { - const obj = this.rootDict.get("K"); - if (!obj) { - return false; - } - if (obj instanceof Dict) { - if (obj.objId !== dict.objId) { - return false; - } - this.nodes[0] = element; - return true; - } - if (!Array.isArray(obj)) { - return true; - } - let save = false; - for (let i = 0; i < obj.length; i++) { - const kidRef = obj[i]; - if (kidRef?.toString() === dict.objId) { - this.nodes[i] = element; - save = true; - } - } - return save; - } - get serializable() { - function nodeToSerializable(node, parent, level = 0) { - if (level > MAX_DEPTH) { - warn("StructTree too deep to be fully serialized."); - return; - } - const obj = Object.create(null); - obj.role = node.role; - obj.children = []; - parent.children.push(obj); - let alt = node.dict.get("Alt"); - if (typeof alt !== "string") { - alt = node.dict.get("ActualText"); - } - if (typeof alt === "string") { - obj.alt = stringToPDFString(alt); - } - const a = node.dict.get("A"); - if (a instanceof Dict) { - const bbox = lookupNormalRect(a.getArray("BBox"), null); - if (bbox) { - obj.bbox = bbox; - } else { - const width = a.get("Width"); - const height = a.get("Height"); - if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { - obj.bbox = [0, 0, width, height]; - } - } - } - const lang = node.dict.get("Lang"); - if (typeof lang === "string") { - obj.lang = stringToPDFString(lang); - } - for (const kid of node.kids) { - const kidElement = kid.type === StructElementType.ELEMENT ? kid.parentNode : null; - if (kidElement) { - nodeToSerializable(kidElement, obj, level + 1); - continue; - } else if (kid.type === StructElementType.PAGE_CONTENT || kid.type === StructElementType.STREAM_CONTENT) { - obj.children.push({ - type: "content", - id: `p${kid.pageObjId}_mc${kid.mcid}` - }); - } else if (kid.type === StructElementType.OBJECT) { - obj.children.push({ - type: "object", - id: kid.refObjId - }); - } else if (kid.type === StructElementType.ANNOTATION) { - obj.children.push({ - type: "annotation", - id: `${AnnotationPrefix}${kid.refObjId}` - }); - } - } - } - const root = Object.create(null); - root.children = []; - root.role = "Root"; - for (const child of this.nodes) { - if (!child) { - continue; - } - nodeToSerializable(child, root); - } - return root; - } -} - -;// ./src/core/catalog.js - - - - - - - - - - - -const isRef = v => v instanceof Ref; -const isValidExplicitDest = _isValidExplicitDest.bind(null, isRef, isName); -function fetchDest(dest) { - if (dest instanceof Dict) { - dest = dest.get("D"); - } - return isValidExplicitDest(dest) ? dest : null; -} -function fetchRemoteDest(action) { - let dest = action.get("D"); - if (dest) { - if (dest instanceof Name) { - dest = dest.name; - } - if (typeof dest === "string") { - return stringToPDFString(dest, true); - } else if (isValidExplicitDest(dest)) { - return JSON.stringify(dest); - } - } - return null; -} -class Catalog { - #actualNumPages = null; - #catDict = null; - builtInCMapCache = new Map(); - fontCache = new RefSetCache(); - globalColorSpaceCache = new GlobalColorSpaceCache(); - globalImageCache = new GlobalImageCache(); - nonBlendModesSet = new RefSet(); - pageDictCache = new RefSetCache(); - pageIndexCache = new RefSetCache(); - pageKidsCountCache = new RefSetCache(); - standardFontDataCache = new Map(); - systemFontCache = new Map(); - constructor(pdfManager, xref) { - this.pdfManager = pdfManager; - this.xref = xref; - this.#catDict = xref.getCatalogObj(); - if (!(this.#catDict instanceof Dict)) { - throw new FormatError("Catalog object is not a dictionary."); - } - this.toplevelPagesDict; - } - cloneDict() { - return this.#catDict.clone(); - } - get version() { - const version = this.#catDict.get("Version"); - if (version instanceof Name) { - if (PDF_VERSION_REGEXP.test(version.name)) { - return shadow(this, "version", version.name); - } - warn(`Invalid PDF catalog version: ${version.name}`); - } - return shadow(this, "version", null); - } - get lang() { - const lang = this.#catDict.get("Lang"); - return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); - } - get needsRendering() { - const needsRendering = this.#catDict.get("NeedsRendering"); - return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); - } - get collection() { - let collection = null; - try { - const obj = this.#catDict.get("Collection"); - if (obj instanceof Dict && obj.size > 0) { - collection = obj; - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - info("Cannot fetch Collection entry; assuming no collection is present."); - } - return shadow(this, "collection", collection); - } - get acroForm() { - let acroForm = null; - try { - const obj = this.#catDict.get("AcroForm"); - if (obj instanceof Dict && obj.size > 0) { - acroForm = obj; - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - info("Cannot fetch AcroForm entry; assuming no forms are present."); - } - return shadow(this, "acroForm", acroForm); - } - get acroFormRef() { - const value = this.#catDict.getRaw("AcroForm"); - return shadow(this, "acroFormRef", value instanceof Ref ? value : null); - } - get metadata() { - const streamRef = this.#catDict.getRaw("Metadata"); - if (!(streamRef instanceof Ref)) { - return shadow(this, "metadata", null); - } - let metadata = null; - try { - const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); - if (stream instanceof BaseStream && stream.dict instanceof Dict) { - const type = stream.dict.get("Type"); - const subtype = stream.dict.get("Subtype"); - if (isName(type, "Metadata") && isName(subtype, "XML")) { - const data = stringToUTF8String(stream.getString()); - if (data) { - metadata = new MetadataParser(data).serializable; - } - } - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - info(`Skipping invalid Metadata: "${ex}".`); - } - return shadow(this, "metadata", metadata); - } - get markInfo() { - let markInfo = null; - try { - markInfo = this.#readMarkInfo(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Unable to read mark info."); - } - return shadow(this, "markInfo", markInfo); - } - #readMarkInfo() { - const obj = this.#catDict.get("MarkInfo"); - if (!(obj instanceof Dict)) { - return null; - } - const markInfo = { - Marked: false, - UserProperties: false, - Suspects: false - }; - for (const key in markInfo) { - const value = obj.get(key); - if (typeof value === "boolean") { - markInfo[key] = value; - } - } - return markInfo; - } - get structTreeRoot() { - let structTree = null; - try { - structTree = this.#readStructTreeRoot(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Unable read to structTreeRoot info."); - } - return shadow(this, "structTreeRoot", structTree); - } - #readStructTreeRoot() { - const rawObj = this.#catDict.getRaw("StructTreeRoot"); - const obj = this.xref.fetchIfRef(rawObj); - if (!(obj instanceof Dict)) { - return null; - } - const root = new StructTreeRoot(this.xref, obj, rawObj); - root.init(); - return root; - } - get toplevelPagesDict() { - const pagesObj = this.#catDict.get("Pages"); - if (!(pagesObj instanceof Dict)) { - throw new FormatError("Invalid top-level pages dictionary."); - } - return shadow(this, "toplevelPagesDict", pagesObj); - } - get documentOutline() { - let obj = null; - try { - obj = this.#readDocumentOutline(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Unable to read document outline."); - } - return shadow(this, "documentOutline", obj); - } - #readDocumentOutline() { - let obj = this.#catDict.get("Outlines"); - if (!(obj instanceof Dict)) { - return null; - } - obj = obj.getRaw("First"); - if (!(obj instanceof Ref)) { - return null; - } - const root = { - items: [] - }; - const queue = [{ - obj, - parent: root - }]; - const processed = new RefSet(); - processed.put(obj); - const xref = this.xref, - blackColor = new Uint8ClampedArray(3); - while (queue.length > 0) { - const i = queue.shift(); - const outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) { - continue; - } - if (!outlineDict.has("Title")) { - warn("Invalid outline item encountered."); - } - const data = { - url: null, - dest: null, - action: null - }; - Catalog.parseDestDictionary({ - destDict: outlineDict, - resultObj: data, - docBaseUrl: this.baseUrl, - docAttachments: this.attachments - }); - const title = outlineDict.get("Title"); - const flags = outlineDict.get("F") || 0; - const color = outlineDict.getArray("C"); - const count = outlineDict.get("Count"); - let rgbColor = blackColor; - if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { - rgbColor = ColorSpaceUtils.rgb.getRgb(color, 0); - } - const outlineItem = { - action: data.action, - attachment: data.attachment, - dest: data.dest, - url: data.url, - unsafeUrl: data.unsafeUrl, - newWindow: data.newWindow, - setOCGState: data.setOCGState, - title: typeof title === "string" ? stringToPDFString(title) : "", - color: rgbColor, - count: Number.isInteger(count) ? count : undefined, - bold: !!(flags & 2), - italic: !!(flags & 1), - items: [] - }; - i.parent.items.push(outlineItem); - obj = outlineDict.getRaw("First"); - if (obj instanceof Ref && !processed.has(obj)) { - queue.push({ - obj, - parent: outlineItem - }); - processed.put(obj); - } - obj = outlineDict.getRaw("Next"); - if (obj instanceof Ref && !processed.has(obj)) { - queue.push({ - obj, - parent: i.parent - }); - processed.put(obj); - } - } - return root.items.length > 0 ? root.items : null; - } - get permissions() { - let permissions = null; - try { - permissions = this.#readPermissions(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Unable to read permissions."); - } - return shadow(this, "permissions", permissions); - } - #readPermissions() { - const encrypt = this.xref.trailer.get("Encrypt"); - if (!(encrypt instanceof Dict)) { - return null; - } - let flags = encrypt.get("P"); - if (typeof flags !== "number") { - return null; - } - flags += 2 ** 32; - const permissions = []; - for (const key in PermissionFlag) { - const value = PermissionFlag[key]; - if (flags & value) { - permissions.push(value); - } - } - return permissions; - } - get optionalContentConfig() { - let config = null; - try { - const properties = this.#catDict.get("OCProperties"); - if (!properties) { - return shadow(this, "optionalContentConfig", null); - } - const defaultConfig = properties.get("D"); - if (!defaultConfig) { - return shadow(this, "optionalContentConfig", null); - } - const groupsData = properties.get("OCGs"); - if (!Array.isArray(groupsData)) { - return shadow(this, "optionalContentConfig", null); - } - const groupRefCache = new RefSetCache(); - for (const groupRef of groupsData) { - if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { - continue; - } - groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); - } - config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`Unable to read optional content config: ${ex}`); - } - return shadow(this, "optionalContentConfig", config); - } - #readOptionalContentGroup(groupRef) { - const group = this.xref.fetch(groupRef); - const obj = { - id: groupRef.toString(), - name: null, - intent: null, - usage: { - print: null, - view: null - }, - rbGroups: [] - }; - const name = group.get("Name"); - if (typeof name === "string") { - obj.name = stringToPDFString(name); - } - let intent = group.getArray("Intent"); - if (!Array.isArray(intent)) { - intent = [intent]; - } - if (intent.every(i => i instanceof Name)) { - obj.intent = intent.map(i => i.name); - } - const usage = group.get("Usage"); - if (!(usage instanceof Dict)) { - return obj; - } - const usageObj = obj.usage; - const print = usage.get("Print"); - if (print instanceof Dict) { - const printState = print.get("PrintState"); - if (printState instanceof Name) { - switch (printState.name) { - case "ON": - case "OFF": - usageObj.print = { - printState: printState.name - }; - } - } - } - const view = usage.get("View"); - if (view instanceof Dict) { - const viewState = view.get("ViewState"); - if (viewState instanceof Name) { - switch (viewState.name) { - case "ON": - case "OFF": - usageObj.view = { - viewState: viewState.name - }; - } - } - } - return obj; - } - #readOptionalContentConfig(config, groupRefCache) { - function parseOnOff(refs) { - const onParsed = []; - if (Array.isArray(refs)) { - for (const value of refs) { - if (value instanceof Ref && groupRefCache.has(value)) { - onParsed.push(value.toString()); - } - } - } - return onParsed; - } - function parseOrder(refs, nestedLevels = 0) { - if (!Array.isArray(refs)) { - return null; - } - const order = []; - for (const value of refs) { - if (value instanceof Ref && groupRefCache.has(value)) { - parsedOrderRefs.put(value); - order.push(value.toString()); - continue; - } - const nestedOrder = parseNestedOrder(value, nestedLevels); - if (nestedOrder) { - order.push(nestedOrder); - } - } - if (nestedLevels > 0) { - return order; - } - const hiddenGroups = []; - for (const [groupRef] of groupRefCache.items()) { - if (parsedOrderRefs.has(groupRef)) { - continue; - } - hiddenGroups.push(groupRef.toString()); - } - if (hiddenGroups.length) { - order.push({ - name: null, - order: hiddenGroups - }); - } - return order; - } - function parseNestedOrder(ref, nestedLevels) { - if (++nestedLevels > MAX_NESTED_LEVELS) { - warn("parseNestedOrder - reached MAX_NESTED_LEVELS."); - return null; - } - const value = xref.fetchIfRef(ref); - if (!Array.isArray(value)) { - return null; - } - const nestedName = xref.fetchIfRef(value[0]); - if (typeof nestedName !== "string") { - return null; - } - const nestedOrder = parseOrder(value.slice(1), nestedLevels); - if (!nestedOrder?.length) { - return null; - } - return { - name: stringToPDFString(nestedName), - order: nestedOrder - }; - } - function parseRBGroups(rbGroups) { - if (!Array.isArray(rbGroups)) { - return; - } - for (const value of rbGroups) { - const rbGroup = xref.fetchIfRef(value); - if (!Array.isArray(rbGroup) || !rbGroup.length) { - continue; - } - const parsedRbGroup = new Set(); - for (const ref of rbGroup) { - if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) { - parsedRbGroup.add(ref.toString()); - groupRefCache.get(ref).rbGroups.push(parsedRbGroup); - } - } - } - } - const xref = this.xref, - parsedOrderRefs = new RefSet(), - MAX_NESTED_LEVELS = 10; - parseRBGroups(config.get("RBGroups")); - return { - name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, - creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, - baseState: config.get("BaseState") instanceof Name ? config.get("BaseState").name : null, - on: parseOnOff(config.get("ON")), - off: parseOnOff(config.get("OFF")), - order: parseOrder(config.get("Order")), - groups: [...groupRefCache] - }; - } - setActualNumPages(num = null) { - this.#actualNumPages = num; - } - get hasActualNumPages() { - return this.#actualNumPages !== null; - } - get _pagesCount() { - const obj = this.toplevelPagesDict.get("Count"); - if (!Number.isInteger(obj)) { - throw new FormatError("Page count in top-level pages dictionary is not an integer."); - } - return shadow(this, "_pagesCount", obj); - } - get numPages() { - return this.#actualNumPages ?? this._pagesCount; - } - get destinations() { - const rawDests = this.#readDests(), - dests = Object.create(null); - for (const obj of rawDests) { - if (obj instanceof NameTree) { - for (const [key, value] of obj.getAll()) { - const dest = fetchDest(value); - if (dest) { - dests[stringToPDFString(key, true)] = dest; - } - } - } else if (obj instanceof Dict) { - for (const [key, value] of obj) { - const dest = fetchDest(value); - if (dest) { - dests[stringToPDFString(key, true)] ||= dest; - } - } - } - } - return shadow(this, "destinations", dests); - } - getDestination(id) { - if (this.hasOwnProperty("destinations")) { - return this.destinations[id] ?? null; - } - const rawDests = this.#readDests(); - for (const obj of rawDests) { - if (obj instanceof NameTree || obj instanceof Dict) { - const dest = fetchDest(obj.get(id)); - if (dest) { - return dest; - } - } - } - if (rawDests.length) { - const dest = this.destinations[id]; - if (dest) { - return dest; - } - } - return null; - } - #readDests() { - const obj = this.#catDict.get("Names"); - const rawDests = []; - if (obj?.has("Dests")) { - rawDests.push(new NameTree(obj.getRaw("Dests"), this.xref)); - } - if (this.#catDict.has("Dests")) { - rawDests.push(this.#catDict.get("Dests")); - } - return rawDests; - } - get pageLabels() { - let obj = null; - try { - obj = this.#readPageLabels(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Unable to read page labels."); - } - return shadow(this, "pageLabels", obj); - } - #readPageLabels() { - const obj = this.#catDict.getRaw("PageLabels"); - if (!obj) { - return null; - } - const pageLabels = new Array(this.numPages); - let style = null, - prefix = ""; - const numberTree = new NumberTree(obj, this.xref); - const nums = numberTree.getAll(); - let currentLabel = "", - currentIndex = 1; - for (let i = 0, ii = this.numPages; i < ii; i++) { - const labelDict = nums.get(i); - if (labelDict !== undefined) { - if (!(labelDict instanceof Dict)) { - throw new FormatError("PageLabel is not a dictionary."); - } - if (labelDict.has("Type") && !isName(labelDict.get("Type"), "PageLabel")) { - throw new FormatError("Invalid type in PageLabel dictionary."); - } - if (labelDict.has("S")) { - const s = labelDict.get("S"); - if (!(s instanceof Name)) { - throw new FormatError("Invalid style in PageLabel dictionary."); - } - style = s.name; - } else { - style = null; - } - if (labelDict.has("P")) { - const p = labelDict.get("P"); - if (typeof p !== "string") { - throw new FormatError("Invalid prefix in PageLabel dictionary."); - } - prefix = stringToPDFString(p); - } else { - prefix = ""; - } - if (labelDict.has("St")) { - const st = labelDict.get("St"); - if (!(Number.isInteger(st) && st >= 1)) { - throw new FormatError("Invalid start in PageLabel dictionary."); - } - currentIndex = st; - } else { - currentIndex = 1; - } - } - switch (style) { - case "D": - currentLabel = currentIndex; - break; - case "R": - case "r": - currentLabel = toRomanNumerals(currentIndex, style === "r"); - break; - case "A": - case "a": - const LIMIT = 26; - const A_UPPER_CASE = 0x41, - A_LOWER_CASE = 0x61; - const baseCharCode = style === "a" ? A_LOWER_CASE : A_UPPER_CASE; - const letterIndex = currentIndex - 1; - const character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); - currentLabel = character.repeat(Math.floor(letterIndex / LIMIT) + 1); - break; - default: - if (style) { - throw new FormatError(`Invalid style "${style}" in PageLabel dictionary.`); - } - currentLabel = ""; - } - pageLabels[i] = prefix + currentLabel; - currentIndex++; - } - return pageLabels; - } - get pageLayout() { - const obj = this.#catDict.get("PageLayout"); - let pageLayout = ""; - if (obj instanceof Name) { - switch (obj.name) { - case "SinglePage": - case "OneColumn": - case "TwoColumnLeft": - case "TwoColumnRight": - case "TwoPageLeft": - case "TwoPageRight": - pageLayout = obj.name; - } - } - return shadow(this, "pageLayout", pageLayout); - } - get pageMode() { - const obj = this.#catDict.get("PageMode"); - let pageMode = "UseNone"; - if (obj instanceof Name) { - switch (obj.name) { - case "UseNone": - case "UseOutlines": - case "UseThumbs": - case "FullScreen": - case "UseOC": - case "UseAttachments": - pageMode = obj.name; - } - } - return shadow(this, "pageMode", pageMode); - } - get viewerPreferences() { - const obj = this.#catDict.get("ViewerPreferences"); - if (!(obj instanceof Dict)) { - return shadow(this, "viewerPreferences", null); - } - let prefs = null; - for (const [key, value] of obj) { - let prefValue; - switch (key) { - case "HideToolbar": - case "HideMenubar": - case "HideWindowUI": - case "FitWindow": - case "CenterWindow": - case "DisplayDocTitle": - case "PickTrayByPDFSize": - if (typeof value === "boolean") { - prefValue = value; - } - break; - case "NonFullScreenPageMode": - if (value instanceof Name) { - switch (value.name) { - case "UseNone": - case "UseOutlines": - case "UseThumbs": - case "UseOC": - prefValue = value.name; - break; - default: - prefValue = "UseNone"; - } - } - break; - case "Direction": - if (value instanceof Name) { - switch (value.name) { - case "L2R": - case "R2L": - prefValue = value.name; - break; - default: - prefValue = "L2R"; - } - } - break; - case "ViewArea": - case "ViewClip": - case "PrintArea": - case "PrintClip": - if (value instanceof Name) { - switch (value.name) { - case "MediaBox": - case "CropBox": - case "BleedBox": - case "TrimBox": - case "ArtBox": - prefValue = value.name; - break; - default: - prefValue = "CropBox"; - } - } - break; - case "PrintScaling": - if (value instanceof Name) { - switch (value.name) { - case "None": - case "AppDefault": - prefValue = value.name; - break; - default: - prefValue = "AppDefault"; - } - } - break; - case "Duplex": - if (value instanceof Name) { - switch (value.name) { - case "Simplex": - case "DuplexFlipShortEdge": - case "DuplexFlipLongEdge": - prefValue = value.name; - break; - default: - prefValue = "None"; - } - } - break; - case "PrintPageRange": - if (Array.isArray(value) && value.length % 2 === 0) { - const isValid = value.every((page, i, arr) => Number.isInteger(page) && page > 0 && (i === 0 || page >= arr[i - 1]) && page <= this.numPages); - if (isValid) { - prefValue = value; - } - } - break; - case "NumCopies": - if (Number.isInteger(value) && value > 0) { - prefValue = value; - } - break; - default: - warn(`Ignoring non-standard key in ViewerPreferences: ${key}.`); - continue; - } - if (prefValue === undefined) { - warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); - continue; - } - prefs ??= Object.create(null); - prefs[key] = prefValue; - } - return shadow(this, "viewerPreferences", prefs); - } - get openAction() { - const obj = this.#catDict.get("OpenAction"); - const openAction = Object.create(null); - if (obj instanceof Dict) { - const destDict = new Dict(this.xref); - destDict.set("A", obj); - const resultObj = { - url: null, - dest: null, - action: null - }; - Catalog.parseDestDictionary({ - destDict, - resultObj - }); - if (Array.isArray(resultObj.dest)) { - openAction.dest = resultObj.dest; - } else if (resultObj.action) { - openAction.action = resultObj.action; - } - } else if (isValidExplicitDest(obj)) { - openAction.dest = obj; - } - return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null); - } - get attachments() { - const obj = this.#catDict.get("Names"); - let attachments = null; - if (obj instanceof Dict && obj.has("EmbeddedFiles")) { - const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); - for (const [key, value] of nameTree.getAll()) { - const fs = new FileSpec(value, this.xref); - attachments ??= Object.create(null); - attachments[stringToPDFString(key, true)] = fs.serializable; - } - } - return shadow(this, "attachments", attachments); - } - get xfaImages() { - const obj = this.#catDict.get("Names"); - let xfaImages = null; - if (obj instanceof Dict && obj.has("XFAImages")) { - const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); - for (const [key, value] of nameTree.getAll()) { - if (value instanceof BaseStream) { - xfaImages ??= new Map(); - xfaImages.set(stringToPDFString(key, true), value.getBytes()); - } - } - } - return shadow(this, "xfaImages", xfaImages); - } - #collectJavaScript() { - const obj = this.#catDict.get("Names"); - let javaScript = null; - function appendIfJavaScriptDict(name, jsDict) { - if (!(jsDict instanceof Dict)) { - return; - } - if (!isName(jsDict.get("S"), "JavaScript")) { - return; - } - let js = jsDict.get("JS"); - if (js instanceof BaseStream) { - js = js.getString(); - } else if (typeof js !== "string") { - return; - } - js = stringToPDFString(js, true).replaceAll("\x00", ""); - if (js) { - (javaScript ||= new Map()).set(name, js); - } - } - if (obj instanceof Dict && obj.has("JavaScript")) { - const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); - for (const [key, value] of nameTree.getAll()) { - appendIfJavaScriptDict(stringToPDFString(key, true), value); - } - } - const openAction = this.#catDict.get("OpenAction"); - if (openAction) { - appendIfJavaScriptDict("OpenAction", openAction); - } - return javaScript; - } - get jsActions() { - const javaScript = this.#collectJavaScript(); - let actions = collectActions(this.xref, this.#catDict, DocumentActionEventType); - if (javaScript) { - actions ||= Object.create(null); - for (const [key, val] of javaScript) { - if (key in actions) { - actions[key].push(val); - } else { - actions[key] = [val]; - } - } - } - return shadow(this, "jsActions", actions); - } - async cleanup(manuallyTriggered = false) { - clearGlobalCaches(); - this.globalColorSpaceCache.clear(); - this.globalImageCache.clear(manuallyTriggered); - this.pageKidsCountCache.clear(); - this.pageIndexCache.clear(); - this.pageDictCache.clear(); - this.nonBlendModesSet.clear(); - for (const { - dict - } of await Promise.all(this.fontCache)) { - delete dict.cacheKey; - } - this.fontCache.clear(); - this.builtInCMapCache.clear(); - this.standardFontDataCache.clear(); - this.systemFontCache.clear(); - } - async getPageDict(pageIndex) { - const nodesToVisit = [this.toplevelPagesDict]; - const visitedNodes = new RefSet(); - const pagesRef = this.#catDict.getRaw("Pages"); - if (pagesRef instanceof Ref) { - visitedNodes.put(pagesRef); - } - const xref = this.xref, - pageKidsCountCache = this.pageKidsCountCache, - pageIndexCache = this.pageIndexCache, - pageDictCache = this.pageDictCache; - let currentPageIndex = 0; - while (nodesToVisit.length) { - const currentNode = nodesToVisit.pop(); - if (currentNode instanceof Ref) { - const count = pageKidsCountCache.get(currentNode); - if (count >= 0 && currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - if (visitedNodes.has(currentNode)) { - throw new FormatError("Pages tree contains circular reference."); - } - visitedNodes.put(currentNode); - const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode)); - if (obj instanceof Dict) { - let type = obj.getRaw("Type"); - if (type instanceof Ref) { - type = await xref.fetchAsync(type); - } - if (isName(type, "Page") || !obj.has("Kids")) { - if (!pageKidsCountCache.has(currentNode)) { - pageKidsCountCache.put(currentNode, 1); - } - if (!pageIndexCache.has(currentNode)) { - pageIndexCache.put(currentNode, currentPageIndex); - } - if (currentPageIndex === pageIndex) { - return [obj, currentNode]; - } - currentPageIndex++; - continue; - } - } - nodesToVisit.push(obj); - continue; - } - if (!(currentNode instanceof Dict)) { - throw new FormatError("Page dictionary kid reference points to wrong type of object."); - } - const { - objId - } = currentNode; - let count = currentNode.getRaw("Count"); - if (count instanceof Ref) { - count = await xref.fetchAsync(count); - } - if (Number.isInteger(count) && count >= 0) { - if (objId && !pageKidsCountCache.has(objId)) { - pageKidsCountCache.put(objId, count); - } - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - } - let kids = currentNode.getRaw("Kids"); - if (kids instanceof Ref) { - kids = await xref.fetchAsync(kids); - } - if (!Array.isArray(kids)) { - let type = currentNode.getRaw("Type"); - if (type instanceof Ref) { - type = await xref.fetchAsync(type); - } - if (isName(type, "Page") || !currentNode.has("Kids")) { - if (currentPageIndex === pageIndex) { - return [currentNode, null]; - } - currentPageIndex++; - continue; - } - throw new FormatError("Page dictionary kids object is not an array."); - } - for (let last = kids.length - 1; last >= 0; last--) { - const lastKid = kids[last]; - nodesToVisit.push(lastKid); - if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) { - pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); - } - } - } - throw new Error(`Page index ${pageIndex} not found.`); - } - async getAllPageDicts(recoveryMode = false) { - const { - ignoreErrors - } = this.pdfManager.evaluatorOptions; - const queue = [{ - currentNode: this.toplevelPagesDict, - posInKids: 0 - }]; - const visitedNodes = new RefSet(); - const pagesRef = this.#catDict.getRaw("Pages"); - if (pagesRef instanceof Ref) { - visitedNodes.put(pagesRef); - } - const map = new Map(), - xref = this.xref, - pageIndexCache = this.pageIndexCache; - let pageIndex = 0; - function addPageDict(pageDict, pageRef) { - if (pageRef && !pageIndexCache.has(pageRef)) { - pageIndexCache.put(pageRef, pageIndex); - } - map.set(pageIndex++, [pageDict, pageRef]); - } - function addPageError(error) { - if (error instanceof XRefEntryException && !recoveryMode) { - throw error; - } - if (recoveryMode && ignoreErrors && pageIndex === 0) { - warn(`getAllPageDicts - Skipping invalid first page: "${error}".`); - error = Dict.empty; - } - map.set(pageIndex++, [error, null]); - } - while (queue.length > 0) { - const queueItem = queue.at(-1); - const { - currentNode, - posInKids - } = queueItem; - let kids = currentNode.getRaw("Kids"); - if (kids instanceof Ref) { - try { - kids = await xref.fetchAsync(kids); - } catch (ex) { - addPageError(ex); - break; - } - } - if (!Array.isArray(kids)) { - addPageError(new FormatError("Page dictionary kids object is not an array.")); - break; - } - if (posInKids >= kids.length) { - queue.pop(); - continue; - } - const kidObj = kids[posInKids]; - let obj; - if (kidObj instanceof Ref) { - if (visitedNodes.has(kidObj)) { - addPageError(new FormatError("Pages tree contains circular reference.")); - break; - } - visitedNodes.put(kidObj); - try { - obj = await xref.fetchAsync(kidObj); - } catch (ex) { - addPageError(ex); - break; - } - } else { - obj = kidObj; - } - if (!(obj instanceof Dict)) { - addPageError(new FormatError("Page dictionary kid reference points to wrong type of object.")); - break; - } - let type = obj.getRaw("Type"); - if (type instanceof Ref) { - try { - type = await xref.fetchAsync(type); - } catch (ex) { - addPageError(ex); - break; - } - } - if (isName(type, "Page") || !obj.has("Kids")) { - addPageDict(obj, kidObj instanceof Ref ? kidObj : null); - } else { - queue.push({ - currentNode: obj, - posInKids: 0 - }); - } - queueItem.posInKids++; - } - return map; - } - getPageIndex(pageRef) { - const cachedPageIndex = this.pageIndexCache.get(pageRef); - if (cachedPageIndex !== undefined) { - return Promise.resolve(cachedPageIndex); - } - const xref = this.xref; - function pagesBeforeRef(kidRef) { - let total = 0, - parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { - throw new FormatError("The reference does not point to a /Page dictionary."); - } - if (!node) { - return null; - } - if (!(node instanceof Dict)) { - throw new FormatError("Node must be a dictionary."); - } - parentRef = node.getRaw("Parent"); - return node.getAsync("Parent"); - }).then(function (parent) { - if (!parent) { - return null; - } - if (!(parent instanceof Dict)) { - throw new FormatError("Parent must be a dictionary."); - } - return parent.getAsync("Kids"); - }).then(function (kids) { - if (!kids) { - return null; - } - const kidPromises = []; - let found = false; - for (const kid of kids) { - if (!(kid instanceof Ref)) { - throw new FormatError("Kid must be a reference."); - } - if (isRefsEqual(kid, kidRef)) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (obj) { - if (!(obj instanceof Dict)) { - throw new FormatError("Kid node must be a dictionary."); - } - if (obj.has("Count")) { - total += obj.get("Count"); - } else { - total++; - } - })); - } - if (!found) { - throw new FormatError("Kid reference not found in parent's kids."); - } - return Promise.all(kidPromises).then(() => [total, parentRef]); - }); - } - let total = 0; - const next = ref => pagesBeforeRef(ref).then(args => { - if (!args) { - this.pageIndexCache.put(pageRef, total); - return total; - } - const [count, parentRef] = args; - total += count; - return next(parentRef); - }); - return next(pageRef); - } - get baseUrl() { - const uri = this.#catDict.get("URI"); - if (uri instanceof Dict) { - const base = uri.get("Base"); - if (typeof base === "string") { - const absoluteUrl = createValidAbsoluteUrl(base, null, { - tryConvertEncoding: true - }); - if (absoluteUrl) { - return shadow(this, "baseUrl", absoluteUrl.href); - } - } - } - return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); - } - static parseDestDictionary({ - destDict, - resultObj, - docBaseUrl = null, - docAttachments = null - }) { - if (!(destDict instanceof Dict)) { - warn("parseDestDictionary: `destDict` must be a dictionary."); - return; - } - let action = destDict.get("A"), - url, - dest; - if (!(action instanceof Dict)) { - if (destDict.has("Dest")) { - action = destDict.get("Dest"); - } else { - action = destDict.get("AA"); - if (action instanceof Dict) { - if (action.has("D")) { - action = action.get("D"); - } else if (action.has("U")) { - action = action.get("U"); - } - } - } - } - if (action instanceof Dict) { - const actionType = action.get("S"); - if (!(actionType instanceof Name)) { - warn("parseDestDictionary: Invalid type in Action dictionary."); - return; - } - const actionName = actionType.name; - switch (actionName) { - case "ResetForm": - const flags = action.get("Flags"); - const include = ((typeof flags === "number" ? flags : 0) & 1) === 0; - const fields = []; - const refs = []; - for (const obj of action.get("Fields") || []) { - if (obj instanceof Ref) { - refs.push(obj.toString()); - } else if (typeof obj === "string") { - fields.push(stringToPDFString(obj)); - } - } - resultObj.resetForm = { - fields, - refs, - include - }; - break; - case "URI": - url = action.get("URI"); - if (url instanceof Name) { - url = "/" + url.name; - } - break; - case "GoTo": - dest = action.get("D"); - break; - case "Launch": - case "GoToR": - const urlDict = action.get("F"); - if (urlDict instanceof Dict) { - const fs = new FileSpec(urlDict, null, true); - const { - rawFilename - } = fs.serializable; - url = rawFilename; - } else if (typeof urlDict === "string") { - url = urlDict; - } - const remoteDest = fetchRemoteDest(action); - if (remoteDest && typeof url === "string") { - url = url.split("#", 1)[0] + "#" + remoteDest; - } - const newWindow = action.get("NewWindow"); - if (typeof newWindow === "boolean") { - resultObj.newWindow = newWindow; - } - break; - case "GoToE": - const target = action.get("T"); - let attachment; - if (docAttachments && target instanceof Dict) { - const relationship = target.get("R"); - const name = target.get("N"); - if (isName(relationship, "C") && typeof name === "string") { - attachment = docAttachments[stringToPDFString(name, true)]; - } - } - if (attachment) { - resultObj.attachment = attachment; - const attachmentDest = fetchRemoteDest(action); - if (attachmentDest) { - resultObj.attachmentDest = attachmentDest; - } - } else { - warn(`parseDestDictionary - unimplemented "GoToE" action.`); - } - break; - case "Named": - const namedAction = action.get("N"); - if (namedAction instanceof Name) { - resultObj.action = namedAction.name; - } - break; - case "SetOCGState": - const state = action.get("State"); - const preserveRB = action.get("PreserveRB"); - if (!Array.isArray(state) || state.length === 0) { - break; - } - const stateArr = []; - for (const elem of state) { - if (elem instanceof Name) { - switch (elem.name) { - case "ON": - case "OFF": - case "Toggle": - stateArr.push(elem.name); - break; - } - } else if (elem instanceof Ref) { - stateArr.push(elem.toString()); - } - } - if (stateArr.length !== state.length) { - break; - } - resultObj.setOCGState = { - state: stateArr, - preserveRB: typeof preserveRB === "boolean" ? preserveRB : true - }; - break; - case "JavaScript": - const jsAction = action.get("JS"); - let js; - if (jsAction instanceof BaseStream) { - js = jsAction.getString(); - } else if (typeof jsAction === "string") { - js = jsAction; - } - const jsURL = js && recoverJsURL(stringToPDFString(js, true)); - if (jsURL) { - url = jsURL.url; - resultObj.newWindow = jsURL.newWindow; - break; - } - default: - if (actionName === "JavaScript" || actionName === "SubmitForm") { - break; - } - warn(`parseDestDictionary - unsupported action: "${actionName}".`); - break; - } - } else if (destDict.has("Dest")) { - dest = destDict.get("Dest"); - } - if (typeof url === "string") { - const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl, { - addDefaultProtocol: true, - tryConvertEncoding: true - }); - if (absoluteUrl) { - resultObj.url = absoluteUrl.href; - } - resultObj.unsafeUrl = url; - } - if (dest) { - if (dest instanceof Name) { - dest = dest.name; - } - if (typeof dest === "string") { - resultObj.dest = stringToPDFString(dest, true); - } else if (isValidExplicitDest(dest)) { - resultObj.dest = dest; - } - } - } -} - -;// ./src/core/object_loader.js - - - - -function mayHaveChildren(value) { - return value instanceof Ref || value instanceof Dict || value instanceof BaseStream || Array.isArray(value); -} -function addChildren(node, nodesToVisit) { - if (node instanceof Dict) { - node = node.getRawValues(); - } else if (node instanceof BaseStream) { - node = node.dict.getRawValues(); - } else if (!Array.isArray(node)) { - return; - } - for (const rawValue of node) { - if (mayHaveChildren(rawValue)) { - nodesToVisit.push(rawValue); - } - } -} -class ObjectLoader { - refSet = new RefSet(); - constructor(dict, keys, xref) { - this.dict = dict; - this.keys = keys; - this.xref = xref; - } - async load() { - const { - keys, - dict - } = this; - const nodesToVisit = []; - for (const key of keys) { - const rawValue = dict.getRaw(key); - if (rawValue !== undefined) { - nodesToVisit.push(rawValue); - } - } - await this.#walk(nodesToVisit); - this.refSet = null; - } - async #walk(nodesToVisit) { - const nodesToRevisit = []; - const pendingRequests = []; - while (nodesToVisit.length) { - let currentNode = nodesToVisit.pop(); - if (currentNode instanceof Ref) { - if (this.refSet.has(currentNode)) { - continue; - } - try { - this.refSet.put(currentNode); - currentNode = this.xref.fetch(currentNode); - } catch (ex) { - if (!(ex instanceof MissingDataException)) { - warn(`ObjectLoader.#walk - requesting all data: "${ex}".`); - await this.xref.stream.manager.requestAllChunks(); - return; - } - nodesToRevisit.push(currentNode); - pendingRequests.push({ - begin: ex.begin, - end: ex.end - }); - } - } - if (currentNode instanceof BaseStream) { - const baseStreams = currentNode.getBaseStreams(); - if (baseStreams) { - let foundMissingData = false; - for (const stream of baseStreams) { - if (stream.isDataLoaded) { - continue; - } - foundMissingData = true; - pendingRequests.push({ - begin: stream.start, - end: stream.end - }); - } - if (foundMissingData) { - nodesToRevisit.push(currentNode); - } - } - } - addChildren(currentNode, nodesToVisit); - } - if (pendingRequests.length) { - await this.xref.stream.manager.requestRanges(pendingRequests); - for (const node of nodesToRevisit) { - if (node instanceof Ref) { - this.refSet.remove(node); - } - } - await this.#walk(nodesToRevisit); - } - } - static async load(obj, keys, xref) { - if (xref.stream.isDataLoaded) { - return; - } - const objLoader = new ObjectLoader(obj, keys, xref); - await objLoader.load(); - } -} - -;// ./src/core/xfa/symbol_utils.js -const $acceptWhitespace = Symbol(); -const $addHTML = Symbol(); -const $appendChild = Symbol(); -const $childrenToHTML = Symbol(); -const $clean = Symbol(); -const $cleanPage = Symbol(); -const $cleanup = Symbol(); -const $clone = Symbol(); -const $consumed = Symbol(); -const $content = Symbol("content"); -const $data = Symbol("data"); -const $dump = Symbol(); -const $extra = Symbol("extra"); -const $finalize = Symbol(); -const $flushHTML = Symbol(); -const $getAttributeIt = Symbol(); -const $getAttributes = Symbol(); -const $getAvailableSpace = Symbol(); -const $getChildrenByClass = Symbol(); -const $getChildrenByName = Symbol(); -const $getChildrenByNameIt = Symbol(); -const $getDataValue = Symbol(); -const $getExtra = Symbol(); -const $getRealChildrenByNameIt = Symbol(); -const $getChildren = Symbol(); -const $getContainedChildren = Symbol(); -const $getNextPage = Symbol(); -const $getSubformParent = Symbol(); -const $getParent = Symbol(); -const $getTemplateRoot = Symbol(); -const $globalData = Symbol(); -const $hasSettableValue = Symbol(); -const $ids = Symbol(); -const $indexOf = Symbol(); -const $insertAt = Symbol(); -const $isCDATAXml = Symbol(); -const $isBindable = Symbol(); -const $isDataValue = Symbol(); -const $isDescendent = Symbol(); -const $isNsAgnostic = Symbol(); -const $isSplittable = Symbol(); -const $isThereMoreWidth = Symbol(); -const $isTransparent = Symbol(); -const $isUsable = Symbol(); -const $lastAttribute = Symbol(); -const $namespaceId = Symbol("namespaceId"); -const $nodeName = Symbol("nodeName"); -const $nsAttributes = Symbol(); -const $onChild = Symbol(); -const $onChildCheck = Symbol(); -const $onText = Symbol(); -const $pushGlyphs = Symbol(); -const $popPara = Symbol(); -const $pushPara = Symbol(); -const $removeChild = Symbol(); -const $root = Symbol("root"); -const $resolvePrototypes = Symbol(); -const $searchNode = Symbol(); -const $setId = Symbol(); -const $setSetAttributes = Symbol(); -const $setValue = Symbol(); -const $tabIndex = Symbol(); -const $text = Symbol(); -const $toPages = Symbol(); -const $toHTML = Symbol(); -const $toString = Symbol(); -const $toStyle = Symbol(); -const $uid = Symbol("uid"); - -;// ./src/core/xfa/namespaces.js -const $buildXFAObject = Symbol(); -const NamespaceIds = { - config: { - id: 0, - check: ns => ns.startsWith("http://www.xfa.org/schema/xci/") - }, - connectionSet: { - id: 1, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-connection-set/") - }, - datasets: { - id: 2, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-data/") - }, - form: { - id: 3, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-form/") - }, - localeSet: { - id: 4, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-locale-set/") - }, - pdf: { - id: 5, - check: ns => ns === "http://ns.adobe.com/xdp/pdf/" - }, - signature: { - id: 6, - check: ns => ns === "http://www.w3.org/2000/09/xmldsig#" - }, - sourceSet: { - id: 7, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-source-set/") - }, - stylesheet: { - id: 8, - check: ns => ns === "http://www.w3.org/1999/XSL/Transform" - }, - template: { - id: 9, - check: ns => ns.startsWith("http://www.xfa.org/schema/xfa-template/") - }, - xdc: { - id: 10, - check: ns => ns.startsWith("http://www.xfa.org/schema/xdc/") - }, - xdp: { - id: 11, - check: ns => ns === "http://ns.adobe.com/xdp/" - }, - xfdf: { - id: 12, - check: ns => ns === "http://ns.adobe.com/xfdf/" - }, - xhtml: { - id: 13, - check: ns => ns === "http://www.w3.org/1999/xhtml" - }, - xmpmeta: { - id: 14, - check: ns => ns === "http://ns.adobe.com/xmpmeta/" - } -}; - -;// ./src/core/xfa/utils.js - -const dimConverters = { - pt: x => x, - cm: x => x / 2.54 * 72, - mm: x => x / (10 * 2.54) * 72, - in: x => x * 72, - px: x => x -}; -const measurementPattern = /([+-]?\d+\.?\d*)(.*)/; -function stripQuotes(str) { - if (str.startsWith("'") || str.startsWith('"')) { - return str.slice(1, -1); - } - return str; -} -function getInteger({ - data, - defaultValue, - validate -}) { - if (!data) { - return defaultValue; - } - data = data.trim(); - const n = parseInt(data, 10); - if (!isNaN(n) && validate(n)) { - return n; - } - return defaultValue; -} -function getFloat({ - data, - defaultValue, - validate -}) { - if (!data) { - return defaultValue; - } - data = data.trim(); - const n = parseFloat(data); - if (!isNaN(n) && validate(n)) { - return n; - } - return defaultValue; -} -function getKeyword({ - data, - defaultValue, - validate -}) { - if (!data) { - return defaultValue; - } - data = data.trim(); - if (validate(data)) { - return data; - } - return defaultValue; -} -function getStringOption(data, options) { - return getKeyword({ - data, - defaultValue: options[0], - validate: k => options.includes(k) - }); -} -function getMeasurement(str, def = "0") { - def ||= "0"; - if (!str) { - return getMeasurement(def); - } - const match = str.trim().match(measurementPattern); - if (!match) { - return getMeasurement(def); - } - const [, valueStr, unit] = match; - const value = parseFloat(valueStr); - if (isNaN(value)) { - return getMeasurement(def); - } - if (value === 0) { - return 0; - } - const conv = dimConverters[unit]; - if (conv) { - return conv(value); - } - return value; -} -function getRatio(data) { - if (!data) { - return { - num: 1, - den: 1 - }; - } - const ratio = data.split(":", 2).map(x => parseFloat(x.trim())).filter(x => !isNaN(x)); - if (ratio.length === 1) { - ratio.push(1); - } - if (ratio.length === 0) { - return { - num: 1, - den: 1 - }; - } - const [num, den] = ratio; - return { - num, - den - }; -} -function getRelevant(data) { - if (!data) { - return []; - } - return data.trim().split(/\s+/).map(e => ({ - excluded: e[0] === "-", - viewname: e.substring(1) - })); -} -function getColor(data, def = [0, 0, 0]) { - let [r, g, b] = def; - if (!data) { - return { - r, - g, - b - }; - } - const color = data.split(",", 3).map(c => MathClamp(parseInt(c.trim(), 10), 0, 255)).map(c => isNaN(c) ? 0 : c); - if (color.length < 3) { - return { - r, - g, - b - }; - } - [r, g, b] = color; - return { - r, - g, - b - }; -} -function getBBox(data) { - const def = -1; - if (!data) { - return { - x: def, - y: def, - width: def, - height: def - }; - } - const bbox = data.split(",", 4).map(m => getMeasurement(m.trim(), "-1")); - if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { - return { - x: def, - y: def, - width: def, - height: def - }; - } - const [x, y, width, height] = bbox; - return { - x, - y, - width, - height - }; -} -class HTMLResult { - static get FAILURE() { - return shadow(this, "FAILURE", new HTMLResult(false, null, null, null)); - } - static get EMPTY() { - return shadow(this, "EMPTY", new HTMLResult(true, null, null, null)); - } - constructor(success, html, bbox, breakNode) { - this.success = success; - this.html = html; - this.bbox = bbox; - this.breakNode = breakNode; - } - isBreak() { - return !!this.breakNode; - } - static breakNode(node) { - return new HTMLResult(false, null, null, node); - } - static success(html, bbox = null) { - return new HTMLResult(true, html, bbox, null); - } -} - -;// ./src/core/xfa/fonts.js - - - -class FontFinder { - constructor(pdfFonts) { - this.fonts = new Map(); - this.cache = new Map(); - this.warned = new Set(); - this.defaultFont = null; - this.add(pdfFonts); - } - add(pdfFonts, reallyMissingFonts = null) { - for (const pdfFont of pdfFonts) { - this.addPdfFont(pdfFont); - } - for (const pdfFont of this.fonts.values()) { - if (!pdfFont.regular) { - pdfFont.regular = pdfFont.italic || pdfFont.bold || pdfFont.bolditalic; - } - } - if (!reallyMissingFonts || reallyMissingFonts.size === 0) { - return; - } - const myriad = this.fonts.get("PdfJS-Fallback-PdfJS-XFA"); - for (const missing of reallyMissingFonts) { - this.fonts.set(missing, myriad); - } - } - addPdfFont(pdfFont) { - const cssFontInfo = pdfFont.cssFontInfo; - const name = cssFontInfo.fontFamily; - let font = this.fonts.get(name); - if (!font) { - font = Object.create(null); - this.fonts.set(name, font); - if (!this.defaultFont) { - this.defaultFont = font; - } - } - let property = ""; - const fontWeight = parseFloat(cssFontInfo.fontWeight); - if (parseFloat(cssFontInfo.italicAngle) !== 0) { - property = fontWeight >= 700 ? "bolditalic" : "italic"; - } else if (fontWeight >= 700) { - property = "bold"; - } - if (!property) { - if (pdfFont.name.includes("Bold") || pdfFont.psName?.includes("Bold")) { - property = "bold"; - } - if (pdfFont.name.includes("Italic") || pdfFont.name.endsWith("It") || pdfFont.psName?.includes("Italic") || pdfFont.psName?.endsWith("It")) { - property += "italic"; - } - } - if (!property) { - property = "regular"; - } - font[property] = pdfFont; - } - getDefault() { - return this.defaultFont; - } - find(fontName, mustWarn = true) { - let font = this.fonts.get(fontName) || this.cache.get(fontName); - if (font) { - return font; - } - const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; - let name = fontName.replaceAll(pattern, ""); - font = this.fonts.get(name); - if (font) { - this.cache.set(fontName, font); - return font; - } - name = name.toLowerCase(); - const maybe = []; - for (const [family, pdfFont] of this.fonts.entries()) { - if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { - maybe.push(pdfFont); - } - } - if (maybe.length === 0) { - for (const [, pdfFont] of this.fonts.entries()) { - if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { - maybe.push(pdfFont); - } - } - } - if (maybe.length === 0) { - name = name.replaceAll(/psmt|mt/gi, ""); - for (const [family, pdfFont] of this.fonts.entries()) { - if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { - maybe.push(pdfFont); - } - } - } - if (maybe.length === 0) { - for (const pdfFont of this.fonts.values()) { - if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { - maybe.push(pdfFont); - } - } - } - if (maybe.length >= 1) { - if (maybe.length !== 1 && mustWarn) { - warn(`XFA - Too many choices to guess the correct font: ${fontName}`); - } - this.cache.set(fontName, maybe[0]); - return maybe[0]; - } - if (mustWarn && !this.warned.has(fontName)) { - this.warned.add(fontName); - warn(`XFA - Cannot find the font: ${fontName}`); - } - return null; - } -} -function selectFont(xfaFont, typeface) { - if (xfaFont.posture === "italic") { - if (xfaFont.weight === "bold") { - return typeface.bolditalic; - } - return typeface.italic; - } else if (xfaFont.weight === "bold") { - return typeface.bold; - } - return typeface.regular; -} -function fonts_getMetrics(xfaFont, real = false) { - let pdfFont = null; - if (xfaFont) { - const name = stripQuotes(xfaFont.typeface); - const typeface = xfaFont[$globalData].fontFinder.find(name); - pdfFont = selectFont(xfaFont, typeface); - } - if (!pdfFont) { - return { - lineHeight: 12, - lineGap: 2, - lineNoGap: 10 - }; - } - const size = xfaFont.size || 10; - const lineHeight = pdfFont.lineHeight ? Math.max(real ? 0 : 1.2, pdfFont.lineHeight) : 1.2; - const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; - return { - lineHeight: lineHeight * size, - lineGap: lineGap * size, - lineNoGap: Math.max(1, lineHeight - lineGap) * size - }; -} - -;// ./src/core/xfa/text.js - -const WIDTH_FACTOR = 1.02; -class FontInfo { - constructor(xfaFont, margin, lineHeight, fontFinder) { - this.lineHeight = lineHeight; - this.paraMargin = margin || { - top: 0, - bottom: 0, - left: 0, - right: 0 - }; - if (!xfaFont) { - [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); - return; - } - this.xfaFont = { - typeface: xfaFont.typeface, - posture: xfaFont.posture, - weight: xfaFont.weight, - size: xfaFont.size, - letterSpacing: xfaFont.letterSpacing - }; - const typeface = fontFinder.find(xfaFont.typeface); - if (!typeface) { - [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); - return; - } - this.pdfFont = selectFont(xfaFont, typeface); - if (!this.pdfFont) { - [this.pdfFont, this.xfaFont] = this.defaultFont(fontFinder); - } - } - defaultFont(fontFinder) { - const font = fontFinder.find("Helvetica", false) || fontFinder.find("Myriad Pro", false) || fontFinder.find("Arial", false) || fontFinder.getDefault(); - if (font?.regular) { - const pdfFont = font.regular; - const info = pdfFont.cssFontInfo; - const xfaFont = { - typeface: info.fontFamily, - posture: "normal", - weight: "normal", - size: 10, - letterSpacing: 0 - }; - return [pdfFont, xfaFont]; - } - const xfaFont = { - typeface: "Courier", - posture: "normal", - weight: "normal", - size: 10, - letterSpacing: 0 - }; - return [null, xfaFont]; - } -} -class FontSelector { - constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder) { - this.fontFinder = fontFinder; - this.stack = [new FontInfo(defaultXfaFont, defaultParaMargin, defaultLineHeight, fontFinder)]; - } - pushData(xfaFont, margin, lineHeight) { - const lastFont = this.stack.at(-1); - for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { - if (!xfaFont[name]) { - xfaFont[name] = lastFont.xfaFont[name]; - } - } - for (const name of ["top", "bottom", "left", "right"]) { - if (isNaN(margin[name])) { - margin[name] = lastFont.paraMargin[name]; - } - } - const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); - if (!fontInfo.pdfFont) { - fontInfo.pdfFont = lastFont.pdfFont; - } - this.stack.push(fontInfo); - } - popFont() { - this.stack.pop(); - } - topFont() { - return this.stack.at(-1); - } -} -class TextMeasure { - constructor(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts) { - this.glyphs = []; - this.fontSelector = new FontSelector(defaultXfaFont, defaultParaMargin, defaultLineHeight, fonts); - this.extraHeight = 0; - } - pushData(xfaFont, margin, lineHeight) { - this.fontSelector.pushData(xfaFont, margin, lineHeight); - } - popFont(xfaFont) { - return this.fontSelector.popFont(); - } - addPara() { - const lastFont = this.fontSelector.topFont(); - this.extraHeight += lastFont.paraMargin.top + lastFont.paraMargin.bottom; - } - addString(str) { - if (!str) { - return; - } - const lastFont = this.fontSelector.topFont(); - const fontSize = lastFont.xfaFont.size; - if (lastFont.pdfFont) { - const letterSpacing = lastFont.xfaFont.letterSpacing; - const pdfFont = lastFont.pdfFont; - const fontLineHeight = pdfFont.lineHeight || 1.2; - const lineHeight = lastFont.lineHeight || Math.max(1.2, fontLineHeight) * fontSize; - const lineGap = pdfFont.lineGap === undefined ? 0.2 : pdfFont.lineGap; - const noGap = fontLineHeight - lineGap; - const firstLineHeight = Math.max(1, noGap) * fontSize; - const scale = fontSize / 1000; - const fallbackWidth = pdfFont.defaultWidth || pdfFont.charsToGlyphs(" ")[0].width; - for (const line of str.split(/[\u2029\n]/)) { - const encodedLine = pdfFont.encodeString(line).join(""); - const glyphs = pdfFont.charsToGlyphs(encodedLine); - for (const glyph of glyphs) { - const width = glyph.width || fallbackWidth; - this.glyphs.push([width * scale + letterSpacing, lineHeight, firstLineHeight, glyph.unicode, false]); - } - this.glyphs.push([0, 0, 0, "\n", true]); - } - this.glyphs.pop(); - return; - } - for (const line of str.split(/[\u2029\n]/)) { - for (const char of line.split("")) { - this.glyphs.push([fontSize, 1.2 * fontSize, fontSize, char, false]); - } - this.glyphs.push([0, 0, 0, "\n", true]); - } - this.glyphs.pop(); - } - compute(maxWidth) { - let lastSpacePos = -1, - lastSpaceWidth = 0, - width = 0, - height = 0, - currentLineWidth = 0, - currentLineHeight = 0; - let isBroken = false; - let isFirstLine = true; - for (let i = 0, ii = this.glyphs.length; i < ii; i++) { - const [glyphWidth, lineHeight, firstLineHeight, char, isEOL] = this.glyphs[i]; - const isSpace = char === " "; - const glyphHeight = isFirstLine ? firstLineHeight : lineHeight; - if (isEOL) { - width = Math.max(width, currentLineWidth); - currentLineWidth = 0; - height += currentLineHeight; - currentLineHeight = glyphHeight; - lastSpacePos = -1; - lastSpaceWidth = 0; - isFirstLine = false; - continue; - } - if (isSpace) { - if (currentLineWidth + glyphWidth > maxWidth) { - width = Math.max(width, currentLineWidth); - currentLineWidth = 0; - height += currentLineHeight; - currentLineHeight = glyphHeight; - lastSpacePos = -1; - lastSpaceWidth = 0; - isBroken = true; - isFirstLine = false; - } else { - currentLineHeight = Math.max(glyphHeight, currentLineHeight); - lastSpaceWidth = currentLineWidth; - currentLineWidth += glyphWidth; - lastSpacePos = i; - } - continue; - } - if (currentLineWidth + glyphWidth > maxWidth) { - height += currentLineHeight; - currentLineHeight = glyphHeight; - if (lastSpacePos !== -1) { - i = lastSpacePos; - width = Math.max(width, lastSpaceWidth); - currentLineWidth = 0; - lastSpacePos = -1; - lastSpaceWidth = 0; - } else { - width = Math.max(width, currentLineWidth); - currentLineWidth = glyphWidth; - } - isBroken = true; - isFirstLine = false; - continue; - } - currentLineWidth += glyphWidth; - currentLineHeight = Math.max(glyphHeight, currentLineHeight); - } - width = Math.max(width, currentLineWidth); - height += currentLineHeight + this.extraHeight; - return { - width: WIDTH_FACTOR * width, - height, - isBroken - }; - } -} - -;// ./src/core/xfa/som.js - - -const namePattern = /^[^.[]+/; -const indexPattern = /^[^\]]+/; -const operators = { - dot: 0, - dotDot: 1, - dotHash: 2, - dotBracket: 3, - dotParen: 4 -}; -const shortcuts = new Map([["$data", (root, current) => root.datasets ? root.datasets.data : root], ["$record", (root, current) => (root.datasets ? root.datasets.data : root)[$getChildren]()[0]], ["$template", (root, current) => root.template], ["$connectionSet", (root, current) => root.connectionSet], ["$form", (root, current) => root.form], ["$layout", (root, current) => root.layout], ["$host", (root, current) => root.host], ["$dataWindow", (root, current) => root.dataWindow], ["$event", (root, current) => root.event], ["!", (root, current) => root.datasets], ["$xfa", (root, current) => root], ["xfa", (root, current) => root], ["$", (root, current) => current]]); -const somCache = new WeakMap(); -function parseIndex(index) { - index = index.trim(); - if (index === "*") { - return Infinity; - } - return parseInt(index, 10) || 0; -} -function parseExpression(expr, dotDotAllowed, noExpr = true) { - let match = expr.match(namePattern); - if (!match) { - return null; - } - let [name] = match; - const parsed = [{ - name, - cacheName: "." + name, - index: 0, - js: null, - formCalc: null, - operator: operators.dot - }]; - let pos = name.length; - while (pos < expr.length) { - const spos = pos; - const char = expr.charAt(pos++); - if (char === "[") { - match = expr.slice(pos).match(indexPattern); - if (!match) { - warn("XFA - Invalid index in SOM expression"); - return null; - } - parsed.at(-1).index = parseIndex(match[0]); - pos += match[0].length + 1; - continue; - } - let operator; - switch (expr.charAt(pos)) { - case ".": - if (!dotDotAllowed) { - return null; - } - pos++; - operator = operators.dotDot; - break; - case "#": - pos++; - operator = operators.dotHash; - break; - case "[": - if (noExpr) { - warn("XFA - SOM expression contains a FormCalc subexpression which is not supported for now."); - return null; - } - operator = operators.dotBracket; - break; - case "(": - if (noExpr) { - warn("XFA - SOM expression contains a JavaScript subexpression which is not supported for now."); - return null; - } - operator = operators.dotParen; - break; - default: - operator = operators.dot; - break; - } - match = expr.slice(pos).match(namePattern); - if (!match) { - break; - } - [name] = match; - pos += name.length; - parsed.push({ - name, - cacheName: expr.slice(spos, pos), - operator, - index: 0, - js: null, - formCalc: null - }); - } - return parsed; -} -function searchNode(root, container, expr, dotDotAllowed = true, useCache = true) { - const parsed = parseExpression(expr, dotDotAllowed); - if (!parsed) { - return null; - } - const fn = shortcuts.get(parsed[0].name); - let i = 0; - let isQualified; - if (fn) { - isQualified = true; - root = [fn(root, container)]; - i = 1; - } else { - isQualified = container === null; - root = [container || root]; - } - for (let ii = parsed.length; i < ii; i++) { - const { - name, - cacheName, - operator, - index - } = parsed[i]; - const nodes = []; - for (const node of root) { - if (!node.isXFAObject) { - continue; - } - let children, cached; - if (useCache) { - cached = somCache.get(node); - if (!cached) { - cached = new Map(); - somCache.set(node, cached); - } - children = cached.get(cacheName); - } - if (!children) { - switch (operator) { - case operators.dot: - children = node[$getChildrenByName](name, false); - break; - case operators.dotDot: - children = node[$getChildrenByName](name, true); - break; - case operators.dotHash: - children = node[$getChildrenByClass](name); - children = children.isXFAObjectArray ? children.children : [children]; - break; - default: - break; - } - if (useCache) { - cached.set(cacheName, children); - } - } - if (children.length > 0) { - nodes.push(children); - } - } - if (nodes.length === 0 && !isQualified && i === 0) { - const parent = container[$getParent](); - container = parent; - if (!container) { - return null; - } - i = -1; - root = [container]; - continue; - } - root = isFinite(index) ? nodes.filter(node => index < node.length).map(node => node[index]) : nodes.flat(); - } - if (root.length === 0) { - return null; - } - return root; -} -function createDataNode(root, container, expr) { - const parsed = parseExpression(expr); - if (!parsed) { - return null; - } - if (parsed.some(x => x.operator === operators.dotDot)) { - return null; - } - const fn = shortcuts.get(parsed[0].name); - let i = 0; - if (fn) { - root = fn(root, container); - i = 1; - } else { - root = container || root; - } - for (let ii = parsed.length; i < ii; i++) { - const { - name, - operator, - index - } = parsed[i]; - if (!isFinite(index)) { - parsed[i].index = 0; - return root.createNodes(parsed.slice(i)); - } - let children; - switch (operator) { - case operators.dot: - children = root[$getChildrenByName](name, false); - break; - case operators.dotDot: - children = root[$getChildrenByName](name, true); - break; - case operators.dotHash: - children = root[$getChildrenByClass](name); - children = children.isXFAObjectArray ? children.children : [children]; - break; - default: - break; - } - if (children.length === 0) { - return root.createNodes(parsed.slice(i)); - } - if (index < children.length) { - const child = children[index]; - if (!child.isXFAObject) { - warn(`XFA - Cannot create a node.`); - return null; - } - root = child; - } else { - parsed[i].index = index - children.length; - return root.createNodes(parsed.slice(i)); - } - } - return null; -} - -;// ./src/core/xfa/xfa_object.js - - - - - - -const _applyPrototype = Symbol(); -const _attributes = Symbol(); -const _attributeNames = Symbol(); -const _children = Symbol("_children"); -const _cloneAttribute = Symbol(); -const _dataValue = Symbol(); -const _defaultValue = Symbol(); -const _filteredChildrenGenerator = Symbol(); -const _getPrototype = Symbol(); -const _getUnsetAttributes = Symbol(); -const _hasChildren = Symbol(); -const _max = Symbol(); -const _options = Symbol(); -const _parent = Symbol("parent"); -const _resolvePrototypesHelper = Symbol(); -const _setAttributes = Symbol(); -const _validator = Symbol(); -let uid = 0; -const NS_DATASETS = NamespaceIds.datasets.id; -class XFAObject { - constructor(nsId, name, hasChildren = false) { - this[$namespaceId] = nsId; - this[$nodeName] = name; - this[_hasChildren] = hasChildren; - this[_parent] = null; - this[_children] = []; - this[$uid] = `${name}${uid++}`; - this[$globalData] = null; - } - get isXFAObject() { - return true; - } - get isXFAObjectArray() { - return false; - } - createNodes(path) { - let root = this, - node = null; - for (const { - name, - index - } of path) { - for (let i = 0, ii = isFinite(index) ? index : 0; i <= ii; i++) { - const nsId = root[$namespaceId] === NS_DATASETS ? -1 : root[$namespaceId]; - node = new XmlObject(nsId, name); - root[$appendChild](node); - } - root = node; - } - return node; - } - [$onChild](child) { - if (!this[_hasChildren] || !this[$onChildCheck](child)) { - return false; - } - const name = child[$nodeName]; - const node = this[name]; - if (node instanceof XFAObjectArray) { - if (node.push(child)) { - this[$appendChild](child); - return true; - } - } else { - if (node !== null) { - this[$removeChild](node); - } - this[name] = child; - this[$appendChild](child); - return true; - } - let id = ""; - if (this.id) { - id = ` (id: ${this.id})`; - } else if (this.name) { - id = ` (name: ${this.name} ${this.h.value})`; - } - warn(`XFA - node "${this[$nodeName]}"${id} has already enough "${name}"!`); - return false; - } - [$onChildCheck](child) { - return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; - } - [$isNsAgnostic]() { - return false; - } - [$acceptWhitespace]() { - return false; - } - [$isCDATAXml]() { - return false; - } - [$isBindable]() { - return false; - } - [$popPara]() { - if (this.para) { - this[$getTemplateRoot]()[$extra].paraStack.pop(); - } - } - [$pushPara]() { - this[$getTemplateRoot]()[$extra].paraStack.push(this.para); - } - [$setId](ids) { - if (this.id && this[$namespaceId] === NamespaceIds.template.id) { - ids.set(this.id, this); - } - } - [$getTemplateRoot]() { - return this[$globalData].template; - } - [$isSplittable]() { - return false; - } - [$isThereMoreWidth]() { - return false; - } - [$appendChild](child) { - child[_parent] = this; - this[_children].push(child); - if (!child[$globalData] && this[$globalData]) { - child[$globalData] = this[$globalData]; - } - } - [$removeChild](child) { - const i = this[_children].indexOf(child); - this[_children].splice(i, 1); - } - [$hasSettableValue]() { - return this.hasOwnProperty("value"); - } - [$setValue](_) {} - [$onText](_) {} - [$finalize]() {} - [$clean](builder) { - delete this[_hasChildren]; - if (this[$cleanup]) { - builder.clean(this[$cleanup]); - delete this[$cleanup]; - } - } - [$indexOf](child) { - return this[_children].indexOf(child); - } - [$insertAt](i, child) { - child[_parent] = this; - this[_children].splice(i, 0, child); - if (!child[$globalData] && this[$globalData]) { - child[$globalData] = this[$globalData]; - } - } - [$isTransparent]() { - return !this.name; - } - [$lastAttribute]() { - return ""; - } - [$text]() { - if (this[_children].length === 0) { - return this[$content]; - } - return this[_children].map(c => c[$text]()).join(""); - } - get [_attributeNames]() { - const proto = Object.getPrototypeOf(this); - if (!proto._attributes) { - const attributes = proto._attributes = new Set(); - for (const name of Object.getOwnPropertyNames(this)) { - if (this[name] === null || this[name] instanceof XFAObject || this[name] instanceof XFAObjectArray) { - break; - } - attributes.add(name); - } - } - return shadow(this, _attributeNames, proto._attributes); - } - [$isDescendent](parent) { - let node = this; - while (node) { - if (node === parent) { - return true; - } - node = node[$getParent](); - } - return false; - } - [$getParent]() { - return this[_parent]; - } - [$getSubformParent]() { - return this[$getParent](); - } - [$getChildren](name = null) { - if (!name) { - return this[_children]; - } - return this[name]; - } - [$dump]() { - const dumped = Object.create(null); - if (this[$content]) { - dumped.$content = this[$content]; - } - for (const name of Object.getOwnPropertyNames(this)) { - const value = this[name]; - if (value === null) { - continue; - } - if (value instanceof XFAObject) { - dumped[name] = value[$dump](); - } else if (value instanceof XFAObjectArray) { - if (!value.isEmpty()) { - dumped[name] = value.dump(); - } - } else { - dumped[name] = value; - } - } - return dumped; - } - [$toStyle]() { - return null; - } - [$toHTML]() { - return HTMLResult.EMPTY; - } - *[$getContainedChildren]() { - for (const node of this[$getChildren]()) { - yield node; - } - } - *[_filteredChildrenGenerator](filter, include) { - for (const node of this[$getContainedChildren]()) { - if (!filter || include === filter.has(node[$nodeName])) { - const availableSpace = this[$getAvailableSpace](); - const res = node[$toHTML](availableSpace); - if (!res.success) { - this[$extra].failingNode = node; - } - yield res; - } - } - } - [$flushHTML]() { - return null; - } - [$addHTML](html, bbox) { - this[$extra].children.push(html); - } - [$getAvailableSpace]() {} - [$childrenToHTML]({ - filter = null, - include = true - }) { - if (!this[$extra].generator) { - this[$extra].generator = this[_filteredChildrenGenerator](filter, include); - } else { - const availableSpace = this[$getAvailableSpace](); - const res = this[$extra].failingNode[$toHTML](availableSpace); - if (!res.success) { - return res; - } - if (res.html) { - this[$addHTML](res.html, res.bbox); - } - delete this[$extra].failingNode; - } - while (true) { - const gen = this[$extra].generator.next(); - if (gen.done) { - break; - } - const res = gen.value; - if (!res.success) { - return res; - } - if (res.html) { - this[$addHTML](res.html, res.bbox); - } - } - this[$extra].generator = null; - return HTMLResult.EMPTY; - } - [$setSetAttributes](attributes) { - this[_setAttributes] = new Set(Object.keys(attributes)); - } - [_getUnsetAttributes](protoAttributes) { - const allAttr = this[_attributeNames]; - const setAttr = this[_setAttributes]; - return [...protoAttributes].filter(x => allAttr.has(x) && !setAttr.has(x)); - } - [$resolvePrototypes](ids, ancestors = new Set()) { - for (const child of this[_children]) { - child[_resolvePrototypesHelper](ids, ancestors); - } - } - [_resolvePrototypesHelper](ids, ancestors) { - const proto = this[_getPrototype](ids, ancestors); - if (proto) { - this[_applyPrototype](proto, ids, ancestors); - } else { - this[$resolvePrototypes](ids, ancestors); - } - } - [_getPrototype](ids, ancestors) { - const { - use, - usehref - } = this; - if (!use && !usehref) { - return null; - } - let proto = null; - let somExpression = null; - let id = null; - let ref = use; - if (usehref) { - ref = usehref; - if (usehref.startsWith("#som(") && usehref.endsWith(")")) { - somExpression = usehref.slice("#som(".length, -1); - } else if (usehref.startsWith(".#som(") && usehref.endsWith(")")) { - somExpression = usehref.slice(".#som(".length, -1); - } else if (usehref.startsWith("#")) { - id = usehref.slice(1); - } else if (usehref.startsWith(".#")) { - id = usehref.slice(2); - } - } else if (use.startsWith("#")) { - id = use.slice(1); - } else { - somExpression = use; - } - this.use = this.usehref = ""; - if (id) { - proto = ids.get(id); - } else { - proto = searchNode(ids.get($root), this, somExpression, true, false); - if (proto) { - proto = proto[0]; - } - } - if (!proto) { - warn(`XFA - Invalid prototype reference: ${ref}.`); - return null; - } - if (proto[$nodeName] !== this[$nodeName]) { - warn(`XFA - Incompatible prototype: ${proto[$nodeName]} !== ${this[$nodeName]}.`); - return null; - } - if (ancestors.has(proto)) { - warn(`XFA - Cycle detected in prototypes use.`); - return null; - } - ancestors.add(proto); - const protoProto = proto[_getPrototype](ids, ancestors); - if (protoProto) { - proto[_applyPrototype](protoProto, ids, ancestors); - } - proto[$resolvePrototypes](ids, ancestors); - ancestors.delete(proto); - return proto; - } - [_applyPrototype](proto, ids, ancestors) { - if (ancestors.has(proto)) { - warn(`XFA - Cycle detected in prototypes use.`); - return; - } - if (!this[$content] && proto[$content]) { - this[$content] = proto[$content]; - } - const newAncestors = new Set(ancestors); - newAncestors.add(proto); - for (const unsetAttrName of this[_getUnsetAttributes](proto[_setAttributes])) { - this[unsetAttrName] = proto[unsetAttrName]; - if (this[_setAttributes]) { - this[_setAttributes].add(unsetAttrName); - } - } - for (const name of Object.getOwnPropertyNames(this)) { - if (this[_attributeNames].has(name)) { - continue; - } - const value = this[name]; - const protoValue = proto[name]; - if (value instanceof XFAObjectArray) { - for (const child of value[_children]) { - child[_resolvePrototypesHelper](ids, ancestors); - } - for (let i = value[_children].length, ii = protoValue[_children].length; i < ii; i++) { - const child = proto[_children][i][$clone](); - if (value.push(child)) { - child[_parent] = this; - this[_children].push(child); - child[_resolvePrototypesHelper](ids, ancestors); - } else { - break; - } - } - continue; - } - if (value !== null) { - value[$resolvePrototypes](ids, ancestors); - if (protoValue) { - value[_applyPrototype](protoValue, ids, ancestors); - } - continue; - } - if (protoValue !== null) { - const child = protoValue[$clone](); - child[_parent] = this; - this[name] = child; - this[_children].push(child); - child[_resolvePrototypesHelper](ids, ancestors); - } - } - } - static [_cloneAttribute](obj) { - if (Array.isArray(obj)) { - return obj.map(x => XFAObject[_cloneAttribute](x)); - } - if (typeof obj === "object" && obj !== null) { - return Object.assign({}, obj); - } - return obj; - } - [$clone]() { - const clone = Object.create(Object.getPrototypeOf(this)); - for (const $symbol of Object.getOwnPropertySymbols(this)) { - try { - clone[$symbol] = this[$symbol]; - } catch { - shadow(clone, $symbol, this[$symbol]); - } - } - clone[$uid] = `${clone[$nodeName]}${uid++}`; - clone[_children] = []; - for (const name of Object.getOwnPropertyNames(this)) { - if (this[_attributeNames].has(name)) { - clone[name] = XFAObject[_cloneAttribute](this[name]); - continue; - } - const value = this[name]; - clone[name] = value instanceof XFAObjectArray ? new XFAObjectArray(value[_max]) : null; - } - for (const child of this[_children]) { - const name = child[$nodeName]; - const clonedChild = child[$clone](); - clone[_children].push(clonedChild); - clonedChild[_parent] = clone; - if (clone[name] === null) { - clone[name] = clonedChild; - } else { - clone[name][_children].push(clonedChild); - } - } - return clone; - } - [$getChildren](name = null) { - if (!name) { - return this[_children]; - } - return this[_children].filter(c => c[$nodeName] === name); - } - [$getChildrenByClass](name) { - return this[name]; - } - [$getChildrenByName](name, allTransparent, first = true) { - return Array.from(this[$getChildrenByNameIt](name, allTransparent, first)); - } - *[$getChildrenByNameIt](name, allTransparent, first = true) { - if (name === "parent") { - yield this[_parent]; - return; - } - for (const child of this[_children]) { - if (child[$nodeName] === name) { - yield child; - } - if (child.name === name) { - yield child; - } - if (allTransparent || child[$isTransparent]()) { - yield* child[$getChildrenByNameIt](name, allTransparent, false); - } - } - if (first && this[_attributeNames].has(name)) { - yield new XFAAttribute(this, name, this[name]); - } - } -} -class XFAObjectArray { - constructor(max = Infinity) { - this[_max] = max; - this[_children] = []; - } - get isXFAObject() { - return false; - } - get isXFAObjectArray() { - return true; - } - push(child) { - const len = this[_children].length; - if (len <= this[_max]) { - this[_children].push(child); - return true; - } - warn(`XFA - node "${child[$nodeName]}" accepts no more than ${this[_max]} children`); - return false; - } - isEmpty() { - return this[_children].length === 0; - } - dump() { - return this[_children].length === 1 ? this[_children][0][$dump]() : this[_children].map(x => x[$dump]()); - } - [$clone]() { - const clone = new XFAObjectArray(this[_max]); - clone[_children] = this[_children].map(c => c[$clone]()); - return clone; - } - get children() { - return this[_children]; - } - clear() { - this[_children].length = 0; - } -} -class XFAAttribute { - constructor(node, name, value) { - this[_parent] = node; - this[$nodeName] = name; - this[$content] = value; - this[$consumed] = false; - this[$uid] = `attribute${uid++}`; - } - [$getParent]() { - return this[_parent]; - } - [$isDataValue]() { - return true; - } - [$getDataValue]() { - return this[$content].trim(); - } - [$setValue](value) { - value = value.value || ""; - this[$content] = value.toString(); - } - [$text]() { - return this[$content]; - } - [$isDescendent](parent) { - return this[_parent] === parent || this[_parent][$isDescendent](parent); - } -} -class XmlObject extends XFAObject { - constructor(nsId, name, attributes = {}) { - super(nsId, name); - this[$content] = ""; - this[_dataValue] = null; - if (name !== "#text") { - const map = new Map(); - this[_attributes] = map; - for (const [attrName, value] of Object.entries(attributes)) { - map.set(attrName, new XFAAttribute(this, attrName, value)); - } - if (attributes.hasOwnProperty($nsAttributes)) { - const dataNode = attributes[$nsAttributes].xfa.dataNode; - if (dataNode !== undefined) { - if (dataNode === "dataGroup") { - this[_dataValue] = false; - } else if (dataNode === "dataValue") { - this[_dataValue] = true; - } - } - } - } - this[$consumed] = false; - } - [$toString](buf) { - const tagName = this[$nodeName]; - if (tagName === "#text") { - buf.push(encodeToXmlString(this[$content])); - return; - } - const utf8TagName = utf8StringToString(tagName); - const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; - buf.push(`<${prefix}${utf8TagName}`); - for (const [name, value] of this[_attributes].entries()) { - const utf8Name = utf8StringToString(name); - buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); - } - if (this[_dataValue] !== null) { - if (this[_dataValue]) { - buf.push(` xfa:dataNode="dataValue"`); - } else { - buf.push(` xfa:dataNode="dataGroup"`); - } - } - if (!this[$content] && this[_children].length === 0) { - buf.push("/>"); - return; - } - buf.push(">"); - if (this[$content]) { - if (typeof this[$content] === "string") { - buf.push(encodeToXmlString(this[$content])); - } else { - this[$content][$toString](buf); - } - } else { - for (const child of this[_children]) { - child[$toString](buf); - } - } - buf.push(``); - } - [$onChild](child) { - if (this[$content]) { - const node = new XmlObject(this[$namespaceId], "#text"); - this[$appendChild](node); - node[$content] = this[$content]; - this[$content] = ""; - } - this[$appendChild](child); - return true; - } - [$onText](str) { - this[$content] += str; - } - [$finalize]() { - if (this[$content] && this[_children].length > 0) { - const node = new XmlObject(this[$namespaceId], "#text"); - this[$appendChild](node); - node[$content] = this[$content]; - delete this[$content]; - } - } - [$toHTML]() { - if (this[$nodeName] === "#text") { - return HTMLResult.success({ - name: "#text", - value: this[$content] - }); - } - return HTMLResult.EMPTY; - } - [$getChildren](name = null) { - if (!name) { - return this[_children]; - } - return this[_children].filter(c => c[$nodeName] === name); - } - [$getAttributes]() { - return this[_attributes]; - } - [$getChildrenByClass](name) { - const value = this[_attributes].get(name); - if (value !== undefined) { - return value; - } - return this[$getChildren](name); - } - *[$getChildrenByNameIt](name, allTransparent) { - const value = this[_attributes].get(name); - if (value) { - yield value; - } - for (const child of this[_children]) { - if (child[$nodeName] === name) { - yield child; - } - if (allTransparent) { - yield* child[$getChildrenByNameIt](name, allTransparent); - } - } - } - *[$getAttributeIt](name, skipConsumed) { - const value = this[_attributes].get(name); - if (value && (!skipConsumed || !value[$consumed])) { - yield value; - } - for (const child of this[_children]) { - yield* child[$getAttributeIt](name, skipConsumed); - } - } - *[$getRealChildrenByNameIt](name, allTransparent, skipConsumed) { - for (const child of this[_children]) { - if (child[$nodeName] === name && (!skipConsumed || !child[$consumed])) { - yield child; - } - if (allTransparent) { - yield* child[$getRealChildrenByNameIt](name, allTransparent, skipConsumed); - } - } - } - [$isDataValue]() { - if (this[_dataValue] === null) { - return this[_children].length === 0 || this[_children][0][$namespaceId] === NamespaceIds.xhtml.id; - } - return this[_dataValue]; - } - [$getDataValue]() { - if (this[_dataValue] === null) { - if (this[_children].length === 0) { - return this[$content].trim(); - } - if (this[_children][0][$namespaceId] === NamespaceIds.xhtml.id) { - return this[_children][0][$text]().trim(); - } - return null; - } - return this[$content].trim(); - } - [$setValue](value) { - value = value.value || ""; - this[$content] = value.toString(); - } - [$dump](hasNS = false) { - const dumped = Object.create(null); - if (hasNS) { - dumped.$ns = this[$namespaceId]; - } - if (this[$content]) { - dumped.$content = this[$content]; - } - dumped.$name = this[$nodeName]; - dumped.children = []; - for (const child of this[_children]) { - dumped.children.push(child[$dump](hasNS)); - } - dumped.attributes = Object.create(null); - for (const [name, value] of this[_attributes]) { - dumped.attributes[name] = value[$content]; - } - return dumped; - } -} -class ContentObject extends XFAObject { - constructor(nsId, name) { - super(nsId, name); - this[$content] = ""; - } - [$onText](text) { - this[$content] += text; - } - [$finalize]() {} -} -class OptionObject extends ContentObject { - constructor(nsId, name, options) { - super(nsId, name); - this[_options] = options; - } - [$finalize]() { - this[$content] = getKeyword({ - data: this[$content], - defaultValue: this[_options][0], - validate: k => this[_options].includes(k) - }); - } - [$clean](builder) { - super[$clean](builder); - delete this[_options]; - } -} -class StringObject extends ContentObject { - [$finalize]() { - this[$content] = this[$content].trim(); - } -} -class IntegerObject extends ContentObject { - constructor(nsId, name, defaultValue, validator) { - super(nsId, name); - this[_defaultValue] = defaultValue; - this[_validator] = validator; - } - [$finalize]() { - this[$content] = getInteger({ - data: this[$content], - defaultValue: this[_defaultValue], - validate: this[_validator] - }); - } - [$clean](builder) { - super[$clean](builder); - delete this[_defaultValue]; - delete this[_validator]; - } -} -class Option01 extends IntegerObject { - constructor(nsId, name) { - super(nsId, name, 0, n => n === 1); - } -} -class Option10 extends IntegerObject { - constructor(nsId, name) { - super(nsId, name, 1, n => n === 0); - } -} - -;// ./src/core/xfa/html_utils.js - - - - - - -function measureToString(m) { - if (typeof m === "string") { - return "0px"; - } - return Number.isInteger(m) ? `${m}px` : `${m.toFixed(2)}px`; -} -const converters = { - anchorType(node, style) { - const parent = node[$getSubformParent](); - if (!parent || parent.layout && parent.layout !== "position") { - return; - } - if (!("transform" in style)) { - style.transform = ""; - } - switch (node.anchorType) { - case "bottomCenter": - style.transform += "translate(-50%, -100%)"; - break; - case "bottomLeft": - style.transform += "translate(0,-100%)"; - break; - case "bottomRight": - style.transform += "translate(-100%,-100%)"; - break; - case "middleCenter": - style.transform += "translate(-50%,-50%)"; - break; - case "middleLeft": - style.transform += "translate(0,-50%)"; - break; - case "middleRight": - style.transform += "translate(-100%,-50%)"; - break; - case "topCenter": - style.transform += "translate(-50%,0)"; - break; - case "topRight": - style.transform += "translate(-100%,0)"; - break; - } - }, - dimensions(node, style) { - const parent = node[$getSubformParent](); - let width = node.w; - const height = node.h; - if (parent.layout?.includes("row")) { - const extra = parent[$extra]; - const colSpan = node.colSpan; - let w; - if (colSpan === -1) { - w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); - extra.currentColumn = 0; - } else { - w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); - extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; - } - if (!isNaN(w)) { - width = node.w = w; - } - } - style.width = width !== "" ? measureToString(width) : "auto"; - style.height = height !== "" ? measureToString(height) : "auto"; - }, - position(node, style) { - const parent = node[$getSubformParent](); - if (parent?.layout && parent.layout !== "position") { - return; - } - style.position = "absolute"; - style.left = measureToString(node.x); - style.top = measureToString(node.y); - }, - rotate(node, style) { - if (node.rotate) { - if (!("transform" in style)) { - style.transform = ""; - } - style.transform += `rotate(-${node.rotate}deg)`; - style.transformOrigin = "top left"; - } - }, - presence(node, style) { - switch (node.presence) { - case "invisible": - style.visibility = "hidden"; - break; - case "hidden": - case "inactive": - style.display = "none"; - break; - } - }, - hAlign(node, style) { - if (node[$nodeName] === "para") { - switch (node.hAlign) { - case "justifyAll": - style.textAlign = "justify-all"; - break; - case "radix": - style.textAlign = "left"; - break; - default: - style.textAlign = node.hAlign; - } - } else { - switch (node.hAlign) { - case "left": - style.alignSelf = "start"; - break; - case "center": - style.alignSelf = "center"; - break; - case "right": - style.alignSelf = "end"; - break; - } - } - }, - margin(node, style) { - if (node.margin) { - style.margin = node.margin[$toStyle]().margin; - } - } -}; -function setMinMaxDimensions(node, style) { - const parent = node[$getSubformParent](); - if (parent.layout === "position") { - if (node.minW > 0) { - style.minWidth = measureToString(node.minW); - } - if (node.maxW > 0) { - style.maxWidth = measureToString(node.maxW); - } - if (node.minH > 0) { - style.minHeight = measureToString(node.minH); - } - if (node.maxH > 0) { - style.maxHeight = measureToString(node.maxH); - } - } -} -function layoutText(text, xfaFont, margin, lineHeight, fontFinder, width) { - const measure = new TextMeasure(xfaFont, margin, lineHeight, fontFinder); - if (typeof text === "string") { - measure.addString(text); - } else { - text[$pushGlyphs](measure); - } - return measure.compute(width); -} -function layoutNode(node, availableSpace) { - let height = null; - let width = null; - let isBroken = false; - if ((!node.w || !node.h) && node.value) { - let marginH = 0; - let marginV = 0; - if (node.margin) { - marginH = node.margin.leftInset + node.margin.rightInset; - marginV = node.margin.topInset + node.margin.bottomInset; - } - let lineHeight = null; - let margin = null; - if (node.para) { - margin = Object.create(null); - lineHeight = node.para.lineHeight === "" ? null : node.para.lineHeight; - margin.top = node.para.spaceAbove === "" ? 0 : node.para.spaceAbove; - margin.bottom = node.para.spaceBelow === "" ? 0 : node.para.spaceBelow; - margin.left = node.para.marginLeft === "" ? 0 : node.para.marginLeft; - margin.right = node.para.marginRight === "" ? 0 : node.para.marginRight; - } - let font = node.font; - if (!font) { - const root = node[$getTemplateRoot](); - let parent = node[$getParent](); - while (parent && parent !== root) { - if (parent.font) { - font = parent.font; - break; - } - parent = parent[$getParent](); - } - } - const maxWidth = (node.w || availableSpace.width) - marginH; - const fontFinder = node[$globalData].fontFinder; - if (node.value.exData && node.value.exData[$content] && node.value.exData.contentType === "text/html") { - const res = layoutText(node.value.exData[$content], font, margin, lineHeight, fontFinder, maxWidth); - width = res.width; - height = res.height; - isBroken = res.isBroken; - } else { - const text = node.value[$text](); - if (text) { - const res = layoutText(text, font, margin, lineHeight, fontFinder, maxWidth); - width = res.width; - height = res.height; - isBroken = res.isBroken; - } - } - if (width !== null && !node.w) { - width += marginH; - } - if (height !== null && !node.h) { - height += marginV; - } - } - return { - w: width, - h: height, - isBroken - }; -} -function computeBbox(node, html, availableSpace) { - let bbox; - if (node.w !== "" && node.h !== "") { - bbox = [node.x, node.y, node.w, node.h]; - } else { - if (!availableSpace) { - return null; - } - let width = node.w; - if (width === "") { - if (node.maxW === 0) { - const parent = node[$getSubformParent](); - width = parent.layout === "position" && parent.w !== "" ? 0 : node.minW; - } else { - width = Math.min(node.maxW, availableSpace.width); - } - html.attributes.style.width = measureToString(width); - } - let height = node.h; - if (height === "") { - if (node.maxH === 0) { - const parent = node[$getSubformParent](); - height = parent.layout === "position" && parent.h !== "" ? 0 : node.minH; - } else { - height = Math.min(node.maxH, availableSpace.height); - } - html.attributes.style.height = measureToString(height); - } - bbox = [node.x, node.y, width, height]; - } - return bbox; -} -function fixDimensions(node) { - const parent = node[$getSubformParent](); - if (parent.layout?.includes("row")) { - const extra = parent[$extra]; - const colSpan = node.colSpan; - let width; - if (colSpan === -1) { - width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); - } else { - width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); - } - if (!isNaN(width)) { - node.w = width; - } - } - if (parent.layout && parent.layout !== "position") { - node.x = node.y = 0; - } - if (node.layout === "table") { - if (node.w === "" && Array.isArray(node.columnWidths)) { - node.w = Math.sumPrecise(node.columnWidths); - } - } -} -function layoutClass(node) { - switch (node.layout) { - case "position": - return "xfaPosition"; - case "lr-tb": - return "xfaLrTb"; - case "rl-row": - return "xfaRlRow"; - case "rl-tb": - return "xfaRlTb"; - case "row": - return "xfaRow"; - case "table": - return "xfaTable"; - case "tb": - return "xfaTb"; - default: - return "xfaPosition"; - } -} -function toStyle(node, ...names) { - const style = Object.create(null); - for (const name of names) { - const value = node[name]; - if (value === null) { - continue; - } - if (converters.hasOwnProperty(name)) { - converters[name](node, style); - continue; - } - if (value instanceof XFAObject) { - const newStyle = value[$toStyle](); - if (newStyle) { - Object.assign(style, newStyle); - } else { - warn(`(DEBUG) - XFA - style for ${name} not implemented yet`); - } - } - } - return style; -} -function createWrapper(node, html) { - const { - attributes - } = html; - const { - style - } = attributes; - const wrapper = { - name: "div", - attributes: { - class: ["xfaWrapper"], - style: Object.create(null) - }, - children: [] - }; - attributes.class.push("xfaWrapped"); - if (node.border) { - const { - widths, - insets - } = node.border[$extra]; - let width, height; - let top = insets[0]; - let left = insets[3]; - const insetsH = insets[0] + insets[2]; - const insetsW = insets[1] + insets[3]; - switch (node.border.hand) { - case "even": - top -= widths[0] / 2; - left -= widths[3] / 2; - width = `calc(100% + ${(widths[1] + widths[3]) / 2 - insetsW}px)`; - height = `calc(100% + ${(widths[0] + widths[2]) / 2 - insetsH}px)`; - break; - case "left": - top -= widths[0]; - left -= widths[3]; - width = `calc(100% + ${widths[1] + widths[3] - insetsW}px)`; - height = `calc(100% + ${widths[0] + widths[2] - insetsH}px)`; - break; - case "right": - width = insetsW ? `calc(100% - ${insetsW}px)` : "100%"; - height = insetsH ? `calc(100% - ${insetsH}px)` : "100%"; - break; - } - const classNames = ["xfaBorder"]; - if (isPrintOnly(node.border)) { - classNames.push("xfaPrintOnly"); - } - const border = { - name: "div", - attributes: { - class: classNames, - style: { - top: `${top}px`, - left: `${left}px`, - width, - height - } - }, - children: [] - }; - for (const key of ["border", "borderWidth", "borderColor", "borderRadius", "borderStyle"]) { - if (style[key] !== undefined) { - border.attributes.style[key] = style[key]; - delete style[key]; - } - } - wrapper.children.push(border, html); - } else { - wrapper.children.push(html); - } - for (const key of ["background", "backgroundClip", "top", "left", "width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "transform", "transformOrigin", "visibility"]) { - if (style[key] !== undefined) { - wrapper.attributes.style[key] = style[key]; - delete style[key]; - } - } - wrapper.attributes.style.position = style.position === "absolute" ? "absolute" : "relative"; - delete style.position; - if (style.alignSelf) { - wrapper.attributes.style.alignSelf = style.alignSelf; - delete style.alignSelf; - } - return wrapper; -} -function fixTextIndent(styles) { - const indent = getMeasurement(styles.textIndent, "0px"); - if (indent >= 0) { - return; - } - const align = styles.textAlign === "right" ? "right" : "left"; - const name = "padding" + (align === "left" ? "Left" : "Right"); - const padding = getMeasurement(styles[name], "0px"); - styles[name] = `${padding - indent}px`; -} -function setAccess(node, classNames) { - switch (node.access) { - case "nonInteractive": - classNames.push("xfaNonInteractive"); - break; - case "readOnly": - classNames.push("xfaReadOnly"); - break; - case "protected": - classNames.push("xfaDisabled"); - break; - } -} -function isPrintOnly(node) { - return node.relevant.length > 0 && !node.relevant[0].excluded && node.relevant[0].viewname === "print"; -} -function getCurrentPara(node) { - const stack = node[$getTemplateRoot]()[$extra].paraStack; - return stack.length ? stack.at(-1) : null; -} -function setPara(node, nodeStyle, value) { - if (value.attributes.class?.includes("xfaRich")) { - if (nodeStyle) { - if (node.h === "") { - nodeStyle.height = "auto"; - } - if (node.w === "") { - nodeStyle.width = "auto"; - } - } - const para = getCurrentPara(node); - if (para) { - const valueStyle = value.attributes.style; - valueStyle.display = "flex"; - valueStyle.flexDirection = "column"; - switch (para.vAlign) { - case "top": - valueStyle.justifyContent = "start"; - break; - case "bottom": - valueStyle.justifyContent = "end"; - break; - case "middle": - valueStyle.justifyContent = "center"; - break; - } - const paraStyle = para[$toStyle](); - for (const [key, val] of Object.entries(paraStyle)) { - if (!(key in valueStyle)) { - valueStyle[key] = val; - } - } - } - } -} -function setFontFamily(xfaFont, node, fontFinder, style) { - if (!fontFinder) { - delete style.fontFamily; - return; - } - const name = stripQuotes(xfaFont.typeface); - style.fontFamily = `"${name}"`; - const typeface = fontFinder.find(name); - if (typeface) { - const { - fontFamily - } = typeface.regular.cssFontInfo; - if (fontFamily !== name) { - style.fontFamily = `"${fontFamily}"`; - } - const para = getCurrentPara(node); - if (para && para.lineHeight !== "") { - return; - } - if (style.lineHeight) { - return; - } - const pdfFont = selectFont(xfaFont, typeface); - if (pdfFont) { - style.lineHeight = Math.max(1.2, pdfFont.lineHeight); - } - } -} -function fixURL(str) { - const absoluteUrl = createValidAbsoluteUrl(str, null, { - addDefaultProtocol: true, - tryConvertEncoding: true - }); - return absoluteUrl ? absoluteUrl.href : null; -} - -;// ./src/core/xfa/layout.js - - - -function createLine(node, children) { - return { - name: "div", - attributes: { - class: [node.layout === "lr-tb" ? "xfaLr" : "xfaRl"] - }, - children - }; -} -function flushHTML(node) { - if (!node[$extra]) { - return null; - } - const attributes = node[$extra].attributes; - const html = { - name: "div", - attributes, - children: node[$extra].children - }; - if (node[$extra].failingNode) { - const htmlFromFailing = node[$extra].failingNode[$flushHTML](); - if (htmlFromFailing) { - if (node.layout.endsWith("-tb")) { - html.children.push(createLine(node, [htmlFromFailing])); - } else { - html.children.push(htmlFromFailing); - } - } - } - if (html.children.length === 0) { - return null; - } - return html; -} -function addHTML(node, html, bbox) { - const extra = node[$extra]; - const availableSpace = extra.availableSpace; - const [x, y, w, h] = bbox; - switch (node.layout) { - case "position": - { - extra.width = Math.max(extra.width, x + w); - extra.height = Math.max(extra.height, y + h); - extra.children.push(html); - break; - } - case "lr-tb": - case "rl-tb": - if (!extra.line || extra.attempt === 1) { - extra.line = createLine(node, []); - extra.children.push(extra.line); - extra.numberInLine = 0; - } - extra.numberInLine += 1; - extra.line.children.push(html); - if (extra.attempt === 0) { - extra.currentWidth += w; - extra.height = Math.max(extra.height, extra.prevHeight + h); - } else { - extra.currentWidth = w; - extra.prevHeight = extra.height; - extra.height += h; - extra.attempt = 0; - } - extra.width = Math.max(extra.width, extra.currentWidth); - break; - case "rl-row": - case "row": - { - extra.children.push(html); - extra.width += w; - extra.height = Math.max(extra.height, h); - const height = measureToString(extra.height); - for (const child of extra.children) { - child.attributes.style.height = height; - } - break; - } - case "table": - { - extra.width = MathClamp(w, extra.width, availableSpace.width); - extra.height += h; - extra.children.push(html); - break; - } - case "tb": - { - extra.width = MathClamp(w, extra.width, availableSpace.width); - extra.height += h; - extra.children.push(html); - break; - } - } -} -function getAvailableSpace(node) { - const availableSpace = node[$extra].availableSpace; - const marginV = node.margin ? node.margin.topInset + node.margin.bottomInset : 0; - const marginH = node.margin ? node.margin.leftInset + node.margin.rightInset : 0; - switch (node.layout) { - case "lr-tb": - case "rl-tb": - if (node[$extra].attempt === 0) { - return { - width: availableSpace.width - marginH - node[$extra].currentWidth, - height: availableSpace.height - marginV - node[$extra].prevHeight - }; - } - return { - width: availableSpace.width - marginH, - height: availableSpace.height - marginV - node[$extra].height - }; - case "rl-row": - case "row": - const width = Math.sumPrecise(node[$extra].columnWidths.slice(node[$extra].currentColumn)); - return { - width, - height: availableSpace.height - marginH - }; - case "table": - case "tb": - return { - width: availableSpace.width - marginH, - height: availableSpace.height - marginV - node[$extra].height - }; - case "position": - default: - return availableSpace; - } -} -function getTransformedBBox(node) { - let w = node.w === "" ? NaN : node.w; - let h = node.h === "" ? NaN : node.h; - let [centerX, centerY] = [0, 0]; - switch (node.anchorType || "") { - case "bottomCenter": - [centerX, centerY] = [w / 2, h]; - break; - case "bottomLeft": - [centerX, centerY] = [0, h]; - break; - case "bottomRight": - [centerX, centerY] = [w, h]; - break; - case "middleCenter": - [centerX, centerY] = [w / 2, h / 2]; - break; - case "middleLeft": - [centerX, centerY] = [0, h / 2]; - break; - case "middleRight": - [centerX, centerY] = [w, h / 2]; - break; - case "topCenter": - [centerX, centerY] = [w / 2, 0]; - break; - case "topRight": - [centerX, centerY] = [w, 0]; - break; - } - let x, y; - switch (node.rotate || 0) { - case 0: - [x, y] = [-centerX, -centerY]; - break; - case 90: - [x, y] = [-centerY, centerX]; - [w, h] = [h, -w]; - break; - case 180: - [x, y] = [centerX, centerY]; - [w, h] = [-w, -h]; - break; - case 270: - [x, y] = [centerY, -centerX]; - [w, h] = [-h, w]; - break; - } - return [node.x + x + Math.min(0, w), node.y + y + Math.min(0, h), Math.abs(w), Math.abs(h)]; -} -function checkDimensions(node, space) { - if (node[$getTemplateRoot]()[$extra].firstUnsplittable === null) { - return true; - } - if (node.w === 0 || node.h === 0) { - return true; - } - const ERROR = 2; - const parent = node[$getSubformParent](); - const attempt = parent[$extra]?.attempt || 0; - const [, y, w, h] = getTransformedBBox(node); - switch (parent.layout) { - case "lr-tb": - case "rl-tb": - if (attempt === 0) { - if (!node[$getTemplateRoot]()[$extra].noLayoutFailure) { - if (node.h !== "" && Math.round(h - space.height) > ERROR) { - return false; - } - if (node.w !== "") { - if (Math.round(w - space.width) <= ERROR) { - return true; - } - if (parent[$extra].numberInLine === 0) { - return space.height > ERROR; - } - return false; - } - return space.width > ERROR; - } - if (node.w !== "") { - return Math.round(w - space.width) <= ERROR; - } - return space.width > ERROR; - } - if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { - return true; - } - if (node.h !== "" && Math.round(h - space.height) > ERROR) { - return false; - } - if (node.w === "" || Math.round(w - space.width) <= ERROR) { - return space.height > ERROR; - } - if (parent[$isThereMoreWidth]()) { - return false; - } - return space.height > ERROR; - case "table": - case "tb": - if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { - return true; - } - if (node.h !== "" && !node[$isSplittable]()) { - return Math.round(h - space.height) <= ERROR; - } - if (node.w === "" || Math.round(w - space.width) <= ERROR) { - return space.height > ERROR; - } - if (parent[$isThereMoreWidth]()) { - return false; - } - return space.height > ERROR; - case "position": - if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { - return true; - } - if (node.h === "" || Math.round(h + y - space.height) <= ERROR) { - return true; - } - const area = node[$getTemplateRoot]()[$extra].currentContentArea; - return h + y > area.h; - case "rl-row": - case "row": - if (node[$getTemplateRoot]()[$extra].noLayoutFailure) { - return true; - } - if (node.h !== "") { - return Math.round(h - space.height) <= ERROR; - } - return true; - default: - return true; - } -} - -;// ./src/core/xfa/template.js - - - - - - - - - - -const TEMPLATE_NS_ID = NamespaceIds.template.id; -const SVG_NS = "http://www.w3.org/2000/svg"; -const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; -const MAX_EMPTY_PAGES = 3; -const DEFAULT_TAB_INDEX = 5000; -const HEADING_PATTERN = /^H(\d+)$/; -const MIMES = new Set(["image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/png", "image/apng", "image/x-png", "image/bmp", "image/x-ms-bmp", "image/tiff", "image/tif", "application/octet-stream"]); -const IMAGES_HEADERS = [[[0x42, 0x4d], "image/bmp"], [[0xff, 0xd8, 0xff], "image/jpeg"], [[0x49, 0x49, 0x2a, 0x00], "image/tiff"], [[0x4d, 0x4d, 0x00, 0x2a], "image/tiff"], [[0x47, 0x49, 0x46, 0x38, 0x39, 0x61], "image/gif"], [[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], "image/png"]]; -function getBorderDims(node) { - if (!node || !node.border) { - return { - w: 0, - h: 0 - }; - } - const borderExtra = node.border[$getExtra](); - if (!borderExtra) { - return { - w: 0, - h: 0 - }; - } - return { - w: borderExtra.widths[0] + borderExtra.widths[2] + borderExtra.insets[0] + borderExtra.insets[2], - h: borderExtra.widths[1] + borderExtra.widths[3] + borderExtra.insets[1] + borderExtra.insets[3] - }; -} -function hasMargin(node) { - return node.margin && (node.margin.topInset || node.margin.rightInset || node.margin.bottomInset || node.margin.leftInset); -} -function _setValue(templateNode, value) { - if (!templateNode.value) { - const nodeValue = new Value({}); - templateNode[$appendChild](nodeValue); - templateNode.value = nodeValue; - } - templateNode.value[$setValue](value); -} -function* getContainedChildren(node) { - for (const child of node[$getChildren]()) { - if (child instanceof SubformSet) { - yield* child[$getContainedChildren](); - continue; - } - yield child; - } -} -function isRequired(node) { - return node.validate?.nullTest === "error"; -} -function setTabIndex(node) { - while (node) { - if (!node.traversal) { - node[$tabIndex] = node[$getParent]()[$tabIndex]; - return; - } - if (node[$tabIndex]) { - return; - } - let next = null; - for (const child of node.traversal[$getChildren]()) { - if (child.operation === "next") { - next = child; - break; - } - } - if (!next || !next.ref) { - node[$tabIndex] = node[$getParent]()[$tabIndex]; - return; - } - const root = node[$getTemplateRoot](); - node[$tabIndex] = ++root[$tabIndex]; - const ref = root[$searchNode](next.ref, node); - if (!ref) { - return; - } - node = ref[0]; - } -} -function applyAssist(obj, attributes) { - const assist = obj.assist; - if (assist) { - const assistTitle = assist[$toHTML](); - if (assistTitle) { - attributes.title = assistTitle; - } - const role = assist.role; - const match = role.match(HEADING_PATTERN); - if (match) { - const ariaRole = "heading"; - const ariaLevel = match[1]; - attributes.role = ariaRole; - attributes["aria-level"] = ariaLevel; - } - } - if (obj.layout === "table") { - attributes.role = "table"; - } else if (obj.layout === "row") { - attributes.role = "row"; - } else { - const parent = obj[$getParent](); - if (parent.layout === "row") { - attributes.role = parent.assist?.role === "TH" ? "columnheader" : "cell"; - } - } -} -function ariaLabel(obj) { - if (!obj.assist) { - return null; - } - const assist = obj.assist; - if (assist.speak && assist.speak[$content] !== "") { - return assist.speak[$content]; - } - if (assist.toolTip) { - return assist.toolTip[$content]; - } - return null; -} -function valueToHtml(value) { - return HTMLResult.success({ - name: "div", - attributes: { - class: ["xfaRich"], - style: Object.create(null) - }, - children: [{ - name: "span", - attributes: { - style: Object.create(null) - }, - value - }] - }); -} -function setFirstUnsplittable(node) { - const root = node[$getTemplateRoot](); - if (root[$extra].firstUnsplittable === null) { - root[$extra].firstUnsplittable = node; - root[$extra].noLayoutFailure = true; - } -} -function unsetFirstUnsplittable(node) { - const root = node[$getTemplateRoot](); - if (root[$extra].firstUnsplittable === node) { - root[$extra].noLayoutFailure = false; - } -} -function handleBreak(node) { - if (node[$extra]) { - return false; - } - node[$extra] = Object.create(null); - if (node.targetType === "auto") { - return false; - } - const root = node[$getTemplateRoot](); - let target = null; - if (node.target) { - target = root[$searchNode](node.target, node[$getParent]()); - if (!target) { - return false; - } - target = target[0]; - } - const { - currentPageArea, - currentContentArea - } = root[$extra]; - if (node.targetType === "pageArea") { - if (!(target instanceof PageArea)) { - target = null; - } - if (node.startNew) { - node[$extra].target = target || currentPageArea; - return true; - } else if (target && target !== currentPageArea) { - node[$extra].target = target; - return true; - } - return false; - } - if (!(target instanceof ContentArea)) { - target = null; - } - const pageArea = target && target[$getParent](); - let index; - let nextPageArea = pageArea; - if (node.startNew) { - if (target) { - const contentAreas = pageArea.contentArea.children; - const indexForCurrent = contentAreas.indexOf(currentContentArea); - const indexForTarget = contentAreas.indexOf(target); - if (indexForCurrent !== -1 && indexForCurrent < indexForTarget) { - nextPageArea = null; - } - index = indexForTarget - 1; - } else { - index = currentPageArea.contentArea.children.indexOf(currentContentArea); - } - } else if (target && target !== currentContentArea) { - const contentAreas = pageArea.contentArea.children; - index = contentAreas.indexOf(target) - 1; - nextPageArea = pageArea === currentPageArea ? null : pageArea; - } else { - return false; - } - node[$extra].target = nextPageArea; - node[$extra].index = index; - return true; -} -function handleOverflow(node, extraNode, space) { - const root = node[$getTemplateRoot](); - const saved = root[$extra].noLayoutFailure; - const savedMethod = extraNode[$getSubformParent]; - extraNode[$getSubformParent] = () => node; - root[$extra].noLayoutFailure = true; - const res = extraNode[$toHTML](space); - node[$addHTML](res.html, res.bbox); - root[$extra].noLayoutFailure = saved; - extraNode[$getSubformParent] = savedMethod; -} -class AppearanceFilter extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "appearanceFilter"); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Arc extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "arc", true); - this.circular = getInteger({ - data: attributes.circular, - defaultValue: 0, - validate: x => x === 1 - }); - this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); - this.id = attributes.id || ""; - this.startAngle = getFloat({ - data: attributes.startAngle, - defaultValue: 0, - validate: x => true - }); - this.sweepAngle = getFloat({ - data: attributes.sweepAngle, - defaultValue: 360, - validate: x => true - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.edge = null; - this.fill = null; - } - [$toHTML]() { - const edge = this.edge || new Edge({}); - const edgeStyle = edge[$toStyle](); - const style = Object.create(null); - if (this.fill?.presence === "visible") { - Object.assign(style, this.fill[$toStyle]()); - } else { - style.fill = "transparent"; - } - style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); - style.stroke = edgeStyle.color; - let arc; - const attributes = { - xmlns: SVG_NS, - style: { - width: "100%", - height: "100%", - overflow: "visible" - } - }; - if (this.sweepAngle === 360) { - arc = { - name: "ellipse", - attributes: { - xmlns: SVG_NS, - cx: "50%", - cy: "50%", - rx: "50%", - ry: "50%", - style - } - }; - } else { - const startAngle = this.startAngle * Math.PI / 180; - const sweepAngle = this.sweepAngle * Math.PI / 180; - const largeArc = this.sweepAngle > 180 ? 1 : 0; - const [x1, y1, x2, y2] = [50 * (1 + Math.cos(startAngle)), 50 * (1 - Math.sin(startAngle)), 50 * (1 + Math.cos(startAngle + sweepAngle)), 50 * (1 - Math.sin(startAngle + sweepAngle))]; - arc = { - name: "path", - attributes: { - xmlns: SVG_NS, - d: `M ${x1} ${y1} A 50 50 0 ${largeArc} 0 ${x2} ${y2}`, - vectorEffect: "non-scaling-stroke", - style - } - }; - Object.assign(attributes, { - viewBox: "0 0 100 100", - preserveAspectRatio: "none" - }); - } - const svg = { - name: "svg", - children: [arc], - attributes - }; - const parent = this[$getParent]()[$getParent](); - if (hasMargin(parent)) { - return HTMLResult.success({ - name: "div", - attributes: { - style: { - display: "inline", - width: "100%", - height: "100%" - } - }, - children: [svg] - }); - } - svg.attributes.style.position = "absolute"; - return HTMLResult.success(svg); - } -} -class Area extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "area", true); - this.colSpan = getInteger({ - data: attributes.colSpan, - defaultValue: 1, - validate: n => n >= 1 || n === -1 - }); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.desc = null; - this.extras = null; - this.area = new XFAObjectArray(); - this.draw = new XFAObjectArray(); - this.exObject = new XFAObjectArray(); - this.exclGroup = new XFAObjectArray(); - this.field = new XFAObjectArray(); - this.subform = new XFAObjectArray(); - this.subformSet = new XFAObjectArray(); - } - *[$getContainedChildren]() { - yield* getContainedChildren(this); - } - [$isTransparent]() { - return true; - } - [$isBindable]() { - return true; - } - [$addHTML](html, bbox) { - const [x, y, w, h] = bbox; - this[$extra].width = Math.max(this[$extra].width, x + w); - this[$extra].height = Math.max(this[$extra].height, y + h); - this[$extra].children.push(html); - } - [$getAvailableSpace]() { - return this[$extra].availableSpace; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "position"); - const attributes = { - style, - id: this[$uid], - class: ["xfaArea"] - }; - if (isPrintOnly(this)) { - attributes.class.push("xfaPrintOnly"); - } - if (this.name) { - attributes.xfaName = this.name; - } - const children = []; - this[$extra] = { - children, - width: 0, - height: 0, - availableSpace - }; - const result = this[$childrenToHTML]({ - filter: new Set(["area", "draw", "field", "exclGroup", "subform", "subformSet"]), - include: true - }); - if (!result.success) { - if (result.isBreak()) { - return result; - } - delete this[$extra]; - return HTMLResult.FAILURE; - } - style.width = measureToString(this[$extra].width); - style.height = measureToString(this[$extra].height); - const html = { - name: "div", - attributes, - children - }; - const bbox = [this.x, this.y, this[$extra].width, this[$extra].height]; - delete this[$extra]; - return HTMLResult.success(html, bbox); - } -} -class Assist extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "assist", true); - this.id = attributes.id || ""; - this.role = attributes.role || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.speak = null; - this.toolTip = null; - } - [$toHTML]() { - return this.toolTip?.[$content] || null; - } -} -class Barcode extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "barcode", true); - this.charEncoding = getKeyword({ - data: attributes.charEncoding ? attributes.charEncoding.toLowerCase() : "", - defaultValue: "", - validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) - }); - this.checksum = getStringOption(attributes.checksum, ["none", "1mod10", "1mod10_1mod11", "2mod10", "auto"]); - this.dataColumnCount = getInteger({ - data: attributes.dataColumnCount, - defaultValue: -1, - validate: x => x >= 0 - }); - this.dataLength = getInteger({ - data: attributes.dataLength, - defaultValue: -1, - validate: x => x >= 0 - }); - this.dataPrep = getStringOption(attributes.dataPrep, ["none", "flateCompress"]); - this.dataRowCount = getInteger({ - data: attributes.dataRowCount, - defaultValue: -1, - validate: x => x >= 0 - }); - this.endChar = attributes.endChar || ""; - this.errorCorrectionLevel = getInteger({ - data: attributes.errorCorrectionLevel, - defaultValue: -1, - validate: x => x >= 0 && x <= 8 - }); - this.id = attributes.id || ""; - this.moduleHeight = getMeasurement(attributes.moduleHeight, "5mm"); - this.moduleWidth = getMeasurement(attributes.moduleWidth, "0.25mm"); - this.printCheckDigit = getInteger({ - data: attributes.printCheckDigit, - defaultValue: 0, - validate: x => x === 1 - }); - this.rowColumnRatio = getRatio(attributes.rowColumnRatio); - this.startChar = attributes.startChar || ""; - this.textLocation = getStringOption(attributes.textLocation, ["below", "above", "aboveEmbedded", "belowEmbedded", "none"]); - this.truncate = getInteger({ - data: attributes.truncate, - defaultValue: 0, - validate: x => x === 1 - }); - this.type = getStringOption(attributes.type ? attributes.type.toLowerCase() : "", ["aztec", "codabar", "code2of5industrial", "code2of5interleaved", "code2of5matrix", "code2of5standard", "code3of9", "code3of9extended", "code11", "code49", "code93", "code128", "code128a", "code128b", "code128c", "code128sscc", "datamatrix", "ean8", "ean8add2", "ean8add5", "ean13", "ean13add2", "ean13add5", "ean13pwcd", "fim", "logmars", "maxicode", "msi", "pdf417", "pdf417macro", "plessey", "postauscust2", "postauscust3", "postausreplypaid", "postausstandard", "postukrm4scc", "postusdpbc", "postusimb", "postusstandard", "postus5zip", "qrcode", "rfid", "rss14", "rss14expanded", "rss14limited", "rss14stacked", "rss14stackedomni", "rss14truncated", "telepen", "ucc128", "ucc128random", "ucc128sscc", "upca", "upcaadd2", "upcaadd5", "upcapwcd", "upce", "upceadd2", "upceadd5", "upcean2", "upcean5", "upsmaxicode"]); - this.upsMode = getStringOption(attributes.upsMode, ["usCarrier", "internationalCarrier", "secureSymbol", "standardSymbol"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.wideNarrowRatio = getRatio(attributes.wideNarrowRatio); - this.encrypt = null; - this.extras = null; - } -} -class Bind extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "bind", true); - this.match = getStringOption(attributes.match, ["once", "dataRef", "global", "none"]); - this.ref = attributes.ref || ""; - this.picture = null; - } -} -class BindItems extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "bindItems"); - this.connection = attributes.connection || ""; - this.labelRef = attributes.labelRef || ""; - this.ref = attributes.ref || ""; - this.valueRef = attributes.valueRef || ""; - } -} -class Bookend extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "bookend"); - this.id = attributes.id || ""; - this.leader = attributes.leader || ""; - this.trailer = attributes.trailer || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class BooleanElement extends Option01 { - constructor(attributes) { - super(TEMPLATE_NS_ID, "boolean"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] === 1 ? "1" : "0"); - } -} -class Border extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "border", true); - this.break = getStringOption(attributes.break, ["close", "open"]); - this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); - this.id = attributes.id || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.corner = new XFAObjectArray(4); - this.edge = new XFAObjectArray(4); - this.extras = null; - this.fill = null; - this.margin = null; - } - [$getExtra]() { - if (!this[$extra]) { - const edges = this.edge.children.slice(); - if (edges.length < 4) { - const defaultEdge = edges.at(-1) || new Edge({}); - for (let i = edges.length; i < 4; i++) { - edges.push(defaultEdge); - } - } - const widths = edges.map(edge => edge.thickness); - const insets = [0, 0, 0, 0]; - if (this.margin) { - insets[0] = this.margin.topInset; - insets[1] = this.margin.rightInset; - insets[2] = this.margin.bottomInset; - insets[3] = this.margin.leftInset; - } - this[$extra] = { - widths, - insets, - edges - }; - } - return this[$extra]; - } - [$toStyle]() { - const { - edges - } = this[$getExtra](); - const edgeStyles = edges.map(node => { - const style = node[$toStyle](); - style.color ||= "#000000"; - return style; - }); - const style = Object.create(null); - if (this.margin) { - Object.assign(style, this.margin[$toStyle]()); - } - if (this.fill?.presence === "visible") { - Object.assign(style, this.fill[$toStyle]()); - } - if (this.corner.children.some(node => node.radius !== 0)) { - const cornerStyles = this.corner.children.map(node => node[$toStyle]()); - if (cornerStyles.length === 2 || cornerStyles.length === 3) { - const last = cornerStyles.at(-1); - for (let i = cornerStyles.length; i < 4; i++) { - cornerStyles.push(last); - } - } - style.borderRadius = cornerStyles.map(s => s.radius).join(" "); - } - switch (this.presence) { - case "invisible": - case "hidden": - style.borderStyle = ""; - break; - case "inactive": - style.borderStyle = "none"; - break; - default: - style.borderStyle = edgeStyles.map(s => s.style).join(" "); - break; - } - style.borderWidth = edgeStyles.map(s => s.width).join(" "); - style.borderColor = edgeStyles.map(s => s.color).join(" "); - return style; - } -} -class Break extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "break", true); - this.after = getStringOption(attributes.after, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); - this.afterTarget = attributes.afterTarget || ""; - this.before = getStringOption(attributes.before, ["auto", "contentArea", "pageArea", "pageEven", "pageOdd"]); - this.beforeTarget = attributes.beforeTarget || ""; - this.bookendLeader = attributes.bookendLeader || ""; - this.bookendTrailer = attributes.bookendTrailer || ""; - this.id = attributes.id || ""; - this.overflowLeader = attributes.overflowLeader || ""; - this.overflowTarget = attributes.overflowTarget || ""; - this.overflowTrailer = attributes.overflowTrailer || ""; - this.startNew = getInteger({ - data: attributes.startNew, - defaultValue: 0, - validate: x => x === 1 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } -} -class BreakAfter extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "breakAfter", true); - this.id = attributes.id || ""; - this.leader = attributes.leader || ""; - this.startNew = getInteger({ - data: attributes.startNew, - defaultValue: 0, - validate: x => x === 1 - }); - this.target = attributes.target || ""; - this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); - this.trailer = attributes.trailer || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.script = null; - } -} -class BreakBefore extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "breakBefore", true); - this.id = attributes.id || ""; - this.leader = attributes.leader || ""; - this.startNew = getInteger({ - data: attributes.startNew, - defaultValue: 0, - validate: x => x === 1 - }); - this.target = attributes.target || ""; - this.targetType = getStringOption(attributes.targetType, ["auto", "contentArea", "pageArea"]); - this.trailer = attributes.trailer || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.script = null; - } - [$toHTML](availableSpace) { - this[$extra] = {}; - return HTMLResult.FAILURE; - } -} -class Button extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "button", true); - this.highlight = getStringOption(attributes.highlight, ["inverted", "none", "outline", "push"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } - [$toHTML](availableSpace) { - const parent = this[$getParent](); - const grandpa = parent[$getParent](); - const htmlButton = { - name: "button", - attributes: { - id: this[$uid], - class: ["xfaButton"], - style: {} - }, - children: [] - }; - for (const event of grandpa.event.children) { - if (event.activity !== "click" || !event.script) { - continue; - } - const jsURL = recoverJsURL(event.script[$content]); - if (!jsURL) { - continue; - } - const href = fixURL(jsURL.url); - if (!href) { - continue; - } - htmlButton.children.push({ - name: "a", - attributes: { - id: "link" + this[$uid], - href, - newWindow: jsURL.newWindow, - class: ["xfaLink"], - style: {} - }, - children: [] - }); - } - return HTMLResult.success(htmlButton); - } -} -class Calculate extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "calculate", true); - this.id = attributes.id || ""; - this.override = getStringOption(attributes.override, ["disabled", "error", "ignore", "warning"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.message = null; - this.script = null; - } -} -class Caption extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "caption", true); - this.id = attributes.id || ""; - this.placement = getStringOption(attributes.placement, ["left", "bottom", "inline", "right", "top"]); - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.reserve = Math.ceil(getMeasurement(attributes.reserve)); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.font = null; - this.margin = null; - this.para = null; - this.value = null; - } - [$setValue](value) { - _setValue(this, value); - } - [$getExtra](availableSpace) { - if (!this[$extra]) { - let { - width, - height - } = availableSpace; - switch (this.placement) { - case "left": - case "right": - case "inline": - width = this.reserve <= 0 ? width : this.reserve; - break; - case "top": - case "bottom": - height = this.reserve <= 0 ? height : this.reserve; - break; - } - this[$extra] = layoutNode(this, { - width, - height - }); - } - return this[$extra]; - } - [$toHTML](availableSpace) { - if (!this.value) { - return HTMLResult.EMPTY; - } - this[$pushPara](); - const value = this.value[$toHTML](availableSpace).html; - if (!value) { - this[$popPara](); - return HTMLResult.EMPTY; - } - const savedReserve = this.reserve; - if (this.reserve <= 0) { - const { - w, - h - } = this[$getExtra](availableSpace); - switch (this.placement) { - case "left": - case "right": - case "inline": - this.reserve = w; - break; - case "top": - case "bottom": - this.reserve = h; - break; - } - } - const children = []; - if (typeof value === "string") { - children.push({ - name: "#text", - value - }); - } else { - children.push(value); - } - const style = toStyle(this, "font", "margin", "visibility"); - switch (this.placement) { - case "left": - case "right": - if (this.reserve > 0) { - style.width = measureToString(this.reserve); - } - break; - case "top": - case "bottom": - if (this.reserve > 0) { - style.height = measureToString(this.reserve); - } - break; - } - setPara(this, null, value); - this[$popPara](); - this.reserve = savedReserve; - return HTMLResult.success({ - name: "div", - attributes: { - style, - class: ["xfaCaption"] - }, - children - }); - } -} -class Certificate extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "certificate"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Certificates extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "certificates", true); - this.credentialServerPolicy = getStringOption(attributes.credentialServerPolicy, ["optional", "required"]); - this.id = attributes.id || ""; - this.url = attributes.url || ""; - this.urlPolicy = attributes.urlPolicy || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.encryption = null; - this.issuers = null; - this.keyUsage = null; - this.oids = null; - this.signing = null; - this.subjectDNs = null; - } -} -class CheckButton extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "checkButton", true); - this.id = attributes.id || ""; - this.mark = getStringOption(attributes.mark, ["default", "check", "circle", "cross", "diamond", "square", "star"]); - this.shape = getStringOption(attributes.shape, ["square", "round"]); - this.size = getMeasurement(attributes.size, "10pt"); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "margin"); - const size = measureToString(this.size); - style.width = style.height = size; - let type; - let className; - let groupId; - const field = this[$getParent]()[$getParent](); - const items = field.items.children.length && field.items.children[0][$toHTML]().html || []; - const exportedValue = { - on: (items[0] !== undefined ? items[0] : "on").toString(), - off: (items[1] !== undefined ? items[1] : "off").toString() - }; - const value = field.value?.[$text]() || "off"; - const checked = value === exportedValue.on || undefined; - const container = field[$getSubformParent](); - const fieldId = field[$uid]; - let dataId; - if (container instanceof ExclGroup) { - groupId = container[$uid]; - type = "radio"; - className = "xfaRadio"; - dataId = container[$data]?.[$uid] || container[$uid]; - } else { - type = "checkbox"; - className = "xfaCheckbox"; - dataId = field[$data]?.[$uid] || field[$uid]; - } - const input = { - name: "input", - attributes: { - class: [className], - style, - fieldId, - dataId, - type, - checked, - xfaOn: exportedValue.on, - xfaOff: exportedValue.off, - "aria-label": ariaLabel(field), - "aria-required": false - } - }; - if (groupId) { - input.attributes.name = groupId; - } - if (isRequired(field)) { - input.attributes["aria-required"] = true; - input.attributes.required = true; - } - return HTMLResult.success({ - name: "label", - attributes: { - class: ["xfaLabel"] - }, - children: [input] - }); - } -} -class ChoiceList extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "choiceList", true); - this.commitOn = getStringOption(attributes.commitOn, ["select", "exit"]); - this.id = attributes.id || ""; - this.open = getStringOption(attributes.open, ["userControl", "always", "multiSelect", "onEntry"]); - this.textEntry = getInteger({ - data: attributes.textEntry, - defaultValue: 0, - validate: x => x === 1 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "border", "margin"); - const ui = this[$getParent](); - const field = ui[$getParent](); - const fontSize = field.font?.size || 10; - const optionStyle = { - fontSize: `calc(${fontSize}px * var(--total-scale-factor))` - }; - const children = []; - if (field.items.children.length > 0) { - const items = field.items; - let displayedIndex = 0; - let saveIndex = 0; - if (items.children.length === 2) { - displayedIndex = items.children[0].save; - saveIndex = 1 - displayedIndex; - } - const displayed = items.children[displayedIndex][$toHTML]().html; - const values = items.children[saveIndex][$toHTML]().html; - let selected = false; - const value = field.value?.[$text]() || ""; - for (let i = 0, ii = displayed.length; i < ii; i++) { - const option = { - name: "option", - attributes: { - value: values[i] || displayed[i], - style: optionStyle - }, - value: displayed[i] - }; - if (values[i] === value) { - option.attributes.selected = selected = true; - } - children.push(option); - } - if (!selected) { - children.splice(0, 0, { - name: "option", - attributes: { - hidden: true, - selected: true - }, - value: " " - }); - } - } - const selectAttributes = { - class: ["xfaSelect"], - fieldId: field[$uid], - dataId: field[$data]?.[$uid] || field[$uid], - style, - "aria-label": ariaLabel(field), - "aria-required": false - }; - if (isRequired(field)) { - selectAttributes["aria-required"] = true; - selectAttributes.required = true; - } - if (this.open === "multiSelect") { - selectAttributes.multiple = true; - } - return HTMLResult.success({ - name: "label", - attributes: { - class: ["xfaLabel"] - }, - children: [{ - name: "select", - children, - attributes: selectAttributes - }] - }); - } -} -class Color extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "color", true); - this.cSpace = getStringOption(attributes.cSpace, ["SRGB"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.value = attributes.value ? getColor(attributes.value) : ""; - this.extras = null; - } - [$hasSettableValue]() { - return false; - } - [$toStyle]() { - return this.value ? Util.makeHexColor(this.value.r, this.value.g, this.value.b) : null; - } -} -class Comb extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "comb"); - this.id = attributes.id || ""; - this.numberOfCells = getInteger({ - data: attributes.numberOfCells, - defaultValue: 0, - validate: x => x >= 0 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Connect extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "connect", true); - this.connection = attributes.connection || ""; - this.id = attributes.id || ""; - this.ref = attributes.ref || ""; - this.usage = getStringOption(attributes.usage, ["exportAndImport", "exportOnly", "importOnly"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.picture = null; - } -} -class ContentArea extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "contentArea", true); - this.h = getMeasurement(attributes.h); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.w = getMeasurement(attributes.w); - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.desc = null; - this.extras = null; - } - [$toHTML](availableSpace) { - const left = measureToString(this.x); - const top = measureToString(this.y); - const style = { - left, - top, - width: measureToString(this.w), - height: measureToString(this.h) - }; - const classNames = ["xfaContentarea"]; - if (isPrintOnly(this)) { - classNames.push("xfaPrintOnly"); - } - return HTMLResult.success({ - name: "div", - children: [], - attributes: { - style, - class: classNames, - id: this[$uid] - } - }); - } -} -class Corner extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "corner", true); - this.id = attributes.id || ""; - this.inverted = getInteger({ - data: attributes.inverted, - defaultValue: 0, - validate: x => x === 1 - }); - this.join = getStringOption(attributes.join, ["square", "round"]); - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.radius = getMeasurement(attributes.radius); - this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); - this.thickness = getMeasurement(attributes.thickness, "0.5pt"); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle]() { - const style = toStyle(this, "visibility"); - style.radius = measureToString(this.join === "square" ? 0 : this.radius); - return style; - } -} -class DateElement extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "date"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const date = this[$content].trim(); - this[$content] = date ? new Date(date) : null; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] ? this[$content].toString() : ""); - } -} -class DateTime extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "dateTime"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const date = this[$content].trim(); - this[$content] = date ? new Date(date) : null; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] ? this[$content].toString() : ""); - } -} -class DateTimeEdit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "dateTimeEdit", true); - this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); - this.id = attributes.id || ""; - this.picker = getStringOption(attributes.picker, ["host", "none"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.comb = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "border", "font", "margin"); - const field = this[$getParent]()[$getParent](); - const html = { - name: "input", - attributes: { - type: "text", - fieldId: field[$uid], - dataId: field[$data]?.[$uid] || field[$uid], - class: ["xfaTextfield"], - style, - "aria-label": ariaLabel(field), - "aria-required": false - } - }; - if (isRequired(field)) { - html.attributes["aria-required"] = true; - html.attributes.required = true; - } - return HTMLResult.success({ - name: "label", - attributes: { - class: ["xfaLabel"] - }, - children: [html] - }); - } -} -class Decimal extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "decimal"); - this.fracDigits = getInteger({ - data: attributes.fracDigits, - defaultValue: 2, - validate: x => true - }); - this.id = attributes.id || ""; - this.leadDigits = getInteger({ - data: attributes.leadDigits, - defaultValue: -1, - validate: x => true - }); - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const number = parseFloat(this[$content].trim()); - this[$content] = isNaN(number) ? null : number; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); - } -} -class DefaultUi extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "defaultUi", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } -} -class Desc extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "desc", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.boolean = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.time = new XFAObjectArray(); - } -} -class DigestMethod extends OptionObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "digestMethod", ["", "SHA1", "SHA256", "SHA512", "RIPEMD160"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class DigestMethods extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "digestMethods", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.digestMethod = new XFAObjectArray(); - } -} -class Draw extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "draw", true); - this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); - this.colSpan = getInteger({ - data: attributes.colSpan, - defaultValue: 1, - validate: n => n >= 1 || n === -1 - }); - this.h = attributes.h ? getMeasurement(attributes.h) : ""; - this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); - this.id = attributes.id || ""; - this.locale = attributes.locale || ""; - this.maxH = getMeasurement(attributes.maxH, "0pt"); - this.maxW = getMeasurement(attributes.maxW, "0pt"); - this.minH = getMeasurement(attributes.minH, "0pt"); - this.minW = getMeasurement(attributes.minW, "0pt"); - this.name = attributes.name || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.relevant = getRelevant(attributes.relevant); - this.rotate = getInteger({ - data: attributes.rotate, - defaultValue: 0, - validate: x => x % 90 === 0 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.w = attributes.w ? getMeasurement(attributes.w) : ""; - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.assist = null; - this.border = null; - this.caption = null; - this.desc = null; - this.extras = null; - this.font = null; - this.keep = null; - this.margin = null; - this.para = null; - this.traversal = null; - this.ui = null; - this.value = null; - this.setProperty = new XFAObjectArray(); - } - [$setValue](value) { - _setValue(this, value); - } - [$toHTML](availableSpace) { - setTabIndex(this); - if (this.presence === "hidden" || this.presence === "inactive") { - return HTMLResult.EMPTY; - } - fixDimensions(this); - this[$pushPara](); - const savedW = this.w; - const savedH = this.h; - const { - w, - h, - isBroken - } = layoutNode(this, availableSpace); - if (w && this.w === "") { - if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { - this[$popPara](); - return HTMLResult.FAILURE; - } - this.w = w; - } - if (h && this.h === "") { - this.h = h; - } - setFirstUnsplittable(this); - if (!checkDimensions(this, availableSpace)) { - this.w = savedW; - this.h = savedH; - this[$popPara](); - return HTMLResult.FAILURE; - } - unsetFirstUnsplittable(this); - const style = toStyle(this, "font", "hAlign", "dimensions", "position", "presence", "rotate", "anchorType", "border", "margin"); - setMinMaxDimensions(this, style); - if (style.margin) { - style.padding = style.margin; - delete style.margin; - } - const classNames = ["xfaDraw"]; - if (this.font) { - classNames.push("xfaFont"); - } - if (isPrintOnly(this)) { - classNames.push("xfaPrintOnly"); - } - const attributes = { - style, - id: this[$uid], - class: classNames - }; - if (this.name) { - attributes.xfaName = this.name; - } - const html = { - name: "div", - attributes, - children: [] - }; - applyAssist(this, attributes); - const bbox = computeBbox(this, html, availableSpace); - const value = this.value ? this.value[$toHTML](availableSpace).html : null; - if (value === null) { - this.w = savedW; - this.h = savedH; - this[$popPara](); - return HTMLResult.success(createWrapper(this, html), bbox); - } - html.children.push(value); - setPara(this, style, value); - this.w = savedW; - this.h = savedH; - this[$popPara](); - return HTMLResult.success(createWrapper(this, html), bbox); - } -} -class Edge extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "edge", true); - this.cap = getStringOption(attributes.cap, ["square", "butt", "round"]); - this.id = attributes.id || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.stroke = getStringOption(attributes.stroke, ["solid", "dashDot", "dashDotDot", "dashed", "dotted", "embossed", "etched", "lowered", "raised"]); - this.thickness = getMeasurement(attributes.thickness, "0.5pt"); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle]() { - const style = toStyle(this, "visibility"); - Object.assign(style, { - linecap: this.cap, - width: measureToString(this.thickness), - color: this.color ? this.color[$toStyle]() : "#000000", - style: "" - }); - if (this.presence !== "visible") { - style.style = "none"; - } else { - switch (this.stroke) { - case "solid": - style.style = "solid"; - break; - case "dashDot": - style.style = "dashed"; - break; - case "dashDotDot": - style.style = "dashed"; - break; - case "dashed": - style.style = "dashed"; - break; - case "dotted": - style.style = "dotted"; - break; - case "embossed": - style.style = "ridge"; - break; - case "etched": - style.style = "groove"; - break; - case "lowered": - style.style = "inset"; - break; - case "raised": - style.style = "outset"; - break; - } - } - return style; - } -} -class Encoding extends OptionObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encoding", ["adbe.x509.rsa_sha1", "adbe.pkcs7.detached", "adbe.pkcs7.sha1"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Encodings extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encodings", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.encoding = new XFAObjectArray(); - } -} -class Encrypt extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encrypt", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.certificate = null; - } -} -class EncryptData extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encryptData", true); - this.id = attributes.id || ""; - this.operation = getStringOption(attributes.operation, ["encrypt", "decrypt"]); - this.target = attributes.target || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.filter = null; - this.manifest = null; - } -} -class Encryption extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encryption", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.certificate = new XFAObjectArray(); - } -} -class EncryptionMethod extends OptionObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encryptionMethod", ["", "AES256-CBC", "TRIPLEDES-CBC", "AES128-CBC", "AES192-CBC"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class EncryptionMethods extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "encryptionMethods", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.encryptionMethod = new XFAObjectArray(); - } -} -class Event extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "event", true); - this.activity = getStringOption(attributes.activity, ["click", "change", "docClose", "docReady", "enter", "exit", "full", "indexChange", "initialize", "mouseDown", "mouseEnter", "mouseExit", "mouseUp", "postExecute", "postOpen", "postPrint", "postSave", "postSign", "postSubmit", "preExecute", "preOpen", "prePrint", "preSave", "preSign", "preSubmit", "ready", "validationState"]); - this.id = attributes.id || ""; - this.listen = getStringOption(attributes.listen, ["refOnly", "refAndDescendents"]); - this.name = attributes.name || ""; - this.ref = attributes.ref || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.encryptData = null; - this.execute = null; - this.script = null; - this.signData = null; - this.submit = null; - } -} -class ExData extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "exData"); - this.contentType = attributes.contentType || ""; - this.href = attributes.href || ""; - this.id = attributes.id || ""; - this.maxLength = getInteger({ - data: attributes.maxLength, - defaultValue: -1, - validate: x => x >= -1 - }); - this.name = attributes.name || ""; - this.rid = attributes.rid || ""; - this.transferEncoding = getStringOption(attributes.transferEncoding, ["none", "base64", "package"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$isCDATAXml]() { - return this.contentType === "text/html"; - } - [$onChild](child) { - if (this.contentType === "text/html" && child[$namespaceId] === NamespaceIds.xhtml.id) { - this[$content] = child; - return true; - } - if (this.contentType === "text/xml") { - this[$content] = child; - return true; - } - return false; - } - [$toHTML](availableSpace) { - if (this.contentType !== "text/html" || !this[$content]) { - return HTMLResult.EMPTY; - } - return this[$content][$toHTML](availableSpace); - } -} -class ExObject extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "exObject", true); - this.archive = attributes.archive || ""; - this.classId = attributes.classId || ""; - this.codeBase = attributes.codeBase || ""; - this.codeType = attributes.codeType || ""; - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.boolean = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.exObject = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.time = new XFAObjectArray(); - } -} -class ExclGroup extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "exclGroup", true); - this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); - this.accessKey = attributes.accessKey || ""; - this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); - this.colSpan = getInteger({ - data: attributes.colSpan, - defaultValue: 1, - validate: n => n >= 1 || n === -1 - }); - this.h = attributes.h ? getMeasurement(attributes.h) : ""; - this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); - this.id = attributes.id || ""; - this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); - this.maxH = getMeasurement(attributes.maxH, "0pt"); - this.maxW = getMeasurement(attributes.maxW, "0pt"); - this.minH = getMeasurement(attributes.minH, "0pt"); - this.minW = getMeasurement(attributes.minW, "0pt"); - this.name = attributes.name || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.w = attributes.w ? getMeasurement(attributes.w) : ""; - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.assist = null; - this.bind = null; - this.border = null; - this.calculate = null; - this.caption = null; - this.desc = null; - this.extras = null; - this.margin = null; - this.para = null; - this.traversal = null; - this.validate = null; - this.connect = new XFAObjectArray(); - this.event = new XFAObjectArray(); - this.field = new XFAObjectArray(); - this.setProperty = new XFAObjectArray(); - } - [$isBindable]() { - return true; - } - [$hasSettableValue]() { - return true; - } - [$setValue](value) { - for (const field of this.field.children) { - if (!field.value) { - const nodeValue = new Value({}); - field[$appendChild](nodeValue); - field.value = nodeValue; - } - field.value[$setValue](value); - } - } - [$isThereMoreWidth]() { - return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); - } - [$isSplittable]() { - const parent = this[$getSubformParent](); - if (!parent[$isSplittable]()) { - return false; - } - if (this[$extra]._isSplittable !== undefined) { - return this[$extra]._isSplittable; - } - if (this.layout === "position" || this.layout.includes("row")) { - this[$extra]._isSplittable = false; - return false; - } - if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { - return false; - } - this[$extra]._isSplittable = true; - return true; - } - [$flushHTML]() { - return flushHTML(this); - } - [$addHTML](html, bbox) { - addHTML(this, html, bbox); - } - [$getAvailableSpace]() { - return getAvailableSpace(this); - } - [$toHTML](availableSpace) { - setTabIndex(this); - if (this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { - return HTMLResult.EMPTY; - } - fixDimensions(this); - const children = []; - const attributes = { - id: this[$uid], - class: [] - }; - setAccess(this, attributes.class); - this[$extra] ||= Object.create(null); - Object.assign(this[$extra], { - children, - attributes, - attempt: 0, - line: null, - numberInLine: 0, - availableSpace: { - width: Math.min(this.w || Infinity, availableSpace.width), - height: Math.min(this.h || Infinity, availableSpace.height) - }, - width: 0, - height: 0, - prevHeight: 0, - currentWidth: 0 - }); - const isSplittable = this[$isSplittable](); - if (!isSplittable) { - setFirstUnsplittable(this); - } - if (!checkDimensions(this, availableSpace)) { - return HTMLResult.FAILURE; - } - const filter = new Set(["field"]); - if (this.layout.includes("row")) { - const columnWidths = this[$getSubformParent]().columnWidths; - if (Array.isArray(columnWidths) && columnWidths.length > 0) { - this[$extra].columnWidths = columnWidths; - this[$extra].currentColumn = 0; - } - } - const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); - const classNames = ["xfaExclgroup"]; - const cl = layoutClass(this); - if (cl) { - classNames.push(cl); - } - if (isPrintOnly(this)) { - classNames.push("xfaPrintOnly"); - } - attributes.style = style; - attributes.class = classNames; - if (this.name) { - attributes.xfaName = this.name; - } - this[$pushPara](); - const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; - const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; - for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { - if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { - this[$extra].numberInLine = 0; - } - const result = this[$childrenToHTML]({ - filter, - include: true - }); - if (result.success) { - break; - } - if (result.isBreak()) { - this[$popPara](); - return result; - } - if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !this[$getTemplateRoot]()[$extra].noLayoutFailure) { - this[$extra].attempt = maxRun; - break; - } - } - this[$popPara](); - if (!isSplittable) { - unsetFirstUnsplittable(this); - } - if (this[$extra].attempt === maxRun) { - if (!isSplittable) { - delete this[$extra]; - } - return HTMLResult.FAILURE; - } - let marginH = 0; - let marginV = 0; - if (this.margin) { - marginH = this.margin.leftInset + this.margin.rightInset; - marginV = this.margin.topInset + this.margin.bottomInset; - } - const width = Math.max(this[$extra].width + marginH, this.w || 0); - const height = Math.max(this[$extra].height + marginV, this.h || 0); - const bbox = [this.x, this.y, width, height]; - if (this.w === "") { - style.width = measureToString(width); - } - if (this.h === "") { - style.height = measureToString(height); - } - const html = { - name: "div", - attributes, - children - }; - applyAssist(this, attributes); - delete this[$extra]; - return HTMLResult.success(createWrapper(this, html), bbox); - } -} -class Execute extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "execute"); - this.connection = attributes.connection || ""; - this.executeType = getStringOption(attributes.executeType, ["import", "remerge"]); - this.id = attributes.id || ""; - this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Extras extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "extras", true); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.boolean = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.extras = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.time = new XFAObjectArray(); - } -} -class Field extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "field", true); - this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); - this.accessKey = attributes.accessKey || ""; - this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); - this.colSpan = getInteger({ - data: attributes.colSpan, - defaultValue: 1, - validate: n => n >= 1 || n === -1 - }); - this.h = attributes.h ? getMeasurement(attributes.h) : ""; - this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); - this.id = attributes.id || ""; - this.locale = attributes.locale || ""; - this.maxH = getMeasurement(attributes.maxH, "0pt"); - this.maxW = getMeasurement(attributes.maxW, "0pt"); - this.minH = getMeasurement(attributes.minH, "0pt"); - this.minW = getMeasurement(attributes.minW, "0pt"); - this.name = attributes.name || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.relevant = getRelevant(attributes.relevant); - this.rotate = getInteger({ - data: attributes.rotate, - defaultValue: 0, - validate: x => x % 90 === 0 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.w = attributes.w ? getMeasurement(attributes.w) : ""; - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.assist = null; - this.bind = null; - this.border = null; - this.calculate = null; - this.caption = null; - this.desc = null; - this.extras = null; - this.font = null; - this.format = null; - this.items = new XFAObjectArray(2); - this.keep = null; - this.margin = null; - this.para = null; - this.traversal = null; - this.ui = null; - this.validate = null; - this.value = null; - this.bindItems = new XFAObjectArray(); - this.connect = new XFAObjectArray(); - this.event = new XFAObjectArray(); - this.setProperty = new XFAObjectArray(); - } - [$isBindable]() { - return true; - } - [$setValue](value) { - _setValue(this, value); - } - [$toHTML](availableSpace) { - setTabIndex(this); - if (!this.ui) { - this.ui = new Ui({}); - this.ui[$globalData] = this[$globalData]; - this[$appendChild](this.ui); - let node; - switch (this.items.children.length) { - case 0: - node = new TextEdit({}); - this.ui.textEdit = node; - break; - case 1: - node = new CheckButton({}); - this.ui.checkButton = node; - break; - case 2: - node = new ChoiceList({}); - this.ui.choiceList = node; - break; - } - this.ui[$appendChild](node); - } - if (!this.ui || this.presence === "hidden" || this.presence === "inactive" || this.h === 0 || this.w === 0) { - return HTMLResult.EMPTY; - } - if (this.caption) { - delete this.caption[$extra]; - } - this[$pushPara](); - const caption = this.caption ? this.caption[$toHTML](availableSpace).html : null; - const savedW = this.w; - const savedH = this.h; - let marginH = 0; - let marginV = 0; - if (this.margin) { - marginH = this.margin.leftInset + this.margin.rightInset; - marginV = this.margin.topInset + this.margin.bottomInset; - } - let borderDims = null; - if (this.w === "" || this.h === "") { - let width = null; - let height = null; - let uiW = 0; - let uiH = 0; - if (this.ui.checkButton) { - uiW = uiH = this.ui.checkButton.size; - } else { - const { - w, - h - } = layoutNode(this, availableSpace); - if (w !== null) { - uiW = w; - uiH = h; - } else { - uiH = fonts_getMetrics(this.font, true).lineNoGap; - } - } - borderDims = getBorderDims(this.ui[$getExtra]()); - uiW += borderDims.w; - uiH += borderDims.h; - if (this.caption) { - const { - w, - h, - isBroken - } = this.caption[$getExtra](availableSpace); - if (isBroken && this[$getSubformParent]()[$isThereMoreWidth]()) { - this[$popPara](); - return HTMLResult.FAILURE; - } - width = w; - height = h; - switch (this.caption.placement) { - case "left": - case "right": - case "inline": - width += uiW; - break; - case "top": - case "bottom": - height += uiH; - break; - } - } else { - width = uiW; - height = uiH; - } - if (width && this.w === "") { - width += marginH; - this.w = Math.min(this.maxW <= 0 ? Infinity : this.maxW, this.minW + 1 < width ? width : this.minW); - } - if (height && this.h === "") { - height += marginV; - this.h = Math.min(this.maxH <= 0 ? Infinity : this.maxH, this.minH + 1 < height ? height : this.minH); - } - } - this[$popPara](); - fixDimensions(this); - setFirstUnsplittable(this); - if (!checkDimensions(this, availableSpace)) { - this.w = savedW; - this.h = savedH; - this[$popPara](); - return HTMLResult.FAILURE; - } - unsetFirstUnsplittable(this); - const style = toStyle(this, "font", "dimensions", "position", "rotate", "anchorType", "presence", "margin", "hAlign"); - setMinMaxDimensions(this, style); - const classNames = ["xfaField"]; - if (this.font) { - classNames.push("xfaFont"); - } - if (isPrintOnly(this)) { - classNames.push("xfaPrintOnly"); - } - const attributes = { - style, - id: this[$uid], - class: classNames - }; - if (style.margin) { - style.padding = style.margin; - delete style.margin; - } - setAccess(this, classNames); - if (this.name) { - attributes.xfaName = this.name; - } - const children = []; - const html = { - name: "div", - attributes, - children - }; - applyAssist(this, attributes); - const borderStyle = this.border ? this.border[$toStyle]() : null; - const bbox = computeBbox(this, html, availableSpace); - const ui = this.ui[$toHTML]().html; - if (!ui) { - Object.assign(style, borderStyle); - return HTMLResult.success(createWrapper(this, html), bbox); - } - if (this[$tabIndex]) { - if (ui.children?.[0]) { - ui.children[0].attributes.tabindex = this[$tabIndex]; - } else { - ui.attributes.tabindex = this[$tabIndex]; - } - } - ui.attributes.style ||= Object.create(null); - let aElement = null; - if (this.ui.button) { - if (ui.children.length === 1) { - [aElement] = ui.children.splice(0, 1); - } - Object.assign(ui.attributes.style, borderStyle); - } else { - Object.assign(style, borderStyle); - } - children.push(ui); - if (this.value) { - if (this.ui.imageEdit) { - ui.children.push(this.value[$toHTML]().html); - } else if (!this.ui.button) { - let value = ""; - if (this.value.exData) { - value = this.value.exData[$text](); - } else if (this.value.text) { - value = this.value.text[$getExtra](); - } else { - const htmlValue = this.value[$toHTML]().html; - if (htmlValue !== null) { - value = htmlValue.children[0].value; - } - } - if (this.ui.textEdit && this.value.text?.maxChars) { - ui.children[0].attributes.maxLength = this.value.text.maxChars; - } - if (value) { - if (this.ui.numericEdit) { - value = parseFloat(value); - value = isNaN(value) ? "" : value.toString(); - } - if (ui.children[0].name === "textarea") { - ui.children[0].attributes.textContent = value; - } else { - ui.children[0].attributes.value = value; - } - } - } - } - if (!this.ui.imageEdit && ui.children?.[0] && this.h) { - borderDims = borderDims || getBorderDims(this.ui[$getExtra]()); - let captionHeight = 0; - if (this.caption && ["top", "bottom"].includes(this.caption.placement)) { - captionHeight = this.caption.reserve; - if (captionHeight <= 0) { - captionHeight = this.caption[$getExtra](availableSpace).h; - } - const inputHeight = this.h - captionHeight - marginV - borderDims.h; - ui.children[0].attributes.style.height = measureToString(inputHeight); - } else { - ui.children[0].attributes.style.height = "100%"; - } - } - if (aElement) { - ui.children.push(aElement); - } - if (!caption) { - if (ui.attributes.class) { - ui.attributes.class.push("xfaLeft"); - } - this.w = savedW; - this.h = savedH; - return HTMLResult.success(createWrapper(this, html), bbox); - } - if (this.ui.button) { - if (style.padding) { - delete style.padding; - } - if (caption.name === "div") { - caption.name = "span"; - } - ui.children.push(caption); - return HTMLResult.success(html, bbox); - } else if (this.ui.checkButton) { - caption.attributes.class[0] = "xfaCaptionForCheckButton"; - } - ui.attributes.class ||= []; - ui.children.splice(0, 0, caption); - switch (this.caption.placement) { - case "left": - ui.attributes.class.push("xfaLeft"); - break; - case "right": - ui.attributes.class.push("xfaRight"); - break; - case "top": - ui.attributes.class.push("xfaTop"); - break; - case "bottom": - ui.attributes.class.push("xfaBottom"); - break; - case "inline": - ui.attributes.class.push("xfaLeft"); - break; - } - this.w = savedW; - this.h = savedH; - return HTMLResult.success(createWrapper(this, html), bbox); - } -} -class Fill extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "fill", true); - this.id = attributes.id || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - this.linear = null; - this.pattern = null; - this.radial = null; - this.solid = null; - this.stipple = null; - } - [$toStyle]() { - const parent = this[$getParent](); - const grandpa = parent[$getParent](); - const ggrandpa = grandpa[$getParent](); - const style = Object.create(null); - let propName = "color"; - let altPropName = propName; - if (parent instanceof Border) { - propName = "background-color"; - altPropName = "background"; - if (ggrandpa instanceof Ui) { - style.backgroundColor = "white"; - } - } - if (parent instanceof Rectangle || parent instanceof Arc) { - propName = altPropName = "fill"; - style.fill = "white"; - } - for (const name of Object.getOwnPropertyNames(this)) { - if (name === "extras" || name === "color") { - continue; - } - const obj = this[name]; - if (!(obj instanceof XFAObject)) { - continue; - } - const color = obj[$toStyle](this.color); - if (color) { - style[color.startsWith("#") ? propName : altPropName] = color; - } - return style; - } - if (this.color?.value) { - const color = this.color[$toStyle](); - style[color.startsWith("#") ? propName : altPropName] = color; - } - return style; - } -} -class Filter extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "filter", true); - this.addRevocationInfo = getStringOption(attributes.addRevocationInfo, ["", "required", "optional", "none"]); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.version = getInteger({ - data: this.version, - defaultValue: 5, - validate: x => x >= 1 && x <= 5 - }); - this.appearanceFilter = null; - this.certificates = null; - this.digestMethods = null; - this.encodings = null; - this.encryptionMethods = null; - this.handler = null; - this.lockDocument = null; - this.mdp = null; - this.reasons = null; - this.timeStamp = null; - } -} -class Float extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "float"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const number = parseFloat(this[$content].trim()); - this[$content] = isNaN(number) ? null : number; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); - } -} -class template_Font extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "font", true); - this.baselineShift = getMeasurement(attributes.baselineShift); - this.fontHorizontalScale = getFloat({ - data: attributes.fontHorizontalScale, - defaultValue: 100, - validate: x => x >= 0 - }); - this.fontVerticalScale = getFloat({ - data: attributes.fontVerticalScale, - defaultValue: 100, - validate: x => x >= 0 - }); - this.id = attributes.id || ""; - this.kerningMode = getStringOption(attributes.kerningMode, ["none", "pair"]); - this.letterSpacing = getMeasurement(attributes.letterSpacing, "0"); - this.lineThrough = getInteger({ - data: attributes.lineThrough, - defaultValue: 0, - validate: x => x === 1 || x === 2 - }); - this.lineThroughPeriod = getStringOption(attributes.lineThroughPeriod, ["all", "word"]); - this.overline = getInteger({ - data: attributes.overline, - defaultValue: 0, - validate: x => x === 1 || x === 2 - }); - this.overlinePeriod = getStringOption(attributes.overlinePeriod, ["all", "word"]); - this.posture = getStringOption(attributes.posture, ["normal", "italic"]); - this.size = getMeasurement(attributes.size, "10pt"); - this.typeface = attributes.typeface || "Courier"; - this.underline = getInteger({ - data: attributes.underline, - defaultValue: 0, - validate: x => x === 1 || x === 2 - }); - this.underlinePeriod = getStringOption(attributes.underlinePeriod, ["all", "word"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.weight = getStringOption(attributes.weight, ["normal", "bold"]); - this.extras = null; - this.fill = null; - } - [$clean](builder) { - super[$clean](builder); - this[$globalData].usedTypefaces.add(this.typeface); - } - [$toStyle]() { - const style = toStyle(this, "fill"); - const color = style.color; - if (color) { - if (color === "#000000") { - delete style.color; - } else if (!color.startsWith("#")) { - style.background = color; - style.backgroundClip = "text"; - style.color = "transparent"; - } - } - if (this.baselineShift) { - style.verticalAlign = measureToString(this.baselineShift); - } - style.fontKerning = this.kerningMode === "none" ? "none" : "normal"; - style.letterSpacing = measureToString(this.letterSpacing); - if (this.lineThrough !== 0) { - style.textDecoration = "line-through"; - if (this.lineThrough === 2) { - style.textDecorationStyle = "double"; - } - } - if (this.overline !== 0) { - style.textDecoration = "overline"; - if (this.overline === 2) { - style.textDecorationStyle = "double"; - } - } - style.fontStyle = this.posture; - style.fontSize = measureToString(0.99 * this.size); - setFontFamily(this, this, this[$globalData].fontFinder, style); - if (this.underline !== 0) { - style.textDecoration = "underline"; - if (this.underline === 2) { - style.textDecorationStyle = "double"; - } - } - style.fontWeight = this.weight; - return style; - } -} -class Format extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "format", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.picture = null; - } -} -class Handler extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "handler"); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Hyphenation extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "hyphenation"); - this.excludeAllCaps = getInteger({ - data: attributes.excludeAllCaps, - defaultValue: 0, - validate: x => x === 1 - }); - this.excludeInitialCap = getInteger({ - data: attributes.excludeInitialCap, - defaultValue: 0, - validate: x => x === 1 - }); - this.hyphenate = getInteger({ - data: attributes.hyphenate, - defaultValue: 0, - validate: x => x === 1 - }); - this.id = attributes.id || ""; - this.pushCharacterCount = getInteger({ - data: attributes.pushCharacterCount, - defaultValue: 3, - validate: x => x >= 0 - }); - this.remainCharacterCount = getInteger({ - data: attributes.remainCharacterCount, - defaultValue: 3, - validate: x => x >= 0 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.wordCharacterCount = getInteger({ - data: attributes.wordCharacterCount, - defaultValue: 7, - validate: x => x >= 0 - }); - } -} -class Image extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "image"); - this.aspect = getStringOption(attributes.aspect, ["fit", "actual", "height", "none", "width"]); - this.contentType = attributes.contentType || ""; - this.href = attributes.href || ""; - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.transferEncoding = getStringOption(attributes.transferEncoding, ["base64", "none", "package"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$toHTML]() { - if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { - return HTMLResult.EMPTY; - } - let buffer = this[$globalData].images?.get(this.href); - if (!buffer && (this.href || !this[$content])) { - return HTMLResult.EMPTY; - } - if (!buffer && this.transferEncoding === "base64") { - buffer = fromBase64Util(this[$content]); - } - if (!buffer) { - return HTMLResult.EMPTY; - } - if (!this.contentType) { - for (const [header, type] of IMAGES_HEADERS) { - if (buffer.length > header.length && header.every((x, i) => x === buffer[i])) { - this.contentType = type; - break; - } - } - if (!this.contentType) { - return HTMLResult.EMPTY; - } - } - const blob = new Blob([buffer], { - type: this.contentType - }); - let style; - switch (this.aspect) { - case "fit": - case "actual": - break; - case "height": - style = { - height: "100%", - objectFit: "fill" - }; - break; - case "none": - style = { - width: "100%", - height: "100%", - objectFit: "fill" - }; - break; - case "width": - style = { - width: "100%", - objectFit: "fill" - }; - break; - } - const parent = this[$getParent](); - return HTMLResult.success({ - name: "img", - attributes: { - class: ["xfaImage"], - style, - src: URL.createObjectURL(blob), - alt: parent ? ariaLabel(parent[$getParent]()) : null - } - }); - } -} -class ImageEdit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "imageEdit", true); - this.data = getStringOption(attributes.data, ["link", "embed"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - if (this.data === "embed") { - return HTMLResult.success({ - name: "div", - children: [], - attributes: {} - }); - } - return HTMLResult.EMPTY; - } -} -class Integer extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "integer"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const number = parseInt(this[$content].trim(), 10); - this[$content] = isNaN(number) ? null : number; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] !== null ? this[$content].toString() : ""); - } -} -class Issuers extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "issuers", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.certificate = new XFAObjectArray(); - } -} -class Items extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "items", true); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.ref = attributes.ref || ""; - this.save = getInteger({ - data: attributes.save, - defaultValue: 0, - validate: x => x === 1 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.boolean = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.time = new XFAObjectArray(); - } - [$toHTML]() { - const output = []; - for (const child of this[$getChildren]()) { - output.push(child[$text]()); - } - return HTMLResult.success(output); - } -} -class Keep extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "keep", true); - this.id = attributes.id || ""; - const options = ["none", "contentArea", "pageArea"]; - this.intact = getStringOption(attributes.intact, options); - this.next = getStringOption(attributes.next, options); - this.previous = getStringOption(attributes.previous, options); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } -} -class KeyUsage extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "keyUsage"); - const options = ["", "yes", "no"]; - this.crlSign = getStringOption(attributes.crlSign, options); - this.dataEncipherment = getStringOption(attributes.dataEncipherment, options); - this.decipherOnly = getStringOption(attributes.decipherOnly, options); - this.digitalSignature = getStringOption(attributes.digitalSignature, options); - this.encipherOnly = getStringOption(attributes.encipherOnly, options); - this.id = attributes.id || ""; - this.keyAgreement = getStringOption(attributes.keyAgreement, options); - this.keyCertSign = getStringOption(attributes.keyCertSign, options); - this.keyEncipherment = getStringOption(attributes.keyEncipherment, options); - this.nonRepudiation = getStringOption(attributes.nonRepudiation, options); - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Line extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "line", true); - this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); - this.id = attributes.id || ""; - this.slope = getStringOption(attributes.slope, ["\\", "/"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.edge = null; - } - [$toHTML]() { - const parent = this[$getParent]()[$getParent](); - const edge = this.edge || new Edge({}); - const edgeStyle = edge[$toStyle](); - const style = Object.create(null); - const thickness = edge.presence === "visible" ? edge.thickness : 0; - style.strokeWidth = measureToString(thickness); - style.stroke = edgeStyle.color; - let x1, y1, x2, y2; - let width = "100%"; - let height = "100%"; - if (parent.w <= thickness) { - [x1, y1, x2, y2] = ["50%", 0, "50%", "100%"]; - width = style.strokeWidth; - } else if (parent.h <= thickness) { - [x1, y1, x2, y2] = [0, "50%", "100%", "50%"]; - height = style.strokeWidth; - } else if (this.slope === "\\") { - [x1, y1, x2, y2] = [0, 0, "100%", "100%"]; - } else { - [x1, y1, x2, y2] = [0, "100%", "100%", 0]; - } - const line = { - name: "line", - attributes: { - xmlns: SVG_NS, - x1, - y1, - x2, - y2, - style - } - }; - const svg = { - name: "svg", - children: [line], - attributes: { - xmlns: SVG_NS, - width, - height, - style: { - overflow: "visible" - } - } - }; - if (hasMargin(parent)) { - return HTMLResult.success({ - name: "div", - attributes: { - style: { - display: "inline", - width: "100%", - height: "100%" - } - }, - children: [svg] - }); - } - svg.attributes.style.position = "absolute"; - return HTMLResult.success(svg); - } -} -class Linear extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "linear", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["toRight", "toBottom", "toLeft", "toTop"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle](startColor) { - startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; - const transf = this.type.replace(/([RBLT])/, " $1").toLowerCase(); - const endColor = this.color ? this.color[$toStyle]() : "#000000"; - return `linear-gradient(${transf}, ${startColor}, ${endColor})`; - } -} -class LockDocument extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "lockDocument"); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - this[$content] = getStringOption(this[$content], ["auto", "0", "1"]); - } -} -class Manifest extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "manifest", true); - this.action = getStringOption(attributes.action, ["include", "all", "exclude"]); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.ref = new XFAObjectArray(); - } -} -class Margin extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "margin", true); - this.bottomInset = getMeasurement(attributes.bottomInset, "0"); - this.id = attributes.id || ""; - this.leftInset = getMeasurement(attributes.leftInset, "0"); - this.rightInset = getMeasurement(attributes.rightInset, "0"); - this.topInset = getMeasurement(attributes.topInset, "0"); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } - [$toStyle]() { - return { - margin: measureToString(this.topInset) + " " + measureToString(this.rightInset) + " " + measureToString(this.bottomInset) + " " + measureToString(this.leftInset) - }; - } -} -class Mdp extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "mdp"); - this.id = attributes.id || ""; - this.permissions = getInteger({ - data: attributes.permissions, - defaultValue: 2, - validate: x => x === 1 || x === 3 - }); - this.signatureType = getStringOption(attributes.signatureType, ["filler", "author"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Medium extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "medium"); - this.id = attributes.id || ""; - this.imagingBBox = getBBox(attributes.imagingBBox); - this.long = getMeasurement(attributes.long); - this.orientation = getStringOption(attributes.orientation, ["portrait", "landscape"]); - this.short = getMeasurement(attributes.short); - this.stock = attributes.stock || ""; - this.trayIn = getStringOption(attributes.trayIn, ["auto", "delegate", "pageFront"]); - this.trayOut = getStringOption(attributes.trayOut, ["auto", "delegate"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Message extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "message", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.text = new XFAObjectArray(); - } -} -class NumericEdit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "numericEdit", true); - this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.comb = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "border", "font", "margin"); - const field = this[$getParent]()[$getParent](); - const html = { - name: "input", - attributes: { - type: "text", - fieldId: field[$uid], - dataId: field[$data]?.[$uid] || field[$uid], - class: ["xfaTextfield"], - style, - "aria-label": ariaLabel(field), - "aria-required": false - } - }; - if (isRequired(field)) { - html.attributes["aria-required"] = true; - html.attributes.required = true; - } - return HTMLResult.success({ - name: "label", - attributes: { - class: ["xfaLabel"] - }, - children: [html] - }); - } -} -class Occur extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "occur", true); - this.id = attributes.id || ""; - this.initial = attributes.initial !== "" ? getInteger({ - data: attributes.initial, - defaultValue: "", - validate: x => true - }) : ""; - this.max = attributes.max !== "" ? getInteger({ - data: attributes.max, - defaultValue: 1, - validate: x => true - }) : ""; - this.min = attributes.min !== "" ? getInteger({ - data: attributes.min, - defaultValue: 1, - validate: x => true - }) : ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } - [$clean]() { - const parent = this[$getParent](); - const originalMin = this.min; - if (this.min === "") { - this.min = parent instanceof PageArea || parent instanceof PageSet ? 0 : 1; - } - if (this.max === "") { - if (originalMin === "") { - this.max = parent instanceof PageArea || parent instanceof PageSet ? -1 : 1; - } else { - this.max = this.min; - } - } - if (this.max !== -1 && this.max < this.min) { - this.max = this.min; - } - if (this.initial === "") { - this.initial = parent instanceof Template ? 1 : this.min; - } - } -} -class Oid extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "oid"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Oids extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "oids", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.oid = new XFAObjectArray(); - } -} -class Overflow extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "overflow"); - this.id = attributes.id || ""; - this.leader = attributes.leader || ""; - this.target = attributes.target || ""; - this.trailer = attributes.trailer || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$getExtra]() { - if (!this[$extra]) { - const parent = this[$getParent](); - const root = this[$getTemplateRoot](); - const target = root[$searchNode](this.target, parent); - const leader = root[$searchNode](this.leader, parent); - const trailer = root[$searchNode](this.trailer, parent); - this[$extra] = { - target: target?.[0] || null, - leader: leader?.[0] || null, - trailer: trailer?.[0] || null, - addLeader: false, - addTrailer: false - }; - } - return this[$extra]; - } -} -class PageArea extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "pageArea", true); - this.blankOrNotBlank = getStringOption(attributes.blankOrNotBlank, ["any", "blank", "notBlank"]); - this.id = attributes.id || ""; - this.initialNumber = getInteger({ - data: attributes.initialNumber, - defaultValue: 1, - validate: x => true - }); - this.name = attributes.name || ""; - this.numbered = getInteger({ - data: attributes.numbered, - defaultValue: 1, - validate: x => true - }); - this.oddOrEven = getStringOption(attributes.oddOrEven, ["any", "even", "odd"]); - this.pagePosition = getStringOption(attributes.pagePosition, ["any", "first", "last", "only", "rest"]); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.desc = null; - this.extras = null; - this.medium = null; - this.occur = null; - this.area = new XFAObjectArray(); - this.contentArea = new XFAObjectArray(); - this.draw = new XFAObjectArray(); - this.exclGroup = new XFAObjectArray(); - this.field = new XFAObjectArray(); - this.subform = new XFAObjectArray(); - } - [$isUsable]() { - if (!this[$extra]) { - this[$extra] = { - numberOfUse: 0 - }; - return true; - } - return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; - } - [$cleanPage]() { - delete this[$extra]; - } - [$getNextPage]() { - this[$extra] ||= { - numberOfUse: 0 - }; - const parent = this[$getParent](); - if (parent.relation === "orderedOccurrence") { - if (this[$isUsable]()) { - this[$extra].numberOfUse += 1; - return this; - } - } - return parent[$getNextPage](); - } - [$getAvailableSpace]() { - return this[$extra].space || { - width: 0, - height: 0 - }; - } - [$toHTML]() { - this[$extra] ||= { - numberOfUse: 1 - }; - const children = []; - this[$extra].children = children; - const style = Object.create(null); - if (this.medium && this.medium.short && this.medium.long) { - style.width = measureToString(this.medium.short); - style.height = measureToString(this.medium.long); - this[$extra].space = { - width: this.medium.short, - height: this.medium.long - }; - if (this.medium.orientation === "landscape") { - const x = style.width; - style.width = style.height; - style.height = x; - this[$extra].space = { - width: this.medium.long, - height: this.medium.short - }; - } - } else { - warn("XFA - No medium specified in pageArea: please file a bug."); - } - this[$childrenToHTML]({ - filter: new Set(["area", "draw", "field", "subform"]), - include: true - }); - this[$childrenToHTML]({ - filter: new Set(["contentArea"]), - include: true - }); - return HTMLResult.success({ - name: "div", - children, - attributes: { - class: ["xfaPage"], - id: this[$uid], - style, - xfaName: this.name - } - }); - } -} -class PageSet extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "pageSet", true); - this.duplexImposition = getStringOption(attributes.duplexImposition, ["longEdge", "shortEdge"]); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.relation = getStringOption(attributes.relation, ["orderedOccurrence", "duplexPaginated", "simplexPaginated"]); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.occur = null; - this.pageArea = new XFAObjectArray(); - this.pageSet = new XFAObjectArray(); - } - [$cleanPage]() { - for (const page of this.pageArea.children) { - page[$cleanPage](); - } - for (const page of this.pageSet.children) { - page[$cleanPage](); - } - } - [$isUsable]() { - return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; - } - [$getNextPage]() { - this[$extra] ||= { - numberOfUse: 1, - pageIndex: -1, - pageSetIndex: -1 - }; - if (this.relation === "orderedOccurrence") { - if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { - this[$extra].pageIndex += 1; - const pageArea = this.pageArea.children[this[$extra].pageIndex]; - return pageArea[$getNextPage](); - } - if (this[$extra].pageSetIndex + 1 < this.pageSet.children.length) { - this[$extra].pageSetIndex += 1; - return this.pageSet.children[this[$extra].pageSetIndex][$getNextPage](); - } - if (this[$isUsable]()) { - this[$extra].numberOfUse += 1; - this[$extra].pageIndex = -1; - this[$extra].pageSetIndex = -1; - return this[$getNextPage](); - } - const parent = this[$getParent](); - if (parent instanceof PageSet) { - return parent[$getNextPage](); - } - this[$cleanPage](); - return this[$getNextPage](); - } - const pageNumber = this[$getTemplateRoot]()[$extra].pageNumber; - const parity = pageNumber % 2 === 0 ? "even" : "odd"; - const position = pageNumber === 0 ? "first" : "rest"; - let page = this.pageArea.children.find(p => p.oddOrEven === parity && p.pagePosition === position); - if (page) { - return page; - } - page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === position); - if (page) { - return page; - } - page = this.pageArea.children.find(p => p.oddOrEven === "any" && p.pagePosition === "any"); - if (page) { - return page; - } - return this.pageArea.children[0]; - } -} -class Para extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "para", true); - this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); - this.id = attributes.id || ""; - this.lineHeight = attributes.lineHeight ? getMeasurement(attributes.lineHeight, "0pt") : ""; - this.marginLeft = attributes.marginLeft ? getMeasurement(attributes.marginLeft, "0pt") : ""; - this.marginRight = attributes.marginRight ? getMeasurement(attributes.marginRight, "0pt") : ""; - this.orphans = getInteger({ - data: attributes.orphans, - defaultValue: 0, - validate: x => x >= 0 - }); - this.preserve = attributes.preserve || ""; - this.radixOffset = attributes.radixOffset ? getMeasurement(attributes.radixOffset, "0pt") : ""; - this.spaceAbove = attributes.spaceAbove ? getMeasurement(attributes.spaceAbove, "0pt") : ""; - this.spaceBelow = attributes.spaceBelow ? getMeasurement(attributes.spaceBelow, "0pt") : ""; - this.tabDefault = attributes.tabDefault ? getMeasurement(this.tabDefault) : ""; - this.tabStops = (attributes.tabStops || "").trim().split(/\s+/).map((x, i) => i % 2 === 1 ? getMeasurement(x) : x); - this.textIndent = attributes.textIndent ? getMeasurement(attributes.textIndent, "0pt") : ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.vAlign = getStringOption(attributes.vAlign, ["top", "bottom", "middle"]); - this.widows = getInteger({ - data: attributes.widows, - defaultValue: 0, - validate: x => x >= 0 - }); - this.hyphenation = null; - } - [$toStyle]() { - const style = toStyle(this, "hAlign"); - if (this.marginLeft !== "") { - style.paddingLeft = measureToString(this.marginLeft); - } - if (this.marginRight !== "") { - style.paddingRight = measureToString(this.marginRight); - } - if (this.spaceAbove !== "") { - style.paddingTop = measureToString(this.spaceAbove); - } - if (this.spaceBelow !== "") { - style.paddingBottom = measureToString(this.spaceBelow); - } - if (this.textIndent !== "") { - style.textIndent = measureToString(this.textIndent); - fixTextIndent(style); - } - if (this.lineHeight > 0) { - style.lineHeight = measureToString(this.lineHeight); - } - if (this.tabDefault !== "") { - style.tabSize = measureToString(this.tabDefault); - } - if (this.tabStops.length > 0) {} - if (this.hyphenatation) { - Object.assign(style, this.hyphenatation[$toStyle]()); - } - return style; - } -} -class PasswordEdit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "passwordEdit", true); - this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); - this.id = attributes.id || ""; - this.passwordChar = attributes.passwordChar || "*"; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.extras = null; - this.margin = null; - } -} -class template_Pattern extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "pattern", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["crossHatch", "crossDiagonal", "diagonalLeft", "diagonalRight", "horizontal", "vertical"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle](startColor) { - startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; - const endColor = this.color ? this.color[$toStyle]() : "#000000"; - const width = 5; - const cmd = "repeating-linear-gradient"; - const colors = `${startColor},${startColor} ${width}px,${endColor} ${width}px,${endColor} ${2 * width}px`; - switch (this.type) { - case "crossHatch": - return `${cmd}(to top,${colors}) ${cmd}(to right,${colors})`; - case "crossDiagonal": - return `${cmd}(45deg,${colors}) ${cmd}(-45deg,${colors})`; - case "diagonalLeft": - return `${cmd}(45deg,${colors})`; - case "diagonalRight": - return `${cmd}(-45deg,${colors})`; - case "horizontal": - return `${cmd}(to top,${colors})`; - case "vertical": - return `${cmd}(to right,${colors})`; - } - return ""; - } -} -class Picture extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "picture"); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Proto extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "proto", true); - this.appearanceFilter = new XFAObjectArray(); - this.arc = new XFAObjectArray(); - this.area = new XFAObjectArray(); - this.assist = new XFAObjectArray(); - this.barcode = new XFAObjectArray(); - this.bindItems = new XFAObjectArray(); - this.bookend = new XFAObjectArray(); - this.boolean = new XFAObjectArray(); - this.border = new XFAObjectArray(); - this.break = new XFAObjectArray(); - this.breakAfter = new XFAObjectArray(); - this.breakBefore = new XFAObjectArray(); - this.button = new XFAObjectArray(); - this.calculate = new XFAObjectArray(); - this.caption = new XFAObjectArray(); - this.certificate = new XFAObjectArray(); - this.certificates = new XFAObjectArray(); - this.checkButton = new XFAObjectArray(); - this.choiceList = new XFAObjectArray(); - this.color = new XFAObjectArray(); - this.comb = new XFAObjectArray(); - this.connect = new XFAObjectArray(); - this.contentArea = new XFAObjectArray(); - this.corner = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.dateTimeEdit = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.defaultUi = new XFAObjectArray(); - this.desc = new XFAObjectArray(); - this.digestMethod = new XFAObjectArray(); - this.digestMethods = new XFAObjectArray(); - this.draw = new XFAObjectArray(); - this.edge = new XFAObjectArray(); - this.encoding = new XFAObjectArray(); - this.encodings = new XFAObjectArray(); - this.encrypt = new XFAObjectArray(); - this.encryptData = new XFAObjectArray(); - this.encryption = new XFAObjectArray(); - this.encryptionMethod = new XFAObjectArray(); - this.encryptionMethods = new XFAObjectArray(); - this.event = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.exObject = new XFAObjectArray(); - this.exclGroup = new XFAObjectArray(); - this.execute = new XFAObjectArray(); - this.extras = new XFAObjectArray(); - this.field = new XFAObjectArray(); - this.fill = new XFAObjectArray(); - this.filter = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.font = new XFAObjectArray(); - this.format = new XFAObjectArray(); - this.handler = new XFAObjectArray(); - this.hyphenation = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.imageEdit = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.issuers = new XFAObjectArray(); - this.items = new XFAObjectArray(); - this.keep = new XFAObjectArray(); - this.keyUsage = new XFAObjectArray(); - this.line = new XFAObjectArray(); - this.linear = new XFAObjectArray(); - this.lockDocument = new XFAObjectArray(); - this.manifest = new XFAObjectArray(); - this.margin = new XFAObjectArray(); - this.mdp = new XFAObjectArray(); - this.medium = new XFAObjectArray(); - this.message = new XFAObjectArray(); - this.numericEdit = new XFAObjectArray(); - this.occur = new XFAObjectArray(); - this.oid = new XFAObjectArray(); - this.oids = new XFAObjectArray(); - this.overflow = new XFAObjectArray(); - this.pageArea = new XFAObjectArray(); - this.pageSet = new XFAObjectArray(); - this.para = new XFAObjectArray(); - this.passwordEdit = new XFAObjectArray(); - this.pattern = new XFAObjectArray(); - this.picture = new XFAObjectArray(); - this.radial = new XFAObjectArray(); - this.reason = new XFAObjectArray(); - this.reasons = new XFAObjectArray(); - this.rectangle = new XFAObjectArray(); - this.ref = new XFAObjectArray(); - this.script = new XFAObjectArray(); - this.setProperty = new XFAObjectArray(); - this.signData = new XFAObjectArray(); - this.signature = new XFAObjectArray(); - this.signing = new XFAObjectArray(); - this.solid = new XFAObjectArray(); - this.speak = new XFAObjectArray(); - this.stipple = new XFAObjectArray(); - this.subform = new XFAObjectArray(); - this.subformSet = new XFAObjectArray(); - this.subjectDN = new XFAObjectArray(); - this.subjectDNs = new XFAObjectArray(); - this.submit = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.textEdit = new XFAObjectArray(); - this.time = new XFAObjectArray(); - this.timeStamp = new XFAObjectArray(); - this.toolTip = new XFAObjectArray(); - this.traversal = new XFAObjectArray(); - this.traverse = new XFAObjectArray(); - this.ui = new XFAObjectArray(); - this.validate = new XFAObjectArray(); - this.value = new XFAObjectArray(); - this.variables = new XFAObjectArray(); - } -} -class Radial extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "radial", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["toEdge", "toCenter"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle](startColor) { - startColor = startColor ? startColor[$toStyle]() : "#FFFFFF"; - const endColor = this.color ? this.color[$toStyle]() : "#000000"; - const colors = this.type === "toEdge" ? `${startColor},${endColor}` : `${endColor},${startColor}`; - return `radial-gradient(circle at center, ${colors})`; - } -} -class Reason extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "reason"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Reasons extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "reasons", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.reason = new XFAObjectArray(); - } -} -class Rectangle extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "rectangle", true); - this.hand = getStringOption(attributes.hand, ["even", "left", "right"]); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.corner = new XFAObjectArray(4); - this.edge = new XFAObjectArray(4); - this.fill = null; - } - [$toHTML]() { - const edge = this.edge.children.length ? this.edge.children[0] : new Edge({}); - const edgeStyle = edge[$toStyle](); - const style = Object.create(null); - if (this.fill?.presence === "visible") { - Object.assign(style, this.fill[$toStyle]()); - } else { - style.fill = "transparent"; - } - style.strokeWidth = measureToString(edge.presence === "visible" ? edge.thickness : 0); - style.stroke = edgeStyle.color; - const corner = this.corner.children.length ? this.corner.children[0] : new Corner({}); - const cornerStyle = corner[$toStyle](); - const rect = { - name: "rect", - attributes: { - xmlns: SVG_NS, - width: "100%", - height: "100%", - x: 0, - y: 0, - rx: cornerStyle.radius, - ry: cornerStyle.radius, - style - } - }; - const svg = { - name: "svg", - children: [rect], - attributes: { - xmlns: SVG_NS, - style: { - overflow: "visible" - }, - width: "100%", - height: "100%" - } - }; - const parent = this[$getParent]()[$getParent](); - if (hasMargin(parent)) { - return HTMLResult.success({ - name: "div", - attributes: { - style: { - display: "inline", - width: "100%", - height: "100%" - } - }, - children: [svg] - }); - } - svg.attributes.style.position = "absolute"; - return HTMLResult.success(svg); - } -} -class RefElement extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "ref"); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Script extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "script"); - this.binding = attributes.binding || ""; - this.contentType = attributes.contentType || ""; - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.runAt = getStringOption(attributes.runAt, ["client", "both", "server"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class SetProperty extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "setProperty"); - this.connection = attributes.connection || ""; - this.ref = attributes.ref || ""; - this.target = attributes.target || ""; - } -} -class SignData extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "signData", true); - this.id = attributes.id || ""; - this.operation = getStringOption(attributes.operation, ["sign", "clear", "verify"]); - this.ref = attributes.ref || ""; - this.target = attributes.target || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.filter = null; - this.manifest = null; - } -} -class Signature extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "signature", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["PDF1.3", "PDF1.6"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.border = null; - this.extras = null; - this.filter = null; - this.manifest = null; - this.margin = null; - } -} -class Signing extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "signing", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.certificate = new XFAObjectArray(); - } -} -class Solid extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "solid", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - } - [$toStyle](startColor) { - return startColor ? startColor[$toStyle]() : "#FFFFFF"; - } -} -class Speak extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "speak"); - this.disable = getInteger({ - data: attributes.disable, - defaultValue: 0, - validate: x => x === 1 - }); - this.id = attributes.id || ""; - this.priority = getStringOption(attributes.priority, ["custom", "caption", "name", "toolTip"]); - this.rid = attributes.rid || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Stipple extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "stipple", true); - this.id = attributes.id || ""; - this.rate = getInteger({ - data: attributes.rate, - defaultValue: 50, - validate: x => x >= 0 && x <= 100 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.color = null; - this.extras = null; - } - [$toStyle](bgColor) { - const alpha = this.rate / 100; - return Util.makeHexColor(Math.round(bgColor.value.r * (1 - alpha) + this.value.r * alpha), Math.round(bgColor.value.g * (1 - alpha) + this.value.g * alpha), Math.round(bgColor.value.b * (1 - alpha) + this.value.b * alpha)); - } -} -class Subform extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "subform", true); - this.access = getStringOption(attributes.access, ["open", "nonInteractive", "protected", "readOnly"]); - this.allowMacro = getInteger({ - data: attributes.allowMacro, - defaultValue: 0, - validate: x => x === 1 - }); - this.anchorType = getStringOption(attributes.anchorType, ["topLeft", "bottomCenter", "bottomLeft", "bottomRight", "middleCenter", "middleLeft", "middleRight", "topCenter", "topRight"]); - this.colSpan = getInteger({ - data: attributes.colSpan, - defaultValue: 1, - validate: n => n >= 1 || n === -1 - }); - this.columnWidths = (attributes.columnWidths || "").trim().split(/\s+/).map(x => x === "-1" ? -1 : getMeasurement(x)); - this.h = attributes.h ? getMeasurement(attributes.h) : ""; - this.hAlign = getStringOption(attributes.hAlign, ["left", "center", "justify", "justifyAll", "radix", "right"]); - this.id = attributes.id || ""; - this.layout = getStringOption(attributes.layout, ["position", "lr-tb", "rl-row", "rl-tb", "row", "table", "tb"]); - this.locale = attributes.locale || ""; - this.maxH = getMeasurement(attributes.maxH, "0pt"); - this.maxW = getMeasurement(attributes.maxW, "0pt"); - this.mergeMode = getStringOption(attributes.mergeMode, ["consumeData", "matchTemplate"]); - this.minH = getMeasurement(attributes.minH, "0pt"); - this.minW = getMeasurement(attributes.minW, "0pt"); - this.name = attributes.name || ""; - this.presence = getStringOption(attributes.presence, ["visible", "hidden", "inactive", "invisible"]); - this.relevant = getRelevant(attributes.relevant); - this.restoreState = getStringOption(attributes.restoreState, ["manual", "auto"]); - this.scope = getStringOption(attributes.scope, ["name", "none"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.w = attributes.w ? getMeasurement(attributes.w) : ""; - this.x = getMeasurement(attributes.x, "0pt"); - this.y = getMeasurement(attributes.y, "0pt"); - this.assist = null; - this.bind = null; - this.bookend = null; - this.border = null; - this.break = null; - this.calculate = null; - this.desc = null; - this.extras = null; - this.keep = null; - this.margin = null; - this.occur = null; - this.overflow = null; - this.pageSet = null; - this.para = null; - this.traversal = null; - this.validate = null; - this.variables = null; - this.area = new XFAObjectArray(); - this.breakAfter = new XFAObjectArray(); - this.breakBefore = new XFAObjectArray(); - this.connect = new XFAObjectArray(); - this.draw = new XFAObjectArray(); - this.event = new XFAObjectArray(); - this.exObject = new XFAObjectArray(); - this.exclGroup = new XFAObjectArray(); - this.field = new XFAObjectArray(); - this.proto = new XFAObjectArray(); - this.setProperty = new XFAObjectArray(); - this.subform = new XFAObjectArray(); - this.subformSet = new XFAObjectArray(); - } - [$getSubformParent]() { - const parent = this[$getParent](); - if (parent instanceof SubformSet) { - return parent[$getSubformParent](); - } - return parent; - } - [$isBindable]() { - return true; - } - [$isThereMoreWidth]() { - return this.layout.endsWith("-tb") && this[$extra].attempt === 0 && this[$extra].numberInLine > 0 || this[$getParent]()[$isThereMoreWidth](); - } - *[$getContainedChildren]() { - yield* getContainedChildren(this); - } - [$flushHTML]() { - return flushHTML(this); - } - [$addHTML](html, bbox) { - addHTML(this, html, bbox); - } - [$getAvailableSpace]() { - return getAvailableSpace(this); - } - [$isSplittable]() { - const parent = this[$getSubformParent](); - if (!parent[$isSplittable]()) { - return false; - } - if (this[$extra]._isSplittable !== undefined) { - return this[$extra]._isSplittable; - } - if (this.layout === "position" || this.layout.includes("row")) { - this[$extra]._isSplittable = false; - return false; - } - if (this.keep && this.keep.intact !== "none") { - this[$extra]._isSplittable = false; - return false; - } - if (parent.layout?.endsWith("-tb") && parent[$extra].numberInLine !== 0) { - return false; - } - this[$extra]._isSplittable = true; - return true; - } - [$toHTML](availableSpace) { - setTabIndex(this); - if (this.break) { - if (this.break.after !== "auto" || this.break.afterTarget !== "") { - const node = new BreakAfter({ - targetType: this.break.after, - target: this.break.afterTarget, - startNew: this.break.startNew.toString() - }); - node[$globalData] = this[$globalData]; - this[$appendChild](node); - this.breakAfter.push(node); - } - if (this.break.before !== "auto" || this.break.beforeTarget !== "") { - const node = new BreakBefore({ - targetType: this.break.before, - target: this.break.beforeTarget, - startNew: this.break.startNew.toString() - }); - node[$globalData] = this[$globalData]; - this[$appendChild](node); - this.breakBefore.push(node); - } - if (this.break.overflowTarget !== "") { - const node = new Overflow({ - target: this.break.overflowTarget, - leader: this.break.overflowLeader, - trailer: this.break.overflowTrailer - }); - node[$globalData] = this[$globalData]; - this[$appendChild](node); - this.overflow.push(node); - } - this[$removeChild](this.break); - this.break = null; - } - if (this.presence === "hidden" || this.presence === "inactive") { - return HTMLResult.EMPTY; - } - if (this.breakBefore.children.length > 1 || this.breakAfter.children.length > 1) { - warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug."); - } - if (this.breakBefore.children.length >= 1) { - const breakBefore = this.breakBefore.children[0]; - if (handleBreak(breakBefore)) { - return HTMLResult.breakNode(breakBefore); - } - } - if (this[$extra]?.afterBreakAfter) { - return HTMLResult.EMPTY; - } - fixDimensions(this); - const children = []; - const attributes = { - id: this[$uid], - class: [] - }; - setAccess(this, attributes.class); - this[$extra] ||= Object.create(null); - Object.assign(this[$extra], { - children, - line: null, - attributes, - attempt: 0, - numberInLine: 0, - availableSpace: { - width: Math.min(this.w || Infinity, availableSpace.width), - height: Math.min(this.h || Infinity, availableSpace.height) - }, - width: 0, - height: 0, - prevHeight: 0, - currentWidth: 0 - }); - const root = this[$getTemplateRoot](); - const savedNoLayoutFailure = root[$extra].noLayoutFailure; - const isSplittable = this[$isSplittable](); - if (!isSplittable) { - setFirstUnsplittable(this); - } - if (!checkDimensions(this, availableSpace)) { - return HTMLResult.FAILURE; - } - const filter = new Set(["area", "draw", "exclGroup", "field", "subform", "subformSet"]); - if (this.layout.includes("row")) { - const columnWidths = this[$getSubformParent]().columnWidths; - if (Array.isArray(columnWidths) && columnWidths.length > 0) { - this[$extra].columnWidths = columnWidths; - this[$extra].currentColumn = 0; - } - } - const style = toStyle(this, "anchorType", "dimensions", "position", "presence", "border", "margin", "hAlign"); - const classNames = ["xfaSubform"]; - const cl = layoutClass(this); - if (cl) { - classNames.push(cl); - } - attributes.style = style; - attributes.class = classNames; - if (this.name) { - attributes.xfaName = this.name; - } - if (this.overflow) { - const overflowExtra = this.overflow[$getExtra](); - if (overflowExtra.addLeader) { - overflowExtra.addLeader = false; - handleOverflow(this, overflowExtra.leader, availableSpace); - } - } - this[$pushPara](); - const isLrTb = this.layout === "lr-tb" || this.layout === "rl-tb"; - const maxRun = isLrTb ? MAX_ATTEMPTS_FOR_LRTB_LAYOUT : 1; - for (; this[$extra].attempt < maxRun; this[$extra].attempt++) { - if (isLrTb && this[$extra].attempt === MAX_ATTEMPTS_FOR_LRTB_LAYOUT - 1) { - this[$extra].numberInLine = 0; - } - const result = this[$childrenToHTML]({ - filter, - include: true - }); - if (result.success) { - break; - } - if (result.isBreak()) { - this[$popPara](); - return result; - } - if (isLrTb && this[$extra].attempt === 0 && this[$extra].numberInLine === 0 && !root[$extra].noLayoutFailure) { - this[$extra].attempt = maxRun; - break; - } - } - this[$popPara](); - if (!isSplittable) { - unsetFirstUnsplittable(this); - } - root[$extra].noLayoutFailure = savedNoLayoutFailure; - if (this[$extra].attempt === maxRun) { - if (this.overflow) { - this[$getTemplateRoot]()[$extra].overflowNode = this.overflow; - } - if (!isSplittable) { - delete this[$extra]; - } - return HTMLResult.FAILURE; - } - if (this.overflow) { - const overflowExtra = this.overflow[$getExtra](); - if (overflowExtra.addTrailer) { - overflowExtra.addTrailer = false; - handleOverflow(this, overflowExtra.trailer, availableSpace); - } - } - let marginH = 0; - let marginV = 0; - if (this.margin) { - marginH = this.margin.leftInset + this.margin.rightInset; - marginV = this.margin.topInset + this.margin.bottomInset; - } - const width = Math.max(this[$extra].width + marginH, this.w || 0); - const height = Math.max(this[$extra].height + marginV, this.h || 0); - const bbox = [this.x, this.y, width, height]; - if (this.w === "") { - style.width = measureToString(width); - } - if (this.h === "") { - style.height = measureToString(height); - } - if ((style.width === "0px" || style.height === "0px") && children.length === 0) { - return HTMLResult.EMPTY; - } - const html = { - name: "div", - attributes, - children - }; - applyAssist(this, attributes); - const result = HTMLResult.success(createWrapper(this, html), bbox); - if (this.breakAfter.children.length >= 1) { - const breakAfter = this.breakAfter.children[0]; - if (handleBreak(breakAfter)) { - this[$extra].afterBreakAfter = result; - return HTMLResult.breakNode(breakAfter); - } - } - delete this[$extra]; - return result; - } -} -class SubformSet extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "subformSet", true); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.relation = getStringOption(attributes.relation, ["ordered", "choice", "unordered"]); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.bookend = null; - this.break = null; - this.desc = null; - this.extras = null; - this.occur = null; - this.overflow = null; - this.breakAfter = new XFAObjectArray(); - this.breakBefore = new XFAObjectArray(); - this.subform = new XFAObjectArray(); - this.subformSet = new XFAObjectArray(); - } - *[$getContainedChildren]() { - yield* getContainedChildren(this); - } - [$getSubformParent]() { - let parent = this[$getParent](); - while (!(parent instanceof Subform)) { - parent = parent[$getParent](); - } - return parent; - } - [$isBindable]() { - return true; - } -} -class SubjectDN extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "subjectDN"); - this.delimiter = attributes.delimiter || ","; - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - this[$content] = new Map(this[$content].split(this.delimiter).map(kv => { - kv = kv.split("=", 2); - kv[0] = kv[0].trim(); - return kv; - })); - } -} -class SubjectDNs extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "subjectDNs", true); - this.id = attributes.id || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.subjectDN = new XFAObjectArray(); - } -} -class Submit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "submit", true); - this.embedPDF = getInteger({ - data: attributes.embedPDF, - defaultValue: 0, - validate: x => x === 1 - }); - this.format = getStringOption(attributes.format, ["xdp", "formdata", "pdf", "urlencoded", "xfd", "xml"]); - this.id = attributes.id || ""; - this.target = attributes.target || ""; - this.textEncoding = getKeyword({ - data: attributes.textEncoding ? attributes.textEncoding.toLowerCase() : "", - defaultValue: "", - validate: k => ["utf-8", "big-five", "fontspecific", "gbk", "gb-18030", "gb-2312", "ksc-5601", "none", "shift-jis", "ucs-2", "utf-16"].includes(k) || k.match(/iso-8859-\d{2}/) - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.xdpContent = attributes.xdpContent || ""; - this.encrypt = null; - this.encryptData = new XFAObjectArray(); - this.signData = new XFAObjectArray(); - } -} -class Template extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "template", true); - this.baseProfile = getStringOption(attributes.baseProfile, ["full", "interactiveForms"]); - this.extras = null; - this.subform = new XFAObjectArray(); - } - [$finalize]() { - if (this.subform.children.length === 0) { - warn("XFA - No subforms in template node."); - } - if (this.subform.children.length >= 2) { - warn("XFA - Several subforms in template node: please file a bug."); - } - this[$tabIndex] = DEFAULT_TAB_INDEX; - } - [$isSplittable]() { - return true; - } - [$searchNode](expr, container) { - if (expr.startsWith("#")) { - return [this[$ids].get(expr.slice(1))]; - } - return searchNode(this, container, expr, true, true); - } - *[$toPages]() { - if (!this.subform.children.length) { - return HTMLResult.success({ - name: "div", - children: [] - }); - } - this[$extra] = { - overflowNode: null, - firstUnsplittable: null, - currentContentArea: null, - currentPageArea: null, - noLayoutFailure: false, - pageNumber: 1, - pagePosition: "first", - oddOrEven: "odd", - blankOrNotBlank: "nonBlank", - paraStack: [] - }; - const root = this.subform.children[0]; - root.pageSet[$cleanPage](); - const pageAreas = root.pageSet.pageArea.children; - const mainHtml = { - name: "div", - children: [] - }; - let pageArea = null; - let breakBefore = null; - let breakBeforeTarget = null; - if (root.breakBefore.children.length >= 1) { - breakBefore = root.breakBefore.children[0]; - breakBeforeTarget = breakBefore.target; - } else if (root.subform.children.length >= 1 && root.subform.children[0].breakBefore.children.length >= 1) { - breakBefore = root.subform.children[0].breakBefore.children[0]; - breakBeforeTarget = breakBefore.target; - } else if (root.break?.beforeTarget) { - breakBefore = root.break; - breakBeforeTarget = breakBefore.beforeTarget; - } else if (root.subform.children.length >= 1 && root.subform.children[0].break?.beforeTarget) { - breakBefore = root.subform.children[0].break; - breakBeforeTarget = breakBefore.beforeTarget; - } - if (breakBefore) { - const target = this[$searchNode](breakBeforeTarget, breakBefore[$getParent]()); - if (target instanceof PageArea) { - pageArea = target; - breakBefore[$extra] = {}; - } - } - pageArea ||= pageAreas[0]; - pageArea[$extra] = { - numberOfUse: 1 - }; - const pageAreaParent = pageArea[$getParent](); - pageAreaParent[$extra] = { - numberOfUse: 1, - pageIndex: pageAreaParent.pageArea.children.indexOf(pageArea), - pageSetIndex: 0 - }; - let targetPageArea; - let leader = null; - let trailer = null; - let hasSomething = true; - let hasSomethingCounter = 0; - let startIndex = 0; - while (true) { - if (!hasSomething) { - mainHtml.children.pop(); - if (++hasSomethingCounter === MAX_EMPTY_PAGES) { - warn("XFA - Something goes wrong: please file a bug."); - return mainHtml; - } - } else { - hasSomethingCounter = 0; - } - targetPageArea = null; - this[$extra].currentPageArea = pageArea; - const page = pageArea[$toHTML]().html; - mainHtml.children.push(page); - if (leader) { - this[$extra].noLayoutFailure = true; - page.children.push(leader[$toHTML](pageArea[$extra].space).html); - leader = null; - } - if (trailer) { - this[$extra].noLayoutFailure = true; - page.children.push(trailer[$toHTML](pageArea[$extra].space).html); - trailer = null; - } - const contentAreas = pageArea.contentArea.children; - const htmlContentAreas = page.children.filter(node => node.attributes.class.includes("xfaContentarea")); - hasSomething = false; - this[$extra].firstUnsplittable = null; - this[$extra].noLayoutFailure = false; - const flush = index => { - const html = root[$flushHTML](); - if (html) { - hasSomething ||= html.children?.length > 0; - htmlContentAreas[index].children.push(html); - } - }; - for (let i = startIndex, ii = contentAreas.length; i < ii; i++) { - const contentArea = this[$extra].currentContentArea = contentAreas[i]; - const space = { - width: contentArea.w, - height: contentArea.h - }; - startIndex = 0; - if (leader) { - htmlContentAreas[i].children.push(leader[$toHTML](space).html); - leader = null; - } - if (trailer) { - htmlContentAreas[i].children.push(trailer[$toHTML](space).html); - trailer = null; - } - const html = root[$toHTML](space); - if (html.success) { - if (html.html) { - hasSomething ||= html.html.children?.length > 0; - htmlContentAreas[i].children.push(html.html); - } else if (!hasSomething && mainHtml.children.length > 1) { - mainHtml.children.pop(); - } - return mainHtml; - } - if (html.isBreak()) { - const node = html.breakNode; - flush(i); - if (node.targetType === "auto") { - continue; - } - if (node.leader) { - leader = this[$searchNode](node.leader, node[$getParent]()); - leader = leader ? leader[0] : null; - } - if (node.trailer) { - trailer = this[$searchNode](node.trailer, node[$getParent]()); - trailer = trailer ? trailer[0] : null; - } - if (node.targetType === "pageArea") { - targetPageArea = node[$extra].target; - i = Infinity; - } else if (!node[$extra].target) { - i = node[$extra].index; - } else { - targetPageArea = node[$extra].target; - startIndex = node[$extra].index + 1; - i = Infinity; - } - continue; - } - if (this[$extra].overflowNode) { - const node = this[$extra].overflowNode; - this[$extra].overflowNode = null; - const overflowExtra = node[$getExtra](); - const target = overflowExtra.target; - overflowExtra.addLeader = overflowExtra.leader !== null; - overflowExtra.addTrailer = overflowExtra.trailer !== null; - flush(i); - const currentIndex = i; - i = Infinity; - if (target instanceof PageArea) { - targetPageArea = target; - } else if (target instanceof ContentArea) { - const index = contentAreas.indexOf(target); - if (index !== -1) { - if (index > currentIndex) { - i = index - 1; - } else { - startIndex = index; - } - } else { - targetPageArea = target[$getParent](); - startIndex = targetPageArea.contentArea.children.indexOf(target); - } - } - continue; - } - flush(i); - } - this[$extra].pageNumber += 1; - if (targetPageArea) { - if (targetPageArea[$isUsable]()) { - targetPageArea[$extra].numberOfUse += 1; - } else { - targetPageArea = null; - } - } - pageArea = targetPageArea || pageArea[$getNextPage](); - yield null; - } - } -} -class Text extends ContentObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "text"); - this.id = attributes.id || ""; - this.maxChars = getInteger({ - data: attributes.maxChars, - defaultValue: 0, - validate: x => x >= 0 - }); - this.name = attributes.name || ""; - this.rid = attributes.rid || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$acceptWhitespace]() { - return true; - } - [$onChild](child) { - if (child[$namespaceId] === NamespaceIds.xhtml.id) { - this[$content] = child; - return true; - } - warn(`XFA - Invalid content in Text: ${child[$nodeName]}.`); - return false; - } - [$onText](str) { - if (this[$content] instanceof XFAObject) { - return; - } - super[$onText](str); - } - [$finalize]() { - if (typeof this[$content] === "string") { - this[$content] = this[$content].replaceAll("\r\n", "\n"); - } - } - [$getExtra]() { - if (typeof this[$content] === "string") { - return this[$content].split(/[\u2029\u2028\n]/).filter(line => !!line).join("\n"); - } - return this[$content][$text](); - } - [$toHTML](availableSpace) { - if (typeof this[$content] === "string") { - const html = valueToHtml(this[$content]).html; - if (this[$content].includes("\u2029")) { - html.name = "div"; - html.children = []; - this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).flatMap(line => [{ - name: "span", - value: line - }, { - name: "br" - }])).forEach(lines => { - html.children.push({ - name: "p", - children: lines - }); - }); - } else if (/[\u2028\n]/.test(this[$content])) { - html.name = "div"; - html.children = []; - this[$content].split(/[\u2028\n]/).forEach(line => { - html.children.push({ - name: "span", - value: line - }, { - name: "br" - }); - }); - } - return HTMLResult.success(html); - } - return this[$content][$toHTML](availableSpace); - } -} -class TextEdit extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "textEdit", true); - this.allowRichText = getInteger({ - data: attributes.allowRichText, - defaultValue: 0, - validate: x => x === 1 - }); - this.hScrollPolicy = getStringOption(attributes.hScrollPolicy, ["auto", "off", "on"]); - this.id = attributes.id || ""; - this.multiLine = getInteger({ - data: attributes.multiLine, - defaultValue: "", - validate: x => x === 0 || x === 1 - }); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.vScrollPolicy = getStringOption(attributes.vScrollPolicy, ["auto", "off", "on"]); - this.border = null; - this.comb = null; - this.extras = null; - this.margin = null; - } - [$toHTML](availableSpace) { - const style = toStyle(this, "border", "font", "margin"); - let html; - const field = this[$getParent]()[$getParent](); - if (this.multiLine === "") { - this.multiLine = field instanceof Draw ? 1 : 0; - } - if (this.multiLine === 1) { - html = { - name: "textarea", - attributes: { - dataId: field[$data]?.[$uid] || field[$uid], - fieldId: field[$uid], - class: ["xfaTextfield"], - style, - "aria-label": ariaLabel(field), - "aria-required": false - } - }; - } else { - html = { - name: "input", - attributes: { - type: "text", - dataId: field[$data]?.[$uid] || field[$uid], - fieldId: field[$uid], - class: ["xfaTextfield"], - style, - "aria-label": ariaLabel(field), - "aria-required": false - } - }; - } - if (isRequired(field)) { - html.attributes["aria-required"] = true; - html.attributes.required = true; - } - return HTMLResult.success({ - name: "label", - attributes: { - class: ["xfaLabel"] - }, - children: [html] - }); - } -} -class Time extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "time"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } - [$finalize]() { - const date = this[$content].trim(); - this[$content] = date ? new Date(date) : null; - } - [$toHTML](availableSpace) { - return valueToHtml(this[$content] ? this[$content].toString() : ""); - } -} -class TimeStamp extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "timeStamp"); - this.id = attributes.id || ""; - this.server = attributes.server || ""; - this.type = getStringOption(attributes.type, ["optional", "required"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class ToolTip extends StringObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "toolTip"); - this.id = attributes.id || ""; - this.rid = attributes.rid || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Traversal extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "traversal", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.traverse = new XFAObjectArray(); - } -} -class Traverse extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "traverse", true); - this.id = attributes.id || ""; - this.operation = getStringOption(attributes.operation, ["next", "back", "down", "first", "left", "right", "up"]); - this.ref = attributes.ref || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.script = null; - } - get name() { - return this.operation; - } - [$isTransparent]() { - return false; - } -} -class Ui extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "ui", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.picture = null; - this.barcode = null; - this.button = null; - this.checkButton = null; - this.choiceList = null; - this.dateTimeEdit = null; - this.defaultUi = null; - this.imageEdit = null; - this.numericEdit = null; - this.passwordEdit = null; - this.signature = null; - this.textEdit = null; - } - [$getExtra]() { - if (this[$extra] === undefined) { - for (const name of Object.getOwnPropertyNames(this)) { - if (name === "extras" || name === "picture") { - continue; - } - const obj = this[name]; - if (!(obj instanceof XFAObject)) { - continue; - } - this[$extra] = obj; - return obj; - } - this[$extra] = null; - } - return this[$extra]; - } - [$toHTML](availableSpace) { - const obj = this[$getExtra](); - if (obj) { - return obj[$toHTML](availableSpace); - } - return HTMLResult.EMPTY; - } -} -class Validate extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "validate", true); - this.formatTest = getStringOption(attributes.formatTest, ["warning", "disabled", "error"]); - this.id = attributes.id || ""; - this.nullTest = getStringOption(attributes.nullTest, ["disabled", "error", "warning"]); - this.scriptTest = getStringOption(attributes.scriptTest, ["error", "disabled", "warning"]); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.extras = null; - this.message = null; - this.picture = null; - this.script = null; - } -} -class Value extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "value", true); - this.id = attributes.id || ""; - this.override = getInteger({ - data: attributes.override, - defaultValue: 0, - validate: x => x === 1 - }); - this.relevant = getRelevant(attributes.relevant); - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.arc = null; - this.boolean = null; - this.date = null; - this.dateTime = null; - this.decimal = null; - this.exData = null; - this.float = null; - this.image = null; - this.integer = null; - this.line = null; - this.rectangle = null; - this.text = null; - this.time = null; - } - [$setValue](value) { - const parent = this[$getParent](); - if (parent instanceof Field) { - if (parent.ui?.imageEdit) { - if (!this.image) { - this.image = new Image({}); - this[$appendChild](this.image); - } - this.image[$content] = value[$content]; - return; - } - } - const valueName = value[$nodeName]; - if (this[valueName] !== null) { - this[valueName][$content] = value[$content]; - return; - } - for (const name of Object.getOwnPropertyNames(this)) { - const obj = this[name]; - if (obj instanceof XFAObject) { - this[name] = null; - this[$removeChild](obj); - } - } - this[value[$nodeName]] = value; - this[$appendChild](value); - } - [$text]() { - if (this.exData) { - if (typeof this.exData[$content] === "string") { - return this.exData[$content].trim(); - } - return this.exData[$content][$text]().trim(); - } - for (const name of Object.getOwnPropertyNames(this)) { - if (name === "image") { - continue; - } - const obj = this[name]; - if (obj instanceof XFAObject) { - return (obj[$content] || "").toString().trim(); - } - } - return null; - } - [$toHTML](availableSpace) { - for (const name of Object.getOwnPropertyNames(this)) { - const obj = this[name]; - if (!(obj instanceof XFAObject)) { - continue; - } - return obj[$toHTML](availableSpace); - } - return HTMLResult.EMPTY; - } -} -class Variables extends XFAObject { - constructor(attributes) { - super(TEMPLATE_NS_ID, "variables", true); - this.id = attributes.id || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - this.boolean = new XFAObjectArray(); - this.date = new XFAObjectArray(); - this.dateTime = new XFAObjectArray(); - this.decimal = new XFAObjectArray(); - this.exData = new XFAObjectArray(); - this.float = new XFAObjectArray(); - this.image = new XFAObjectArray(); - this.integer = new XFAObjectArray(); - this.manifest = new XFAObjectArray(); - this.script = new XFAObjectArray(); - this.text = new XFAObjectArray(); - this.time = new XFAObjectArray(); - } - [$isTransparent]() { - return true; - } -} -class TemplateNamespace { - static [$buildXFAObject](name, attributes) { - if (TemplateNamespace.hasOwnProperty(name)) { - const node = TemplateNamespace[name](attributes); - node[$setSetAttributes](attributes); - return node; - } - return undefined; - } - static appearanceFilter(attrs) { - return new AppearanceFilter(attrs); - } - static arc(attrs) { - return new Arc(attrs); - } - static area(attrs) { - return new Area(attrs); - } - static assist(attrs) { - return new Assist(attrs); - } - static barcode(attrs) { - return new Barcode(attrs); - } - static bind(attrs) { - return new Bind(attrs); - } - static bindItems(attrs) { - return new BindItems(attrs); - } - static bookend(attrs) { - return new Bookend(attrs); - } - static boolean(attrs) { - return new BooleanElement(attrs); - } - static border(attrs) { - return new Border(attrs); - } - static break(attrs) { - return new Break(attrs); - } - static breakAfter(attrs) { - return new BreakAfter(attrs); - } - static breakBefore(attrs) { - return new BreakBefore(attrs); - } - static button(attrs) { - return new Button(attrs); - } - static calculate(attrs) { - return new Calculate(attrs); - } - static caption(attrs) { - return new Caption(attrs); - } - static certificate(attrs) { - return new Certificate(attrs); - } - static certificates(attrs) { - return new Certificates(attrs); - } - static checkButton(attrs) { - return new CheckButton(attrs); - } - static choiceList(attrs) { - return new ChoiceList(attrs); - } - static color(attrs) { - return new Color(attrs); - } - static comb(attrs) { - return new Comb(attrs); - } - static connect(attrs) { - return new Connect(attrs); - } - static contentArea(attrs) { - return new ContentArea(attrs); - } - static corner(attrs) { - return new Corner(attrs); - } - static date(attrs) { - return new DateElement(attrs); - } - static dateTime(attrs) { - return new DateTime(attrs); - } - static dateTimeEdit(attrs) { - return new DateTimeEdit(attrs); - } - static decimal(attrs) { - return new Decimal(attrs); - } - static defaultUi(attrs) { - return new DefaultUi(attrs); - } - static desc(attrs) { - return new Desc(attrs); - } - static digestMethod(attrs) { - return new DigestMethod(attrs); - } - static digestMethods(attrs) { - return new DigestMethods(attrs); - } - static draw(attrs) { - return new Draw(attrs); - } - static edge(attrs) { - return new Edge(attrs); - } - static encoding(attrs) { - return new Encoding(attrs); - } - static encodings(attrs) { - return new Encodings(attrs); - } - static encrypt(attrs) { - return new Encrypt(attrs); - } - static encryptData(attrs) { - return new EncryptData(attrs); - } - static encryption(attrs) { - return new Encryption(attrs); - } - static encryptionMethod(attrs) { - return new EncryptionMethod(attrs); - } - static encryptionMethods(attrs) { - return new EncryptionMethods(attrs); - } - static event(attrs) { - return new Event(attrs); - } - static exData(attrs) { - return new ExData(attrs); - } - static exObject(attrs) { - return new ExObject(attrs); - } - static exclGroup(attrs) { - return new ExclGroup(attrs); - } - static execute(attrs) { - return new Execute(attrs); - } - static extras(attrs) { - return new Extras(attrs); - } - static field(attrs) { - return new Field(attrs); - } - static fill(attrs) { - return new Fill(attrs); - } - static filter(attrs) { - return new Filter(attrs); - } - static float(attrs) { - return new Float(attrs); - } - static font(attrs) { - return new template_Font(attrs); - } - static format(attrs) { - return new Format(attrs); - } - static handler(attrs) { - return new Handler(attrs); - } - static hyphenation(attrs) { - return new Hyphenation(attrs); - } - static image(attrs) { - return new Image(attrs); - } - static imageEdit(attrs) { - return new ImageEdit(attrs); - } - static integer(attrs) { - return new Integer(attrs); - } - static issuers(attrs) { - return new Issuers(attrs); - } - static items(attrs) { - return new Items(attrs); - } - static keep(attrs) { - return new Keep(attrs); - } - static keyUsage(attrs) { - return new KeyUsage(attrs); - } - static line(attrs) { - return new Line(attrs); - } - static linear(attrs) { - return new Linear(attrs); - } - static lockDocument(attrs) { - return new LockDocument(attrs); - } - static manifest(attrs) { - return new Manifest(attrs); - } - static margin(attrs) { - return new Margin(attrs); - } - static mdp(attrs) { - return new Mdp(attrs); - } - static medium(attrs) { - return new Medium(attrs); - } - static message(attrs) { - return new Message(attrs); - } - static numericEdit(attrs) { - return new NumericEdit(attrs); - } - static occur(attrs) { - return new Occur(attrs); - } - static oid(attrs) { - return new Oid(attrs); - } - static oids(attrs) { - return new Oids(attrs); - } - static overflow(attrs) { - return new Overflow(attrs); - } - static pageArea(attrs) { - return new PageArea(attrs); - } - static pageSet(attrs) { - return new PageSet(attrs); - } - static para(attrs) { - return new Para(attrs); - } - static passwordEdit(attrs) { - return new PasswordEdit(attrs); - } - static pattern(attrs) { - return new template_Pattern(attrs); - } - static picture(attrs) { - return new Picture(attrs); - } - static proto(attrs) { - return new Proto(attrs); - } - static radial(attrs) { - return new Radial(attrs); - } - static reason(attrs) { - return new Reason(attrs); - } - static reasons(attrs) { - return new Reasons(attrs); - } - static rectangle(attrs) { - return new Rectangle(attrs); - } - static ref(attrs) { - return new RefElement(attrs); - } - static script(attrs) { - return new Script(attrs); - } - static setProperty(attrs) { - return new SetProperty(attrs); - } - static signData(attrs) { - return new SignData(attrs); - } - static signature(attrs) { - return new Signature(attrs); - } - static signing(attrs) { - return new Signing(attrs); - } - static solid(attrs) { - return new Solid(attrs); - } - static speak(attrs) { - return new Speak(attrs); - } - static stipple(attrs) { - return new Stipple(attrs); - } - static subform(attrs) { - return new Subform(attrs); - } - static subformSet(attrs) { - return new SubformSet(attrs); - } - static subjectDN(attrs) { - return new SubjectDN(attrs); - } - static subjectDNs(attrs) { - return new SubjectDNs(attrs); - } - static submit(attrs) { - return new Submit(attrs); - } - static template(attrs) { - return new Template(attrs); - } - static text(attrs) { - return new Text(attrs); - } - static textEdit(attrs) { - return new TextEdit(attrs); - } - static time(attrs) { - return new Time(attrs); - } - static timeStamp(attrs) { - return new TimeStamp(attrs); - } - static toolTip(attrs) { - return new ToolTip(attrs); - } - static traversal(attrs) { - return new Traversal(attrs); - } - static traverse(attrs) { - return new Traverse(attrs); - } - static ui(attrs) { - return new Ui(attrs); - } - static validate(attrs) { - return new Validate(attrs); - } - static value(attrs) { - return new Value(attrs); - } - static variables(attrs) { - return new Variables(attrs); - } -} - -;// ./src/core/xfa/bind.js - - - - - - -const bind_NS_DATASETS = NamespaceIds.datasets.id; -function createText(content) { - const node = new Text({}); - node[$content] = content; - return node; -} -class Binder { - constructor(root) { - this.root = root; - this.datasets = root.datasets; - this.data = root.datasets?.data || new XmlObject(NamespaceIds.datasets.id, "data"); - this.emptyMerge = this.data[$getChildren]().length === 0; - this.root.form = this.form = root.template[$clone](); - } - _isConsumeData() { - return !this.emptyMerge && this._mergeMode; - } - _isMatchTemplate() { - return !this._isConsumeData(); - } - bind() { - this._bindElement(this.form, this.data); - return this.form; - } - getData() { - return this.data; - } - _bindValue(formNode, data, picture) { - formNode[$data] = data; - if (formNode[$hasSettableValue]()) { - if (data[$isDataValue]()) { - const value = data[$getDataValue](); - formNode[$setValue](createText(value)); - } else if (formNode instanceof Field && formNode.ui?.choiceList?.open === "multiSelect") { - const value = data[$getChildren]().map(child => child[$content].trim()).join("\n"); - formNode[$setValue](createText(value)); - } else if (this._isConsumeData()) { - warn(`XFA - Nodes haven't the same type.`); - } - } else if (!data[$isDataValue]() || this._isMatchTemplate()) { - this._bindElement(formNode, data); - } else { - warn(`XFA - Nodes haven't the same type.`); - } - } - _findDataByNameToConsume(name, isValue, dataNode, global) { - if (!name) { - return null; - } - let generator, match; - for (let i = 0; i < 3; i++) { - generator = dataNode[$getRealChildrenByNameIt](name, false, true); - while (true) { - match = generator.next().value; - if (!match) { - break; - } - if (isValue === match[$isDataValue]()) { - return match; - } - } - if (dataNode[$namespaceId] === NamespaceIds.datasets.id && dataNode[$nodeName] === "data") { - break; - } - dataNode = dataNode[$getParent](); - } - if (!global) { - return null; - } - generator = this.data[$getRealChildrenByNameIt](name, true, false); - match = generator.next().value; - if (match) { - return match; - } - generator = this.data[$getAttributeIt](name, true); - match = generator.next().value; - if (match?.[$isDataValue]()) { - return match; - } - return null; - } - _setProperties(formNode, dataNode) { - if (!formNode.hasOwnProperty("setProperty")) { - return; - } - for (const { - ref, - target, - connection - } of formNode.setProperty.children) { - if (connection) { - continue; - } - if (!ref) { - continue; - } - const nodes = searchNode(this.root, dataNode, ref, false, false); - if (!nodes) { - warn(`XFA - Invalid reference: ${ref}.`); - continue; - } - const [node] = nodes; - if (!node[$isDescendent](this.data)) { - warn(`XFA - Invalid node: must be a data node.`); - continue; - } - const targetNodes = searchNode(this.root, formNode, target, false, false); - if (!targetNodes) { - warn(`XFA - Invalid target: ${target}.`); - continue; - } - const [targetNode] = targetNodes; - if (!targetNode[$isDescendent](formNode)) { - warn(`XFA - Invalid target: must be a property or subproperty.`); - continue; - } - const targetParent = targetNode[$getParent](); - if (targetNode instanceof SetProperty || targetParent instanceof SetProperty) { - warn(`XFA - Invalid target: cannot be a setProperty or one of its properties.`); - continue; - } - if (targetNode instanceof BindItems || targetParent instanceof BindItems) { - warn(`XFA - Invalid target: cannot be a bindItems or one of its properties.`); - continue; - } - const content = node[$text](); - const name = targetNode[$nodeName]; - if (targetNode instanceof XFAAttribute) { - const attrs = Object.create(null); - attrs[name] = content; - const obj = Reflect.construct(Object.getPrototypeOf(targetParent).constructor, [attrs]); - targetParent[name] = obj[name]; - continue; - } - if (!targetNode.hasOwnProperty($content)) { - warn(`XFA - Invalid node to use in setProperty`); - continue; - } - targetNode[$data] = node; - targetNode[$content] = content; - targetNode[$finalize](); - } - } - _bindItems(formNode, dataNode) { - if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { - return; - } - for (const item of formNode.items.children) { - formNode[$removeChild](item); - } - formNode.items.clear(); - const labels = new Items({}); - const values = new Items({}); - formNode[$appendChild](labels); - formNode.items.push(labels); - formNode[$appendChild](values); - formNode.items.push(values); - for (const { - ref, - labelRef, - valueRef, - connection - } of formNode.bindItems.children) { - if (connection) { - continue; - } - if (!ref) { - continue; - } - const nodes = searchNode(this.root, dataNode, ref, false, false); - if (!nodes) { - warn(`XFA - Invalid reference: ${ref}.`); - continue; - } - for (const node of nodes) { - if (!node[$isDescendent](this.datasets)) { - warn(`XFA - Invalid ref (${ref}): must be a datasets child.`); - continue; - } - const labelNodes = searchNode(this.root, node, labelRef, true, false); - if (!labelNodes) { - warn(`XFA - Invalid label: ${labelRef}.`); - continue; - } - const [labelNode] = labelNodes; - if (!labelNode[$isDescendent](this.datasets)) { - warn(`XFA - Invalid label: must be a datasets child.`); - continue; - } - const valueNodes = searchNode(this.root, node, valueRef, true, false); - if (!valueNodes) { - warn(`XFA - Invalid value: ${valueRef}.`); - continue; - } - const [valueNode] = valueNodes; - if (!valueNode[$isDescendent](this.datasets)) { - warn(`XFA - Invalid value: must be a datasets child.`); - continue; - } - const label = createText(labelNode[$text]()); - const value = createText(valueNode[$text]()); - labels[$appendChild](label); - labels.text.push(label); - values[$appendChild](value); - values.text.push(value); - } - } - } - _bindOccurrences(formNode, matches, picture) { - let baseClone; - if (matches.length > 1) { - baseClone = formNode[$clone](); - baseClone[$removeChild](baseClone.occur); - baseClone.occur = null; - } - this._bindValue(formNode, matches[0], picture); - this._setProperties(formNode, matches[0]); - this._bindItems(formNode, matches[0]); - if (matches.length === 1) { - return; - } - const parent = formNode[$getParent](); - const name = formNode[$nodeName]; - const pos = parent[$indexOf](formNode); - for (let i = 1, ii = matches.length; i < ii; i++) { - const match = matches[i]; - const clone = baseClone[$clone](); - parent[name].push(clone); - parent[$insertAt](pos + i, clone); - this._bindValue(clone, match, picture); - this._setProperties(clone, match); - this._bindItems(clone, match); - } - } - _createOccurrences(formNode) { - if (!this.emptyMerge) { - return; - } - const { - occur - } = formNode; - if (!occur || occur.initial <= 1) { - return; - } - const parent = formNode[$getParent](); - const name = formNode[$nodeName]; - if (!(parent[name] instanceof XFAObjectArray)) { - return; - } - let currentNumber; - if (formNode.name) { - currentNumber = parent[name].children.filter(e => e.name === formNode.name).length; - } else { - currentNumber = parent[name].children.length; - } - const pos = parent[$indexOf](formNode) + 1; - const ii = occur.initial - currentNumber; - if (ii) { - const nodeClone = formNode[$clone](); - nodeClone[$removeChild](nodeClone.occur); - nodeClone.occur = null; - parent[name].push(nodeClone); - parent[$insertAt](pos, nodeClone); - for (let i = 1; i < ii; i++) { - const clone = nodeClone[$clone](); - parent[name].push(clone); - parent[$insertAt](pos + i, clone); - } - } - } - _getOccurInfo(formNode) { - const { - name, - occur - } = formNode; - if (!occur || !name) { - return [1, 1]; - } - const max = occur.max === -1 ? Infinity : occur.max; - return [occur.min, max]; - } - _setAndBind(formNode, dataNode) { - this._setProperties(formNode, dataNode); - this._bindItems(formNode, dataNode); - this._bindElement(formNode, dataNode); - } - _bindElement(formNode, dataNode) { - const uselessNodes = []; - this._createOccurrences(formNode); - for (const child of formNode[$getChildren]()) { - if (child[$data]) { - continue; - } - if (this._mergeMode === undefined && child[$nodeName] === "subform") { - this._mergeMode = child.mergeMode === "consumeData"; - const dataChildren = dataNode[$getChildren](); - if (dataChildren.length > 0) { - this._bindOccurrences(child, [dataChildren[0]], null); - } else if (this.emptyMerge) { - const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; - const dataChild = child[$data] = new XmlObject(nsId, child.name || "root"); - dataNode[$appendChild](dataChild); - this._bindElement(child, dataChild); - } - continue; - } - if (!child[$isBindable]()) { - continue; - } - let global = false; - let picture = null; - let ref = null; - let match = null; - if (child.bind) { - switch (child.bind.match) { - case "none": - this._setAndBind(child, dataNode); - continue; - case "global": - global = true; - break; - case "dataRef": - if (!child.bind.ref) { - warn(`XFA - ref is empty in node ${child[$nodeName]}.`); - this._setAndBind(child, dataNode); - continue; - } - ref = child.bind.ref; - break; - default: - break; - } - if (child.bind.picture) { - picture = child.bind.picture[$content]; - } - } - const [min, max] = this._getOccurInfo(child); - if (ref) { - match = searchNode(this.root, dataNode, ref, true, false); - if (match === null) { - match = createDataNode(this.data, dataNode, ref); - if (!match) { - continue; - } - if (this._isConsumeData()) { - match[$consumed] = true; - } - this._setAndBind(child, match); - continue; - } else { - if (this._isConsumeData()) { - match = match.filter(node => !node[$consumed]); - } - if (match.length > max) { - match = match.slice(0, max); - } else if (match.length === 0) { - match = null; - } - if (match && this._isConsumeData()) { - match.forEach(node => { - node[$consumed] = true; - }); - } - } - } else { - if (!child.name) { - this._setAndBind(child, dataNode); - continue; - } - if (this._isConsumeData()) { - const matches = []; - while (matches.length < max) { - const found = this._findDataByNameToConsume(child.name, child[$hasSettableValue](), dataNode, global); - if (!found) { - break; - } - found[$consumed] = true; - matches.push(found); - } - match = matches.length > 0 ? matches : null; - } else { - match = dataNode[$getRealChildrenByNameIt](child.name, false, this.emptyMerge).next().value; - if (!match) { - if (min === 0) { - uselessNodes.push(child); - continue; - } - const nsId = dataNode[$namespaceId] === bind_NS_DATASETS ? -1 : dataNode[$namespaceId]; - match = child[$data] = new XmlObject(nsId, child.name); - if (this.emptyMerge) { - match[$consumed] = true; - } - dataNode[$appendChild](match); - this._setAndBind(child, match); - continue; - } - if (this.emptyMerge) { - match[$consumed] = true; - } - match = [match]; - } - } - if (match) { - this._bindOccurrences(child, match, picture); - } else if (min > 0) { - this._setAndBind(child, dataNode); - } else { - uselessNodes.push(child); - } - } - uselessNodes.forEach(node => node[$getParent]()[$removeChild](node)); - } -} - -;// ./src/core/xfa/data.js - -class DataHandler { - constructor(root, data) { - this.data = data; - this.dataset = root.datasets || null; - } - serialize(storage) { - const stack = [[-1, this.data[$getChildren]()]]; - while (stack.length > 0) { - const last = stack.at(-1); - const [i, children] = last; - if (i + 1 === children.length) { - stack.pop(); - continue; - } - const child = children[++last[0]]; - const storageEntry = storage.get(child[$uid]); - if (storageEntry) { - child[$setValue](storageEntry); - } else { - const attributes = child[$getAttributes](); - for (const value of attributes.values()) { - const entry = storage.get(value[$uid]); - if (entry) { - value[$setValue](entry); - break; - } - } - } - const nodes = child[$getChildren](); - if (nodes.length > 0) { - stack.push([-1, nodes]); - } - } - const buf = [``]; - if (this.dataset) { - for (const child of this.dataset[$getChildren]()) { - if (child[$nodeName] !== "data") { - child[$toString](buf); - } - } - } - this.data[$toString](buf); - buf.push(""); - return buf.join(""); - } -} - -;// ./src/core/xfa/config.js - - - - - -const CONFIG_NS_ID = NamespaceIds.config.id; -class Acrobat extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "acrobat", true); - this.acrobat7 = null; - this.autoSave = null; - this.common = null; - this.validate = null; - this.validateApprovalSignatures = null; - this.submitUrl = new XFAObjectArray(); - } -} -class Acrobat7 extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "acrobat7", true); - this.dynamicRender = null; - } -} -class ADBE_JSConsole extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "ADBE_JSConsole", ["delegate", "Enable", "Disable"]); - } -} -class ADBE_JSDebugger extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "ADBE_JSDebugger", ["delegate", "Enable", "Disable"]); - } -} -class AddSilentPrint extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "addSilentPrint"); - } -} -class AddViewerPreferences extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "addViewerPreferences"); - } -} -class AdjustData extends Option10 { - constructor(attributes) { - super(CONFIG_NS_ID, "adjustData"); - } -} -class AdobeExtensionLevel extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "adobeExtensionLevel", 0, n => n >= 1 && n <= 8); - } -} -class Agent extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "agent", true); - this.name = attributes.name ? attributes.name.trim() : ""; - this.common = new XFAObjectArray(); - } -} -class AlwaysEmbed extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "alwaysEmbed"); - } -} -class Amd extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "amd"); - } -} -class config_Area extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "area"); - this.level = getInteger({ - data: attributes.level, - defaultValue: 0, - validate: n => n >= 1 && n <= 3 - }); - this.name = getStringOption(attributes.name, ["", "barcode", "coreinit", "deviceDriver", "font", "general", "layout", "merge", "script", "signature", "sourceSet", "templateCache"]); - } -} -class Attributes extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "attributes", ["preserve", "delegate", "ignore"]); - } -} -class AutoSave extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "autoSave", ["disabled", "enabled"]); - } -} -class Base extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "base"); - } -} -class BatchOutput extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "batchOutput"); - this.format = getStringOption(attributes.format, ["none", "concat", "zip", "zipCompress"]); - } -} -class BehaviorOverride extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "behaviorOverride"); - } - [$finalize]() { - this[$content] = new Map(this[$content].trim().split(/\s+/).filter(x => x.includes(":")).map(x => x.split(":", 2))); - } -} -class Cache extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "cache", true); - this.templateCache = null; - } -} -class Change extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "change"); - } -} -class Common extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "common", true); - this.data = null; - this.locale = null; - this.localeSet = null; - this.messaging = null; - this.suppressBanner = null; - this.template = null; - this.validationMessaging = null; - this.versionControl = null; - this.log = new XFAObjectArray(); - } -} -class Compress extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "compress"); - this.scope = getStringOption(attributes.scope, ["imageOnly", "document"]); - } -} -class CompressLogicalStructure extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "compressLogicalStructure"); - } -} -class CompressObjectStream extends Option10 { - constructor(attributes) { - super(CONFIG_NS_ID, "compressObjectStream"); - } -} -class Compression extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "compression", true); - this.compressLogicalStructure = null; - this.compressObjectStream = null; - this.level = null; - this.type = null; - } -} -class Config extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "config", true); - this.acrobat = null; - this.present = null; - this.trace = null; - this.agent = new XFAObjectArray(); - } -} -class Conformance extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "conformance", ["A", "B"]); - } -} -class ContentCopy extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "contentCopy"); - } -} -class Copies extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "copies", 1, n => n >= 1); - } -} -class Creator extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "creator"); - } -} -class CurrentPage extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "currentPage", 0, n => n >= 0); - } -} -class Data extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "data", true); - this.adjustData = null; - this.attributes = null; - this.incrementalLoad = null; - this.outputXSL = null; - this.range = null; - this.record = null; - this.startNode = null; - this.uri = null; - this.window = null; - this.xsl = null; - this.excludeNS = new XFAObjectArray(); - this.transform = new XFAObjectArray(); - } -} -class Debug extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "debug", true); - this.uri = null; - } -} -class DefaultTypeface extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "defaultTypeface"); - this.writingScript = getStringOption(attributes.writingScript, ["*", "Arabic", "Cyrillic", "EastEuropeanRoman", "Greek", "Hebrew", "Japanese", "Korean", "Roman", "SimplifiedChinese", "Thai", "TraditionalChinese", "Vietnamese"]); - } -} -class Destination extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "destination", ["pdf", "pcl", "ps", "webClient", "zpl"]); - } -} -class DocumentAssembly extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "documentAssembly"); - } -} -class Driver extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "driver", true); - this.name = attributes.name ? attributes.name.trim() : ""; - this.fontInfo = null; - this.xdc = null; - } -} -class DuplexOption extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "duplexOption", ["simplex", "duplexFlipLongEdge", "duplexFlipShortEdge"]); - } -} -class DynamicRender extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "dynamicRender", ["forbidden", "required"]); - } -} -class Embed extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "embed"); - } -} -class config_Encrypt extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "encrypt"); - } -} -class config_Encryption extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "encryption", true); - this.encrypt = null; - this.encryptionLevel = null; - this.permissions = null; - } -} -class EncryptionLevel extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "encryptionLevel", ["40bit", "128bit"]); - } -} -class Enforce extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "enforce"); - } -} -class Equate extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "equate"); - this.force = getInteger({ - data: attributes.force, - defaultValue: 1, - validate: n => n === 0 - }); - this.from = attributes.from || ""; - this.to = attributes.to || ""; - } -} -class EquateRange extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "equateRange"); - this.from = attributes.from || ""; - this.to = attributes.to || ""; - this._unicodeRange = attributes.unicodeRange || ""; - } - get unicodeRange() { - const ranges = []; - const unicodeRegex = /U\+([0-9a-fA-F]+)/; - const unicodeRange = this._unicodeRange; - for (let range of unicodeRange.split(",").map(x => x.trim()).filter(x => !!x)) { - range = range.split("-", 2).map(x => { - const found = x.match(unicodeRegex); - if (!found) { - return 0; - } - return parseInt(found[1], 16); - }); - if (range.length === 1) { - range.push(range[0]); - } - ranges.push(range); - } - return shadow(this, "unicodeRange", ranges); - } -} -class Exclude extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "exclude"); - } - [$finalize]() { - this[$content] = this[$content].trim().split(/\s+/).filter(x => x && ["calculate", "close", "enter", "exit", "initialize", "ready", "validate"].includes(x)); - } -} -class ExcludeNS extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "excludeNS"); - } -} -class FlipLabel extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "flipLabel", ["usePrinterSetting", "on", "off"]); - } -} -class config_FontInfo extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "fontInfo", true); - this.embed = null; - this.map = null; - this.subsetBelow = null; - this.alwaysEmbed = new XFAObjectArray(); - this.defaultTypeface = new XFAObjectArray(); - this.neverEmbed = new XFAObjectArray(); - } -} -class FormFieldFilling extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "formFieldFilling"); - } -} -class GroupParent extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "groupParent"); - } -} -class IfEmpty extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "ifEmpty", ["dataValue", "dataGroup", "ignore", "remove"]); - } -} -class IncludeXDPContent extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "includeXDPContent"); - } -} -class IncrementalLoad extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "incrementalLoad", ["none", "forwardOnly"]); - } -} -class IncrementalMerge extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "incrementalMerge"); - } -} -class Interactive extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "interactive"); - } -} -class Jog extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "jog", ["usePrinterSetting", "none", "pageSet"]); - } -} -class LabelPrinter extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "labelPrinter", true); - this.name = getStringOption(attributes.name, ["zpl", "dpl", "ipl", "tcpl"]); - this.batchOutput = null; - this.flipLabel = null; - this.fontInfo = null; - this.xdc = null; - } -} -class Layout extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "layout", ["paginate", "panel"]); - } -} -class Level extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "level", 0, n => n > 0); - } -} -class Linearized extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "linearized"); - } -} -class Locale extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "locale"); - } -} -class LocaleSet extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "localeSet"); - } -} -class Log extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "log", true); - this.mode = null; - this.threshold = null; - this.to = null; - this.uri = null; - } -} -class MapElement extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "map", true); - this.equate = new XFAObjectArray(); - this.equateRange = new XFAObjectArray(); - } -} -class MediumInfo extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "mediumInfo", true); - this.map = null; - } -} -class config_Message extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "message", true); - this.msgId = null; - this.severity = null; - } -} -class Messaging extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "messaging", true); - this.message = new XFAObjectArray(); - } -} -class Mode extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "mode", ["append", "overwrite"]); - } -} -class ModifyAnnots extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "modifyAnnots"); - } -} -class MsgId extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "msgId", 1, n => n >= 1); - } -} -class NameAttr extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "nameAttr"); - } -} -class NeverEmbed extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "neverEmbed"); - } -} -class NumberOfCopies extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "numberOfCopies", null, n => n >= 2 && n <= 5); - } -} -class OpenAction extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "openAction", true); - this.destination = null; - } -} -class Output extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "output", true); - this.to = null; - this.type = null; - this.uri = null; - } -} -class OutputBin extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "outputBin"); - } -} -class OutputXSL extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "outputXSL", true); - this.uri = null; - } -} -class Overprint extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "overprint", ["none", "both", "draw", "field"]); - } -} -class Packets extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "packets"); - } - [$finalize]() { - if (this[$content] === "*") { - return; - } - this[$content] = this[$content].trim().split(/\s+/).filter(x => ["config", "datasets", "template", "xfdf", "xslt"].includes(x)); - } -} -class PageOffset extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pageOffset"); - this.x = getInteger({ - data: attributes.x, - defaultValue: "useXDCSetting", - validate: n => true - }); - this.y = getInteger({ - data: attributes.y, - defaultValue: "useXDCSetting", - validate: n => true - }); - } -} -class PageRange extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pageRange"); - } - [$finalize]() { - const numbers = this[$content].trim().split(/\s+/).map(x => parseInt(x, 10)); - const ranges = []; - for (let i = 0, ii = numbers.length; i < ii; i += 2) { - ranges.push(numbers.slice(i, i + 2)); - } - this[$content] = ranges; - } -} -class Pagination extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pagination", ["simplex", "duplexShortEdge", "duplexLongEdge"]); - } -} -class PaginationOverride extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "paginationOverride", ["none", "forceDuplex", "forceDuplexLongEdge", "forceDuplexShortEdge", "forceSimplex"]); - } -} -class Part extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "part", 1, n => false); - } -} -class Pcl extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pcl", true); - this.name = attributes.name || ""; - this.batchOutput = null; - this.fontInfo = null; - this.jog = null; - this.mediumInfo = null; - this.outputBin = null; - this.pageOffset = null; - this.staple = null; - this.xdc = null; - } -} -class Pdf extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pdf", true); - this.name = attributes.name || ""; - this.adobeExtensionLevel = null; - this.batchOutput = null; - this.compression = null; - this.creator = null; - this.encryption = null; - this.fontInfo = null; - this.interactive = null; - this.linearized = null; - this.openAction = null; - this.pdfa = null; - this.producer = null; - this.renderPolicy = null; - this.scriptModel = null; - this.silentPrint = null; - this.submitFormat = null; - this.tagged = null; - this.version = null; - this.viewerPreferences = null; - this.xdc = null; - } -} -class Pdfa extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "pdfa", true); - this.amd = null; - this.conformance = null; - this.includeXDPContent = null; - this.part = null; - } -} -class Permissions extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "permissions", true); - this.accessibleContent = null; - this.change = null; - this.contentCopy = null; - this.documentAssembly = null; - this.formFieldFilling = null; - this.modifyAnnots = null; - this.plaintextMetadata = null; - this.print = null; - this.printHighQuality = null; - } -} -class PickTrayByPDFSize extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "pickTrayByPDFSize"); - } -} -class config_Picture extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "picture"); - } -} -class PlaintextMetadata extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "plaintextMetadata"); - } -} -class Presence extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "presence", ["preserve", "dissolve", "dissolveStructure", "ignore", "remove"]); - } -} -class Present extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "present", true); - this.behaviorOverride = null; - this.cache = null; - this.common = null; - this.copies = null; - this.destination = null; - this.incrementalMerge = null; - this.layout = null; - this.output = null; - this.overprint = null; - this.pagination = null; - this.paginationOverride = null; - this.script = null; - this.validate = null; - this.xdp = null; - this.driver = new XFAObjectArray(); - this.labelPrinter = new XFAObjectArray(); - this.pcl = new XFAObjectArray(); - this.pdf = new XFAObjectArray(); - this.ps = new XFAObjectArray(); - this.submitUrl = new XFAObjectArray(); - this.webClient = new XFAObjectArray(); - this.zpl = new XFAObjectArray(); - } -} -class Print extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "print"); - } -} -class PrintHighQuality extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "printHighQuality"); - } -} -class PrintScaling extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "printScaling", ["appdefault", "noScaling"]); - } -} -class PrinterName extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "printerName"); - } -} -class Producer extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "producer"); - } -} -class Ps extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "ps", true); - this.name = attributes.name || ""; - this.batchOutput = null; - this.fontInfo = null; - this.jog = null; - this.mediumInfo = null; - this.outputBin = null; - this.staple = null; - this.xdc = null; - } -} -class Range extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "range"); - } - [$finalize]() { - this[$content] = this[$content].split(",", 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { - if (range.length === 1) { - range.push(range[0]); - } - return range; - }); - } -} -class Record extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "record"); - } - [$finalize]() { - this[$content] = this[$content].trim(); - const n = parseInt(this[$content], 10); - if (!isNaN(n) && n >= 0) { - this[$content] = n; - } - } -} -class Relevant extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "relevant"); - } - [$finalize]() { - this[$content] = this[$content].trim().split(/\s+/); - } -} -class Rename extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "rename"); - } - [$finalize]() { - this[$content] = this[$content].trim(); - if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) { - warn("XFA - Rename: invalid XFA name"); - } - } -} -class RenderPolicy extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "renderPolicy", ["server", "client"]); - } -} -class RunScripts extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "runScripts", ["both", "client", "none", "server"]); - } -} -class config_Script extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "script", true); - this.currentPage = null; - this.exclude = null; - this.runScripts = null; - } -} -class ScriptModel extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "scriptModel", ["XFA", "none"]); - } -} -class Severity extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "severity", ["ignore", "error", "information", "trace", "warning"]); - } -} -class SilentPrint extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "silentPrint", true); - this.addSilentPrint = null; - this.printerName = null; - } -} -class Staple extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "staple"); - this.mode = getStringOption(attributes.mode, ["usePrinterSetting", "on", "off"]); - } -} -class StartNode extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "startNode"); - } -} -class StartPage extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "startPage", 0, n => true); - } -} -class SubmitFormat extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "submitFormat", ["html", "delegate", "fdf", "xml", "pdf"]); - } -} -class SubmitUrl extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "submitUrl"); - } -} -class SubsetBelow extends IntegerObject { - constructor(attributes) { - super(CONFIG_NS_ID, "subsetBelow", 100, n => n >= 0 && n <= 100); - } -} -class SuppressBanner extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "suppressBanner"); - } -} -class Tagged extends Option01 { - constructor(attributes) { - super(CONFIG_NS_ID, "tagged"); - } -} -class config_Template extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "template", true); - this.base = null; - this.relevant = null; - this.startPage = null; - this.uri = null; - this.xsl = null; - } -} -class Threshold extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "threshold", ["trace", "error", "information", "warning"]); - } -} -class To extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "to", ["null", "memory", "stderr", "stdout", "system", "uri"]); - } -} -class TemplateCache extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "templateCache"); - this.maxEntries = getInteger({ - data: attributes.maxEntries, - defaultValue: 5, - validate: n => n >= 0 - }); - } -} -class Trace extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "trace", true); - this.area = new XFAObjectArray(); - } -} -class Transform extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "transform", true); - this.groupParent = null; - this.ifEmpty = null; - this.nameAttr = null; - this.picture = null; - this.presence = null; - this.rename = null; - this.whitespace = null; - } -} -class Type extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "type", ["none", "ascii85", "asciiHex", "ccittfax", "flate", "lzw", "runLength", "native", "xdp", "mergedXDP"]); - } -} -class Uri extends StringObject { - constructor(attributes) { - super(CONFIG_NS_ID, "uri"); - } -} -class config_Validate extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "validate", ["preSubmit", "prePrint", "preExecute", "preSave"]); - } -} -class ValidateApprovalSignatures extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "validateApprovalSignatures"); - } - [$finalize]() { - this[$content] = this[$content].trim().split(/\s+/).filter(x => ["docReady", "postSign"].includes(x)); - } -} -class ValidationMessaging extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "validationMessaging", ["allMessagesIndividually", "allMessagesTogether", "firstMessageOnly", "noMessages"]); - } -} -class Version extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "version", ["1.7", "1.6", "1.5", "1.4", "1.3", "1.2"]); - } -} -class VersionControl extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "VersionControl"); - this.outputBelow = getStringOption(attributes.outputBelow, ["warn", "error", "update"]); - this.sourceAbove = getStringOption(attributes.sourceAbove, ["warn", "error"]); - this.sourceBelow = getStringOption(attributes.sourceBelow, ["update", "maintain"]); - } -} -class ViewerPreferences extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "viewerPreferences", true); - this.ADBE_JSConsole = null; - this.ADBE_JSDebugger = null; - this.addViewerPreferences = null; - this.duplexOption = null; - this.enforce = null; - this.numberOfCopies = null; - this.pageRange = null; - this.pickTrayByPDFSize = null; - this.printScaling = null; - } -} -class WebClient extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "webClient", true); - this.name = attributes.name ? attributes.name.trim() : ""; - this.fontInfo = null; - this.xdc = null; - } -} -class Whitespace extends OptionObject { - constructor(attributes) { - super(CONFIG_NS_ID, "whitespace", ["preserve", "ltrim", "normalize", "rtrim", "trim"]); - } -} -class Window extends ContentObject { - constructor(attributes) { - super(CONFIG_NS_ID, "window"); - } - [$finalize]() { - const pair = this[$content].split(",", 2).map(x => parseInt(x.trim(), 10)); - if (pair.some(x => isNaN(x))) { - this[$content] = [0, 0]; - return; - } - if (pair.length === 1) { - pair.push(pair[0]); - } - this[$content] = pair; - } -} -class Xdc extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "xdc", true); - this.uri = new XFAObjectArray(); - this.xsl = new XFAObjectArray(); - } -} -class Xdp extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "xdp", true); - this.packets = null; - } -} -class Xsl extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "xsl", true); - this.debug = null; - this.uri = null; - } -} -class Zpl extends XFAObject { - constructor(attributes) { - super(CONFIG_NS_ID, "zpl", true); - this.name = attributes.name ? attributes.name.trim() : ""; - this.batchOutput = null; - this.flipLabel = null; - this.fontInfo = null; - this.xdc = null; - } -} -class ConfigNamespace { - static [$buildXFAObject](name, attributes) { - if (ConfigNamespace.hasOwnProperty(name)) { - return ConfigNamespace[name](attributes); - } - return undefined; - } - static acrobat(attrs) { - return new Acrobat(attrs); - } - static acrobat7(attrs) { - return new Acrobat7(attrs); - } - static ADBE_JSConsole(attrs) { - return new ADBE_JSConsole(attrs); - } - static ADBE_JSDebugger(attrs) { - return new ADBE_JSDebugger(attrs); - } - static addSilentPrint(attrs) { - return new AddSilentPrint(attrs); - } - static addViewerPreferences(attrs) { - return new AddViewerPreferences(attrs); - } - static adjustData(attrs) { - return new AdjustData(attrs); - } - static adobeExtensionLevel(attrs) { - return new AdobeExtensionLevel(attrs); - } - static agent(attrs) { - return new Agent(attrs); - } - static alwaysEmbed(attrs) { - return new AlwaysEmbed(attrs); - } - static amd(attrs) { - return new Amd(attrs); - } - static area(attrs) { - return new config_Area(attrs); - } - static attributes(attrs) { - return new Attributes(attrs); - } - static autoSave(attrs) { - return new AutoSave(attrs); - } - static base(attrs) { - return new Base(attrs); - } - static batchOutput(attrs) { - return new BatchOutput(attrs); - } - static behaviorOverride(attrs) { - return new BehaviorOverride(attrs); - } - static cache(attrs) { - return new Cache(attrs); - } - static change(attrs) { - return new Change(attrs); - } - static common(attrs) { - return new Common(attrs); - } - static compress(attrs) { - return new Compress(attrs); - } - static compressLogicalStructure(attrs) { - return new CompressLogicalStructure(attrs); - } - static compressObjectStream(attrs) { - return new CompressObjectStream(attrs); - } - static compression(attrs) { - return new Compression(attrs); - } - static config(attrs) { - return new Config(attrs); - } - static conformance(attrs) { - return new Conformance(attrs); - } - static contentCopy(attrs) { - return new ContentCopy(attrs); - } - static copies(attrs) { - return new Copies(attrs); - } - static creator(attrs) { - return new Creator(attrs); - } - static currentPage(attrs) { - return new CurrentPage(attrs); - } - static data(attrs) { - return new Data(attrs); - } - static debug(attrs) { - return new Debug(attrs); - } - static defaultTypeface(attrs) { - return new DefaultTypeface(attrs); - } - static destination(attrs) { - return new Destination(attrs); - } - static documentAssembly(attrs) { - return new DocumentAssembly(attrs); - } - static driver(attrs) { - return new Driver(attrs); - } - static duplexOption(attrs) { - return new DuplexOption(attrs); - } - static dynamicRender(attrs) { - return new DynamicRender(attrs); - } - static embed(attrs) { - return new Embed(attrs); - } - static encrypt(attrs) { - return new config_Encrypt(attrs); - } - static encryption(attrs) { - return new config_Encryption(attrs); - } - static encryptionLevel(attrs) { - return new EncryptionLevel(attrs); - } - static enforce(attrs) { - return new Enforce(attrs); - } - static equate(attrs) { - return new Equate(attrs); - } - static equateRange(attrs) { - return new EquateRange(attrs); - } - static exclude(attrs) { - return new Exclude(attrs); - } - static excludeNS(attrs) { - return new ExcludeNS(attrs); - } - static flipLabel(attrs) { - return new FlipLabel(attrs); - } - static fontInfo(attrs) { - return new config_FontInfo(attrs); - } - static formFieldFilling(attrs) { - return new FormFieldFilling(attrs); - } - static groupParent(attrs) { - return new GroupParent(attrs); - } - static ifEmpty(attrs) { - return new IfEmpty(attrs); - } - static includeXDPContent(attrs) { - return new IncludeXDPContent(attrs); - } - static incrementalLoad(attrs) { - return new IncrementalLoad(attrs); - } - static incrementalMerge(attrs) { - return new IncrementalMerge(attrs); - } - static interactive(attrs) { - return new Interactive(attrs); - } - static jog(attrs) { - return new Jog(attrs); - } - static labelPrinter(attrs) { - return new LabelPrinter(attrs); - } - static layout(attrs) { - return new Layout(attrs); - } - static level(attrs) { - return new Level(attrs); - } - static linearized(attrs) { - return new Linearized(attrs); - } - static locale(attrs) { - return new Locale(attrs); - } - static localeSet(attrs) { - return new LocaleSet(attrs); - } - static log(attrs) { - return new Log(attrs); - } - static map(attrs) { - return new MapElement(attrs); - } - static mediumInfo(attrs) { - return new MediumInfo(attrs); - } - static message(attrs) { - return new config_Message(attrs); - } - static messaging(attrs) { - return new Messaging(attrs); - } - static mode(attrs) { - return new Mode(attrs); - } - static modifyAnnots(attrs) { - return new ModifyAnnots(attrs); - } - static msgId(attrs) { - return new MsgId(attrs); - } - static nameAttr(attrs) { - return new NameAttr(attrs); - } - static neverEmbed(attrs) { - return new NeverEmbed(attrs); - } - static numberOfCopies(attrs) { - return new NumberOfCopies(attrs); - } - static openAction(attrs) { - return new OpenAction(attrs); - } - static output(attrs) { - return new Output(attrs); - } - static outputBin(attrs) { - return new OutputBin(attrs); - } - static outputXSL(attrs) { - return new OutputXSL(attrs); - } - static overprint(attrs) { - return new Overprint(attrs); - } - static packets(attrs) { - return new Packets(attrs); - } - static pageOffset(attrs) { - return new PageOffset(attrs); - } - static pageRange(attrs) { - return new PageRange(attrs); - } - static pagination(attrs) { - return new Pagination(attrs); - } - static paginationOverride(attrs) { - return new PaginationOverride(attrs); - } - static part(attrs) { - return new Part(attrs); - } - static pcl(attrs) { - return new Pcl(attrs); - } - static pdf(attrs) { - return new Pdf(attrs); - } - static pdfa(attrs) { - return new Pdfa(attrs); - } - static permissions(attrs) { - return new Permissions(attrs); - } - static pickTrayByPDFSize(attrs) { - return new PickTrayByPDFSize(attrs); - } - static picture(attrs) { - return new config_Picture(attrs); - } - static plaintextMetadata(attrs) { - return new PlaintextMetadata(attrs); - } - static presence(attrs) { - return new Presence(attrs); - } - static present(attrs) { - return new Present(attrs); - } - static print(attrs) { - return new Print(attrs); - } - static printHighQuality(attrs) { - return new PrintHighQuality(attrs); - } - static printScaling(attrs) { - return new PrintScaling(attrs); - } - static printerName(attrs) { - return new PrinterName(attrs); - } - static producer(attrs) { - return new Producer(attrs); - } - static ps(attrs) { - return new Ps(attrs); - } - static range(attrs) { - return new Range(attrs); - } - static record(attrs) { - return new Record(attrs); - } - static relevant(attrs) { - return new Relevant(attrs); - } - static rename(attrs) { - return new Rename(attrs); - } - static renderPolicy(attrs) { - return new RenderPolicy(attrs); - } - static runScripts(attrs) { - return new RunScripts(attrs); - } - static script(attrs) { - return new config_Script(attrs); - } - static scriptModel(attrs) { - return new ScriptModel(attrs); - } - static severity(attrs) { - return new Severity(attrs); - } - static silentPrint(attrs) { - return new SilentPrint(attrs); - } - static staple(attrs) { - return new Staple(attrs); - } - static startNode(attrs) { - return new StartNode(attrs); - } - static startPage(attrs) { - return new StartPage(attrs); - } - static submitFormat(attrs) { - return new SubmitFormat(attrs); - } - static submitUrl(attrs) { - return new SubmitUrl(attrs); - } - static subsetBelow(attrs) { - return new SubsetBelow(attrs); - } - static suppressBanner(attrs) { - return new SuppressBanner(attrs); - } - static tagged(attrs) { - return new Tagged(attrs); - } - static template(attrs) { - return new config_Template(attrs); - } - static templateCache(attrs) { - return new TemplateCache(attrs); - } - static threshold(attrs) { - return new Threshold(attrs); - } - static to(attrs) { - return new To(attrs); - } - static trace(attrs) { - return new Trace(attrs); - } - static transform(attrs) { - return new Transform(attrs); - } - static type(attrs) { - return new Type(attrs); - } - static uri(attrs) { - return new Uri(attrs); - } - static validate(attrs) { - return new config_Validate(attrs); - } - static validateApprovalSignatures(attrs) { - return new ValidateApprovalSignatures(attrs); - } - static validationMessaging(attrs) { - return new ValidationMessaging(attrs); - } - static version(attrs) { - return new Version(attrs); - } - static versionControl(attrs) { - return new VersionControl(attrs); - } - static viewerPreferences(attrs) { - return new ViewerPreferences(attrs); - } - static webClient(attrs) { - return new WebClient(attrs); - } - static whitespace(attrs) { - return new Whitespace(attrs); - } - static window(attrs) { - return new Window(attrs); - } - static xdc(attrs) { - return new Xdc(attrs); - } - static xdp(attrs) { - return new Xdp(attrs); - } - static xsl(attrs) { - return new Xsl(attrs); - } - static zpl(attrs) { - return new Zpl(attrs); - } -} - -;// ./src/core/xfa/connection_set.js - - -const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; -class ConnectionSet extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "connectionSet", true); - this.wsdlConnection = new XFAObjectArray(); - this.xmlConnection = new XFAObjectArray(); - this.xsdConnection = new XFAObjectArray(); - } -} -class EffectiveInputPolicy extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "effectiveInputPolicy"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class EffectiveOutputPolicy extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "effectiveOutputPolicy"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class Operation extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "operation"); - this.id = attributes.id || ""; - this.input = attributes.input || ""; - this.name = attributes.name || ""; - this.output = attributes.output || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class RootElement extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "rootElement"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class SoapAction extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "soapAction"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class SoapAddress extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "soapAddress"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class connection_set_Uri extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "uri"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class WsdlAddress extends StringObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "wsdlAddress"); - this.id = attributes.id || ""; - this.name = attributes.name || ""; - this.use = attributes.use || ""; - this.usehref = attributes.usehref || ""; - } -} -class WsdlConnection extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "wsdlConnection", true); - this.dataDescription = attributes.dataDescription || ""; - this.name = attributes.name || ""; - this.effectiveInputPolicy = null; - this.effectiveOutputPolicy = null; - this.operation = null; - this.soapAction = null; - this.soapAddress = null; - this.wsdlAddress = null; - } -} -class XmlConnection extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "xmlConnection", true); - this.dataDescription = attributes.dataDescription || ""; - this.name = attributes.name || ""; - this.uri = null; - } -} -class XsdConnection extends XFAObject { - constructor(attributes) { - super(CONNECTION_SET_NS_ID, "xsdConnection", true); - this.dataDescription = attributes.dataDescription || ""; - this.name = attributes.name || ""; - this.rootElement = null; - this.uri = null; - } -} -class ConnectionSetNamespace { - static [$buildXFAObject](name, attributes) { - if (ConnectionSetNamespace.hasOwnProperty(name)) { - return ConnectionSetNamespace[name](attributes); - } - return undefined; - } - static connectionSet(attrs) { - return new ConnectionSet(attrs); - } - static effectiveInputPolicy(attrs) { - return new EffectiveInputPolicy(attrs); - } - static effectiveOutputPolicy(attrs) { - return new EffectiveOutputPolicy(attrs); - } - static operation(attrs) { - return new Operation(attrs); - } - static rootElement(attrs) { - return new RootElement(attrs); - } - static soapAction(attrs) { - return new SoapAction(attrs); - } - static soapAddress(attrs) { - return new SoapAddress(attrs); - } - static uri(attrs) { - return new connection_set_Uri(attrs); - } - static wsdlAddress(attrs) { - return new WsdlAddress(attrs); - } - static wsdlConnection(attrs) { - return new WsdlConnection(attrs); - } - static xmlConnection(attrs) { - return new XmlConnection(attrs); - } - static xsdConnection(attrs) { - return new XsdConnection(attrs); - } -} - -;// ./src/core/xfa/datasets.js - - - -const DATASETS_NS_ID = NamespaceIds.datasets.id; -class datasets_Data extends XmlObject { - constructor(attributes) { - super(DATASETS_NS_ID, "data", attributes); - } - [$isNsAgnostic]() { - return true; - } -} -class Datasets extends XFAObject { - constructor(attributes) { - super(DATASETS_NS_ID, "datasets", true); - this.data = null; - this.Signature = null; - } - [$onChild](child) { - const name = child[$nodeName]; - if (name === "data" && child[$namespaceId] === DATASETS_NS_ID || name === "Signature" && child[$namespaceId] === NamespaceIds.signature.id) { - this[name] = child; - } - this[$appendChild](child); - } -} -class DatasetsNamespace { - static [$buildXFAObject](name, attributes) { - if (DatasetsNamespace.hasOwnProperty(name)) { - return DatasetsNamespace[name](attributes); - } - return undefined; - } - static datasets(attributes) { - return new Datasets(attributes); - } - static data(attributes) { - return new datasets_Data(attributes); - } -} - -;// ./src/core/xfa/locale_set.js - - - -const LOCALE_SET_NS_ID = NamespaceIds.localeSet.id; -class CalendarSymbols extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "calendarSymbols", true); - this.name = "gregorian"; - this.dayNames = new XFAObjectArray(2); - this.eraNames = null; - this.meridiemNames = null; - this.monthNames = new XFAObjectArray(2); - } -} -class CurrencySymbol extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "currencySymbol"); - this.name = getStringOption(attributes.name, ["symbol", "isoname", "decimal"]); - } -} -class CurrencySymbols extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "currencySymbols", true); - this.currencySymbol = new XFAObjectArray(3); - } -} -class DatePattern extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "datePattern"); - this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); - } -} -class DatePatterns extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "datePatterns", true); - this.datePattern = new XFAObjectArray(4); - } -} -class DateTimeSymbols extends ContentObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "dateTimeSymbols"); - } -} -class Day extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "day"); - } -} -class DayNames extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "dayNames", true); - this.abbr = getInteger({ - data: attributes.abbr, - defaultValue: 0, - validate: x => x === 1 - }); - this.day = new XFAObjectArray(7); - } -} -class Era extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "era"); - } -} -class EraNames extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "eraNames", true); - this.era = new XFAObjectArray(2); - } -} -class locale_set_Locale extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "locale", true); - this.desc = attributes.desc || ""; - this.name = "isoname"; - this.calendarSymbols = null; - this.currencySymbols = null; - this.datePatterns = null; - this.dateTimeSymbols = null; - this.numberPatterns = null; - this.numberSymbols = null; - this.timePatterns = null; - this.typeFaces = null; - } -} -class locale_set_LocaleSet extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "localeSet", true); - this.locale = new XFAObjectArray(); - } -} -class Meridiem extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "meridiem"); - } -} -class MeridiemNames extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "meridiemNames", true); - this.meridiem = new XFAObjectArray(2); - } -} -class Month extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "month"); - } -} -class MonthNames extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "monthNames", true); - this.abbr = getInteger({ - data: attributes.abbr, - defaultValue: 0, - validate: x => x === 1 - }); - this.month = new XFAObjectArray(12); - } -} -class NumberPattern extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "numberPattern"); - this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); - } -} -class NumberPatterns extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "numberPatterns", true); - this.numberPattern = new XFAObjectArray(4); - } -} -class NumberSymbol extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "numberSymbol"); - this.name = getStringOption(attributes.name, ["decimal", "grouping", "percent", "minus", "zero"]); - } -} -class NumberSymbols extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "numberSymbols", true); - this.numberSymbol = new XFAObjectArray(5); - } -} -class TimePattern extends StringObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "timePattern"); - this.name = getStringOption(attributes.name, ["full", "long", "med", "short"]); - } -} -class TimePatterns extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "timePatterns", true); - this.timePattern = new XFAObjectArray(4); - } -} -class TypeFace extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "typeFace", true); - this.name = attributes.name | ""; - } -} -class TypeFaces extends XFAObject { - constructor(attributes) { - super(LOCALE_SET_NS_ID, "typeFaces", true); - this.typeFace = new XFAObjectArray(); - } -} -class LocaleSetNamespace { - static [$buildXFAObject](name, attributes) { - if (LocaleSetNamespace.hasOwnProperty(name)) { - return LocaleSetNamespace[name](attributes); - } - return undefined; - } - static calendarSymbols(attrs) { - return new CalendarSymbols(attrs); - } - static currencySymbol(attrs) { - return new CurrencySymbol(attrs); - } - static currencySymbols(attrs) { - return new CurrencySymbols(attrs); - } - static datePattern(attrs) { - return new DatePattern(attrs); - } - static datePatterns(attrs) { - return new DatePatterns(attrs); - } - static dateTimeSymbols(attrs) { - return new DateTimeSymbols(attrs); - } - static day(attrs) { - return new Day(attrs); - } - static dayNames(attrs) { - return new DayNames(attrs); - } - static era(attrs) { - return new Era(attrs); - } - static eraNames(attrs) { - return new EraNames(attrs); - } - static locale(attrs) { - return new locale_set_Locale(attrs); - } - static localeSet(attrs) { - return new locale_set_LocaleSet(attrs); - } - static meridiem(attrs) { - return new Meridiem(attrs); - } - static meridiemNames(attrs) { - return new MeridiemNames(attrs); - } - static month(attrs) { - return new Month(attrs); - } - static monthNames(attrs) { - return new MonthNames(attrs); - } - static numberPattern(attrs) { - return new NumberPattern(attrs); - } - static numberPatterns(attrs) { - return new NumberPatterns(attrs); - } - static numberSymbol(attrs) { - return new NumberSymbol(attrs); - } - static numberSymbols(attrs) { - return new NumberSymbols(attrs); - } - static timePattern(attrs) { - return new TimePattern(attrs); - } - static timePatterns(attrs) { - return new TimePatterns(attrs); - } - static typeFace(attrs) { - return new TypeFace(attrs); - } - static typeFaces(attrs) { - return new TypeFaces(attrs); - } -} - -;// ./src/core/xfa/signature.js - - -const SIGNATURE_NS_ID = NamespaceIds.signature.id; -class signature_Signature extends XFAObject { - constructor(attributes) { - super(SIGNATURE_NS_ID, "signature", true); - } -} -class SignatureNamespace { - static [$buildXFAObject](name, attributes) { - if (SignatureNamespace.hasOwnProperty(name)) { - return SignatureNamespace[name](attributes); - } - return undefined; - } - static signature(attributes) { - return new signature_Signature(attributes); - } -} - -;// ./src/core/xfa/stylesheet.js - - -const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; -class Stylesheet extends XFAObject { - constructor(attributes) { - super(STYLESHEET_NS_ID, "stylesheet", true); - } -} -class StylesheetNamespace { - static [$buildXFAObject](name, attributes) { - if (StylesheetNamespace.hasOwnProperty(name)) { - return StylesheetNamespace[name](attributes); - } - return undefined; - } - static stylesheet(attributes) { - return new Stylesheet(attributes); - } -} - -;// ./src/core/xfa/xdp.js - - - -const XDP_NS_ID = NamespaceIds.xdp.id; -class xdp_Xdp extends XFAObject { - constructor(attributes) { - super(XDP_NS_ID, "xdp", true); - this.uuid = attributes.uuid || ""; - this.timeStamp = attributes.timeStamp || ""; - this.config = null; - this.connectionSet = null; - this.datasets = null; - this.localeSet = null; - this.stylesheet = new XFAObjectArray(); - this.template = null; - } - [$onChildCheck](child) { - const ns = NamespaceIds[child[$nodeName]]; - return ns && child[$namespaceId] === ns.id; - } -} -class XdpNamespace { - static [$buildXFAObject](name, attributes) { - if (XdpNamespace.hasOwnProperty(name)) { - return XdpNamespace[name](attributes); - } - return undefined; - } - static xdp(attributes) { - return new xdp_Xdp(attributes); - } -} - -;// ./src/core/xfa/xhtml.js - - - - - -const XHTML_NS_ID = NamespaceIds.xhtml.id; -const $richText = Symbol(); -const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); -const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, parseInt(value) / 100).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, parseInt(value) / 100).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { - value = original.fontSize = Math.abs(getMeasurement(value)); - return measureToString(0.99 * value); -}], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]); -const spacesRegExp = /\s+/g; -const crlfRegExp = /[\r\n]+/g; -const crlfForRichTextRegExp = /\r\n?/g; -function mapStyle(styleStr, node, richText) { - const style = Object.create(null); - if (!styleStr) { - return style; - } - const original = Object.create(null); - for (const [key, value] of styleStr.split(";").map(s => s.split(":", 2))) { - const mapping = StyleMapping.get(key); - if (mapping === "") { - continue; - } - let newValue = value; - if (mapping) { - newValue = typeof mapping === "string" ? mapping : mapping(value, original); - } - if (key.endsWith("scale")) { - style.transform = style.transform ? `${style[key]} ${newValue}` : newValue; - } else { - style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; - } - } - if (style.fontFamily) { - setFontFamily({ - typeface: style.fontFamily, - weight: style.fontWeight || "normal", - posture: style.fontStyle || "normal", - size: original.fontSize || 0 - }, node, node[$globalData].fontFinder, style); - } - if (richText && style.verticalAlign && style.verticalAlign !== "0px" && style.fontSize) { - const SUB_SUPER_SCRIPT_FACTOR = 0.583; - const VERTICAL_FACTOR = 0.333; - const fontSize = getMeasurement(style.fontSize); - style.fontSize = measureToString(fontSize * SUB_SUPER_SCRIPT_FACTOR); - style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); - } - if (richText && style.fontSize) { - style.fontSize = `calc(${style.fontSize} * var(--total-scale-factor))`; - } - fixTextIndent(style); - return style; -} -function checkStyle(node) { - if (!node.style) { - return ""; - } - return node.style.split(";").filter(s => !!s.trim()).map(s => s.split(":", 2).map(t => t.trim())).filter(([key, value]) => { - if (key === "font-family") { - node[$globalData].usedTypefaces.add(value); - } - return VALID_STYLES.has(key); - }).map(kv => kv.join(":")).join(";"); -} -const NoWhites = new Set(["body", "html"]); -class XhtmlObject extends XmlObject { - constructor(attributes, name) { - super(XHTML_NS_ID, name); - this[$richText] = false; - this.style = attributes.style || ""; - } - [$clean](builder) { - super[$clean](builder); - this.style = checkStyle(this); - } - [$acceptWhitespace]() { - return !NoWhites.has(this[$nodeName]); - } - [$onText](str, richText = false) { - if (!richText) { - str = str.replaceAll(crlfRegExp, ""); - if (!this.style.includes("xfa-spacerun:yes")) { - str = str.replaceAll(spacesRegExp, " "); - } - } else { - this[$richText] = true; - } - if (str) { - this[$content] += str; - } - } - [$pushGlyphs](measure, mustPop = true) { - const xfaFont = Object.create(null); - const margin = { - top: NaN, - bottom: NaN, - left: NaN, - right: NaN - }; - let lineHeight = null; - for (const [key, value] of this.style.split(";").map(s => s.split(":", 2))) { - switch (key) { - case "font-family": - xfaFont.typeface = stripQuotes(value); - break; - case "font-size": - xfaFont.size = getMeasurement(value); - break; - case "font-weight": - xfaFont.weight = value; - break; - case "font-style": - xfaFont.posture = value; - break; - case "letter-spacing": - xfaFont.letterSpacing = getMeasurement(value); - break; - case "margin": - const values = value.split(/ \t/).map(x => getMeasurement(x)); - switch (values.length) { - case 1: - margin.top = margin.bottom = margin.left = margin.right = values[0]; - break; - case 2: - margin.top = margin.bottom = values[0]; - margin.left = margin.right = values[1]; - break; - case 3: - margin.top = values[0]; - margin.bottom = values[2]; - margin.left = margin.right = values[1]; - break; - case 4: - margin.top = values[0]; - margin.left = values[1]; - margin.bottom = values[2]; - margin.right = values[3]; - break; - } - break; - case "margin-top": - margin.top = getMeasurement(value); - break; - case "margin-bottom": - margin.bottom = getMeasurement(value); - break; - case "margin-left": - margin.left = getMeasurement(value); - break; - case "margin-right": - margin.right = getMeasurement(value); - break; - case "line-height": - lineHeight = getMeasurement(value); - break; - } - } - measure.pushData(xfaFont, margin, lineHeight); - if (this[$content]) { - measure.addString(this[$content]); - } else { - for (const child of this[$getChildren]()) { - if (child[$nodeName] === "#text") { - measure.addString(child[$content]); - continue; - } - child[$pushGlyphs](measure); - } - } - if (mustPop) { - measure.popFont(); - } - } - [$toHTML](availableSpace) { - const children = []; - this[$extra] = { - children - }; - this[$childrenToHTML]({}); - if (children.length === 0 && !this[$content]) { - return HTMLResult.EMPTY; - } - let value; - if (this[$richText]) { - value = this[$content] ? this[$content].replaceAll(crlfForRichTextRegExp, "\n") : undefined; - } else { - value = this[$content] || undefined; - } - return HTMLResult.success({ - name: this[$nodeName], - attributes: { - href: this.href, - style: mapStyle(this.style, this, this[$richText]) - }, - children, - value - }); - } -} -class A extends XhtmlObject { - constructor(attributes) { - super(attributes, "a"); - this.href = fixURL(attributes.href) || ""; - } -} -class B extends XhtmlObject { - constructor(attributes) { - super(attributes, "b"); - } - [$pushGlyphs](measure) { - measure.pushFont({ - weight: "bold" - }); - super[$pushGlyphs](measure); - measure.popFont(); - } -} -class Body extends XhtmlObject { - constructor(attributes) { - super(attributes, "body"); - } - [$toHTML](availableSpace) { - const res = super[$toHTML](availableSpace); - const { - html - } = res; - if (!html) { - return HTMLResult.EMPTY; - } - html.name = "div"; - html.attributes.class = ["xfaRich"]; - return res; - } -} -class Br extends XhtmlObject { - constructor(attributes) { - super(attributes, "br"); - } - [$text]() { - return "\n"; - } - [$pushGlyphs](measure) { - measure.addString("\n"); - } - [$toHTML](availableSpace) { - return HTMLResult.success({ - name: "br" - }); - } -} -class Html extends XhtmlObject { - constructor(attributes) { - super(attributes, "html"); - } - [$toHTML](availableSpace) { - const children = []; - this[$extra] = { - children - }; - this[$childrenToHTML]({}); - if (children.length === 0) { - return HTMLResult.success({ - name: "div", - attributes: { - class: ["xfaRich"], - style: {} - }, - value: this[$content] || "" - }); - } - if (children.length === 1) { - const child = children[0]; - if (child.attributes?.class.includes("xfaRich")) { - return HTMLResult.success(child); - } - } - return HTMLResult.success({ - name: "div", - attributes: { - class: ["xfaRich"], - style: {} - }, - children - }); - } -} -class I extends XhtmlObject { - constructor(attributes) { - super(attributes, "i"); - } - [$pushGlyphs](measure) { - measure.pushFont({ - posture: "italic" - }); - super[$pushGlyphs](measure); - measure.popFont(); - } -} -class Li extends XhtmlObject { - constructor(attributes) { - super(attributes, "li"); - } -} -class Ol extends XhtmlObject { - constructor(attributes) { - super(attributes, "ol"); - } -} -class P extends XhtmlObject { - constructor(attributes) { - super(attributes, "p"); - } - [$pushGlyphs](measure) { - super[$pushGlyphs](measure, false); - measure.addString("\n"); - measure.addPara(); - measure.popFont(); - } - [$text]() { - const siblings = this[$getParent]()[$getChildren](); - if (siblings.at(-1) === this) { - return super[$text](); - } - return super[$text]() + "\n"; - } -} -class Span extends XhtmlObject { - constructor(attributes) { - super(attributes, "span"); - } -} -class Sub extends XhtmlObject { - constructor(attributes) { - super(attributes, "sub"); - } -} -class Sup extends XhtmlObject { - constructor(attributes) { - super(attributes, "sup"); - } -} -class Ul extends XhtmlObject { - constructor(attributes) { - super(attributes, "ul"); - } -} -class XhtmlNamespace { - static [$buildXFAObject](name, attributes) { - if (XhtmlNamespace.hasOwnProperty(name)) { - return XhtmlNamespace[name](attributes); - } - return undefined; - } - static a(attributes) { - return new A(attributes); - } - static b(attributes) { - return new B(attributes); - } - static body(attributes) { - return new Body(attributes); - } - static br(attributes) { - return new Br(attributes); - } - static html(attributes) { - return new Html(attributes); - } - static i(attributes) { - return new I(attributes); - } - static li(attributes) { - return new Li(attributes); - } - static ol(attributes) { - return new Ol(attributes); - } - static p(attributes) { - return new P(attributes); - } - static span(attributes) { - return new Span(attributes); - } - static sub(attributes) { - return new Sub(attributes); - } - static sup(attributes) { - return new Sup(attributes); - } - static ul(attributes) { - return new Ul(attributes); - } -} - -;// ./src/core/xfa/setup.js - - - - - - - - - -const NamespaceSetUp = { - config: ConfigNamespace, - connection: ConnectionSetNamespace, - datasets: DatasetsNamespace, - localeSet: LocaleSetNamespace, - signature: SignatureNamespace, - stylesheet: StylesheetNamespace, - template: TemplateNamespace, - xdp: XdpNamespace, - xhtml: XhtmlNamespace -}; - -;// ./src/core/xfa/unknown.js - - -class UnknownNamespace { - constructor(nsId) { - this.namespaceId = nsId; - } - [$buildXFAObject](name, attributes) { - return new XmlObject(this.namespaceId, name, attributes); - } -} - -;// ./src/core/xfa/builder.js - - - - - - - -class Root extends XFAObject { - constructor(ids) { - super(-1, "root", Object.create(null)); - this.element = null; - this[$ids] = ids; - } - [$onChild](child) { - this.element = child; - return true; - } - [$finalize]() { - super[$finalize](); - if (this.element.template instanceof Template) { - this[$ids].set($root, this.element); - this.element.template[$resolvePrototypes](this[$ids]); - this.element.template[$ids] = this[$ids]; - } - } -} -class Empty extends XFAObject { - constructor() { - super(-1, "", Object.create(null)); - } - [$onChild](_) { - return false; - } -} -class Builder { - constructor(rootNameSpace = null) { - this._namespaceStack = []; - this._nsAgnosticLevel = 0; - this._namespacePrefixes = new Map(); - this._namespaces = new Map(); - this._nextNsId = Math.max(...Object.values(NamespaceIds).map(({ - id - }) => id)); - this._currentNamespace = rootNameSpace || new UnknownNamespace(++this._nextNsId); - } - buildRoot(ids) { - return new Root(ids); - } - build({ - nsPrefix, - name, - attributes, - namespace, - prefixes - }) { - const hasNamespaceDef = namespace !== null; - if (hasNamespaceDef) { - this._namespaceStack.push(this._currentNamespace); - this._currentNamespace = this._searchNamespace(namespace); - } - if (prefixes) { - this._addNamespacePrefix(prefixes); - } - if (attributes.hasOwnProperty($nsAttributes)) { - const dataTemplate = NamespaceSetUp.datasets; - const nsAttrs = attributes[$nsAttributes]; - let xfaAttrs = null; - for (const [ns, attrs] of Object.entries(nsAttrs)) { - const nsToUse = this._getNamespaceToUse(ns); - if (nsToUse === dataTemplate) { - xfaAttrs = { - xfa: attrs - }; - break; - } - } - if (xfaAttrs) { - attributes[$nsAttributes] = xfaAttrs; - } else { - delete attributes[$nsAttributes]; - } - } - const namespaceToUse = this._getNamespaceToUse(nsPrefix); - const node = namespaceToUse?.[$buildXFAObject](name, attributes) || new Empty(); - if (node[$isNsAgnostic]()) { - this._nsAgnosticLevel++; - } - if (hasNamespaceDef || prefixes || node[$isNsAgnostic]()) { - node[$cleanup] = { - hasNamespace: hasNamespaceDef, - prefixes, - nsAgnostic: node[$isNsAgnostic]() - }; - } - return node; - } - isNsAgnostic() { - return this._nsAgnosticLevel > 0; - } - _searchNamespace(nsName) { - let ns = this._namespaces.get(nsName); - if (ns) { - return ns; - } - for (const [name, { - check - }] of Object.entries(NamespaceIds)) { - if (check(nsName)) { - ns = NamespaceSetUp[name]; - if (ns) { - this._namespaces.set(nsName, ns); - return ns; - } - break; - } - } - ns = new UnknownNamespace(++this._nextNsId); - this._namespaces.set(nsName, ns); - return ns; - } - _addNamespacePrefix(prefixes) { - for (const { - prefix, - value - } of prefixes) { - const namespace = this._searchNamespace(value); - let prefixStack = this._namespacePrefixes.get(prefix); - if (!prefixStack) { - prefixStack = []; - this._namespacePrefixes.set(prefix, prefixStack); - } - prefixStack.push(namespace); - } - } - _getNamespaceToUse(prefix) { - if (!prefix) { - return this._currentNamespace; - } - const prefixStack = this._namespacePrefixes.get(prefix); - if (prefixStack?.length > 0) { - return prefixStack.at(-1); - } - warn(`Unknown namespace prefix: ${prefix}.`); - return null; - } - clean(data) { - const { - hasNamespace, - prefixes, - nsAgnostic - } = data; - if (hasNamespace) { - this._currentNamespace = this._namespaceStack.pop(); - } - if (prefixes) { - prefixes.forEach(({ - prefix - }) => { - this._namespacePrefixes.get(prefix).pop(); - }); - } - if (nsAgnostic) { - this._nsAgnosticLevel--; - } - } -} - -;// ./src/core/xfa/parser.js - - - - -class XFAParser extends XMLParserBase { - constructor(rootNameSpace = null, richText = false) { - super(); - this._builder = new Builder(rootNameSpace); - this._stack = []; - this._globalData = { - usedTypefaces: new Set() - }; - this._ids = new Map(); - this._current = this._builder.buildRoot(this._ids); - this._errorCode = XMLParserErrorCode.NoError; - this._whiteRegex = /^\s+$/; - this._nbsps = /\xa0+/g; - this._richText = richText; - } - parse(data) { - this.parseXml(data); - if (this._errorCode !== XMLParserErrorCode.NoError) { - return undefined; - } - this._current[$finalize](); - return this._current.element; - } - onText(text) { - text = text.replace(this._nbsps, match => match.slice(1) + " "); - if (this._richText || this._current[$acceptWhitespace]()) { - this._current[$onText](text, this._richText); - return; - } - if (this._whiteRegex.test(text)) { - return; - } - this._current[$onText](text.trim()); - } - onCdata(text) { - this._current[$onText](text); - } - _mkAttributes(attributes, tagName) { - let namespace = null; - let prefixes = null; - const attributeObj = Object.create({}); - for (const { - name, - value - } of attributes) { - if (name === "xmlns") { - if (!namespace) { - namespace = value; - } else { - warn(`XFA - multiple namespace definition in <${tagName}>`); - } - } else if (name.startsWith("xmlns:")) { - const prefix = name.substring("xmlns:".length); - prefixes ??= []; - prefixes.push({ - prefix, - value - }); - } else { - const i = name.indexOf(":"); - if (i === -1) { - attributeObj[name] = value; - } else { - const nsAttrs = attributeObj[$nsAttributes] ??= Object.create(null); - const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; - const attrs = nsAttrs[ns] ||= Object.create(null); - attrs[attrName] = value; - } - } - } - return [namespace, prefixes, attributeObj]; - } - _getNameAndPrefix(name, nsAgnostic) { - const i = name.indexOf(":"); - if (i === -1) { - return [name, null]; - } - return [name.substring(i + 1), nsAgnostic ? "" : name.substring(0, i)]; - } - onBeginElement(tagName, attributes, isEmpty) { - const [namespace, prefixes, attributesObj] = this._mkAttributes(attributes, tagName); - const [name, nsPrefix] = this._getNameAndPrefix(tagName, this._builder.isNsAgnostic()); - const node = this._builder.build({ - nsPrefix, - name, - attributes: attributesObj, - namespace, - prefixes - }); - node[$globalData] = this._globalData; - if (isEmpty) { - node[$finalize](); - if (this._current[$onChild](node)) { - node[$setId](this._ids); - } - node[$clean](this._builder); - return; - } - this._stack.push(this._current); - this._current = node; - } - onEndElement(name) { - const node = this._current; - if (node[$isCDATAXml]() && typeof node[$content] === "string") { - const parser = new XFAParser(); - parser._globalData = this._globalData; - const root = parser.parse(node[$content]); - node[$content] = null; - node[$onChild](root); - } - node[$finalize](); - this._current = this._stack.pop(); - if (this._current[$onChild](node)) { - node[$setId](this._ids); - } - node[$clean](this._builder); - } - onError(code) { - this._errorCode = code; - } -} - -;// ./src/core/xfa/factory.js - - - - - - - - -class XFAFactory { - constructor(data) { - try { - this.root = new XFAParser().parse(XFAFactory._createDocument(data)); - const binder = new Binder(this.root); - this.form = binder.bind(); - this.dataHandler = new DataHandler(this.root, binder.getData()); - this.form[$globalData].template = this.form; - } catch (e) { - warn(`XFA - an error occurred during parsing and binding: ${e}`); - } - } - isValid() { - return !!(this.root && this.form); - } - _createPagesHelper() { - const iterator = this.form[$toPages](); - return new Promise((resolve, reject) => { - const nextIteration = () => { - try { - const value = iterator.next(); - if (value.done) { - resolve(value.value); - } else { - setTimeout(nextIteration, 0); - } - } catch (e) { - reject(e); - } - }; - setTimeout(nextIteration, 0); - }); - } - async _createPages() { - try { - this.pages = await this._createPagesHelper(); - this.dims = this.pages.children.map(c => { - const { - width, - height - } = c.attributes.style; - return [0, 0, parseInt(width), parseInt(height)]; - }); - } catch (e) { - warn(`XFA - an error occurred during layout: ${e}`); - } - } - getBoundingBox(pageIndex) { - return this.dims[pageIndex]; - } - async getNumPages() { - if (!this.pages) { - await this._createPages(); - } - return this.dims.length; - } - setImages(images) { - this.form[$globalData].images = images; - } - setFonts(fonts) { - this.form[$globalData].fontFinder = new FontFinder(fonts); - const missingFonts = []; - for (let typeface of this.form[$globalData].usedTypefaces) { - typeface = stripQuotes(typeface); - const font = this.form[$globalData].fontFinder.find(typeface); - if (!font) { - missingFonts.push(typeface); - } - } - if (missingFonts.length > 0) { - return missingFonts; - } - return null; - } - appendFonts(fonts, reallyMissingFonts) { - this.form[$globalData].fontFinder.add(fonts, reallyMissingFonts); - } - async getPages() { - if (!this.pages) { - await this._createPages(); - } - const pages = this.pages; - this.pages = null; - return pages; - } - serializeData(storage) { - return this.dataHandler.serialize(storage); - } - static _createDocument(data) { - if (!data["/xdp:xdp"]) { - return data["xdp:xdp"]; - } - return Object.values(data).join(""); - } - static getRichTextAsHtml(rc) { - if (!rc || typeof rc !== "string") { - return null; - } - try { - let root = new XFAParser(XhtmlNamespace, true).parse(rc); - if (!["body", "xhtml"].includes(root[$nodeName])) { - const newRoot = XhtmlNamespace.body({}); - newRoot[$appendChild](root); - root = newRoot; - } - const result = root[$toHTML](); - if (!result.success) { - return null; - } - const { - html - } = result; - const { - attributes - } = html; - if (attributes) { - if (attributes.class) { - attributes.class = attributes.class.filter(attr => !attr.startsWith("xfa")); - } - attributes.dir = "auto"; - } - return { - html, - str: root[$text]() - }; - } catch (e) { - warn(`XFA - an error occurred during parsing of rich text: ${e}`); - } - return null; - } -} - -;// ./src/core/annotation.js - - - - - - - - - - - - - - - -class AnnotationFactory { - static createGlobals(pdfManager) { - return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureCatalog("globalColorSpaceCache")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments, globalColorSpaceCache]) => ({ - pdfManager, - acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, - xfaDatasets, - structTreeRoot, - baseUrl, - attachments, - globalColorSpaceCache - }), reason => { - warn(`createGlobals: "${reason}".`); - return null; - }); - } - static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageRef) { - const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; - return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, pageIndex, pageRef]); - } - static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, pageIndex = null, pageRef = null) { - const dict = xref.fetchIfRef(ref); - if (!(dict instanceof Dict)) { - return undefined; - } - const { - acroForm, - pdfManager - } = annotationGlobals; - const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; - let subtype = dict.get("Subtype"); - subtype = subtype instanceof Name ? subtype.name : null; - const parameters = { - xref, - ref, - dict, - subtype, - id, - annotationGlobals, - collectFields, - orphanFields, - needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, - pageIndex, - evaluatorOptions: pdfManager.evaluatorOptions, - pageRef - }; - switch (subtype) { - case "Link": - return new LinkAnnotation(parameters); - case "Text": - return new TextAnnotation(parameters); - case "Widget": - let fieldType = getInheritableProperty({ - dict, - key: "FT" - }); - fieldType = fieldType instanceof Name ? fieldType.name : null; - switch (fieldType) { - case "Tx": - return new TextWidgetAnnotation(parameters); - case "Btn": - return new ButtonWidgetAnnotation(parameters); - case "Ch": - return new ChoiceWidgetAnnotation(parameters); - case "Sig": - return new SignatureWidgetAnnotation(parameters); - } - warn(`Unimplemented widget field type "${fieldType}", ` + "falling back to base field type."); - return new WidgetAnnotation(parameters); - case "Popup": - return new PopupAnnotation(parameters); - case "FreeText": - return new FreeTextAnnotation(parameters); - case "Line": - return new LineAnnotation(parameters); - case "Square": - return new SquareAnnotation(parameters); - case "Circle": - return new CircleAnnotation(parameters); - case "PolyLine": - return new PolylineAnnotation(parameters); - case "Polygon": - return new PolygonAnnotation(parameters); - case "Caret": - return new CaretAnnotation(parameters); - case "Ink": - return new InkAnnotation(parameters); - case "Highlight": - return new HighlightAnnotation(parameters); - case "Underline": - return new UnderlineAnnotation(parameters); - case "Squiggly": - return new SquigglyAnnotation(parameters); - case "StrikeOut": - return new StrikeOutAnnotation(parameters); - case "Stamp": - return new StampAnnotation(parameters); - case "FileAttachment": - return new FileAttachmentAnnotation(parameters); - default: - if (!collectFields) { - if (!subtype) { - warn("Annotation is missing the required /Subtype."); - } else { - warn(`Unimplemented annotation type "${subtype}", ` + "falling back to base annotation."); - } - } - return new Annotation(parameters); - } - } - static async _getPageIndex(xref, ref, pdfManager) { - try { - const annotDict = await xref.fetchIfRefAsync(ref); - if (!(annotDict instanceof Dict)) { - return -1; - } - const pageRef = annotDict.getRaw("P"); - if (pageRef instanceof Ref) { - try { - const pageIndex = await pdfManager.ensureCatalog("getPageIndex", [pageRef]); - return pageIndex; - } catch (ex) { - info(`_getPageIndex -- not a valid page reference: "${ex}".`); - } - } - if (annotDict.has("Kids")) { - return -1; - } - const numPages = await pdfManager.ensureDoc("numPages"); - for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { - const page = await pdfManager.getPage(pageIndex); - const annotations = await pdfManager.ensure(page, "annotations"); - for (const annotRef of annotations) { - if (annotRef instanceof Ref && isRefsEqual(annotRef, ref)) { - return pageIndex; - } - } - } - } catch (ex) { - warn(`_getPageIndex: "${ex}".`); - } - return -1; - } - static generateImages(annotations, xref, isOffscreenCanvasSupported) { - if (!isOffscreenCanvasSupported) { - warn("generateImages: OffscreenCanvas is not supported, cannot save or print some annotations with images."); - return null; - } - let imagePromises; - for (const { - bitmapId, - bitmap - } of annotations) { - if (!bitmap) { - continue; - } - imagePromises ||= new Map(); - imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); - } - return imagePromises; - } - static async saveNewAnnotations(evaluator, task, annotations, imagePromises, changes) { - const xref = evaluator.xref; - let baseFontRef; - const promises = []; - const { - isOffscreenCanvasSupported - } = evaluator.options; - for (const annotation of annotations) { - if (annotation.deleted) { - continue; - } - switch (annotation.annotationType) { - case AnnotationEditorType.FREETEXT: - if (!baseFontRef) { - const baseFont = new Dict(xref); - baseFont.setIfName("BaseFont", "Helvetica"); - baseFont.setIfName("Type", "Font"); - baseFont.setIfName("Subtype", "Type1"); - baseFont.setIfName("Encoding", "WinAnsiEncoding"); - baseFontRef = xref.getNewTemporaryRef(); - changes.put(baseFontRef, { - data: baseFont - }); - } - promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { - evaluator, - task, - baseFontRef - })); - break; - case AnnotationEditorType.HIGHLIGHT: - if (annotation.quadPoints) { - promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); - } else { - promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); - } - break; - case AnnotationEditorType.INK: - promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); - break; - case AnnotationEditorType.STAMP: - const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; - if (image?.imageStream) { - const { - imageStream, - smaskStream - } = image; - if (smaskStream) { - const smaskRef = xref.getNewTemporaryRef(); - changes.put(smaskRef, { - data: smaskStream - }); - imageStream.dict.set("SMask", smaskRef); - } - const imageRef = image.imageRef = xref.getNewTemporaryRef(); - changes.put(imageRef, { - data: imageStream - }); - image.imageStream = image.smaskStream = null; - } - promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { - image - })); - break; - case AnnotationEditorType.SIGNATURE: - promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {})); - break; - } - } - return { - annotations: (await Promise.all(promises)).flat() - }; - } - static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) { - if (!annotations) { - return null; - } - const { - options, - xref - } = evaluator; - const promises = []; - for (const annotation of annotations) { - if (annotation.deleted) { - continue; - } - switch (annotation.annotationType) { - case AnnotationEditorType.FREETEXT: - promises.push(FreeTextAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - evaluator, - task, - evaluatorOptions: options - })); - break; - case AnnotationEditorType.HIGHLIGHT: - if (annotation.quadPoints) { - promises.push(HighlightAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - evaluatorOptions: options - })); - } else { - promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - evaluatorOptions: options - })); - } - break; - case AnnotationEditorType.INK: - promises.push(InkAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - evaluatorOptions: options - })); - break; - case AnnotationEditorType.STAMP: - const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; - if (image?.imageStream) { - const { - imageStream, - smaskStream - } = image; - if (smaskStream) { - imageStream.dict.set("SMask", smaskStream); - } - image.imageRef = new JpegStream(imageStream, imageStream.length); - image.imageStream = image.smaskStream = null; - } - promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - image, - evaluatorOptions: options - })); - break; - case AnnotationEditorType.SIGNATURE: - promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { - evaluatorOptions: options - })); - break; - } - } - return Promise.all(promises); - } -} -function getRgbColor(color, defaultColor = new Uint8ClampedArray(3)) { - if (!Array.isArray(color)) { - return defaultColor; - } - const rgbColor = defaultColor || new Uint8ClampedArray(3); - switch (color.length) { - case 0: - return null; - case 1: - ColorSpaceUtils.gray.getRgbItem(color, 0, rgbColor, 0); - return rgbColor; - case 3: - ColorSpaceUtils.rgb.getRgbItem(color, 0, rgbColor, 0); - return rgbColor; - case 4: - ColorSpaceUtils.cmyk.getRgbItem(color, 0, rgbColor, 0); - return rgbColor; - default: - return defaultColor; - } -} -function getPdfColorArray(color, defaultValue = null) { - return color && Array.from(color, c => c / 255) || defaultValue; -} -function getQuadPoints(dict, rect) { - const quadPoints = dict.getArray("QuadPoints"); - if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { - return null; - } - const newQuadPoints = new Float32Array(quadPoints.length); - for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { - const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); - const minX = Math.min(x1, x2, x3, x4); - const maxX = Math.max(x1, x2, x3, x4); - const minY = Math.min(y1, y2, y3, y4); - const maxY = Math.max(y1, y2, y3, y4); - if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { - return null; - } - newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); - } - return newQuadPoints; -} -function getTransformMatrix(rect, bbox, matrix) { - const minMax = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); - Util.axialAlignedBoundingBox(bbox, matrix, minMax); - const [minX, minY, maxX, maxY] = minMax; - if (minX === maxX || minY === maxY) { - return [1, 0, 0, 1, rect[0], rect[1]]; - } - const xRatio = (rect[2] - rect[0]) / (maxX - minX); - const yRatio = (rect[3] - rect[1]) / (maxY - minY); - return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; -} -class Annotation { - constructor(params) { - const { - dict, - xref, - annotationGlobals, - ref, - orphanFields - } = params; - const parentRef = orphanFields?.get(ref); - if (parentRef) { - dict.set("Parent", parentRef); - } - this.setTitle(dict.get("T")); - this.setContents(dict.get("Contents")); - this.setModificationDate(dict.get("M")); - this.setFlags(dict.get("F")); - this.setRectangle(dict.getArray("Rect")); - this.setColor(dict.getArray("C")); - this.setBorderStyle(dict); - this.setAppearance(dict); - this.setOptionalContent(dict); - const MK = dict.get("MK"); - this.setBorderAndBackgroundColors(MK); - this.setRotation(MK, dict); - this.ref = params.ref instanceof Ref ? params.ref : null; - this._streams = []; - if (this.appearance) { - this._streams.push(this.appearance); - } - const isLocked = !!(this.flags & AnnotationFlag.LOCKED); - const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); - this.data = { - annotationFlags: this.flags, - borderStyle: this.borderStyle, - color: this.color, - backgroundColor: this.backgroundColor, - borderColor: this.borderColor, - rotation: this.rotation, - contentsObj: this._contents, - hasAppearance: !!this.appearance, - id: params.id, - modificationDate: this.modificationDate, - rect: this.rectangle, - subtype: params.subtype, - hasOwnCanvas: false, - noRotate: !!(this.flags & AnnotationFlag.NOROTATE), - noHTML: isLocked && isContentLocked, - isEditable: false, - structParent: -1 - }; - if (annotationGlobals.structTreeRoot) { - let structParent = dict.get("StructParent"); - this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; - annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); - } - if (params.collectFields) { - const kids = dict.get("Kids"); - if (Array.isArray(kids)) { - const kidIds = []; - for (const kid of kids) { - if (kid instanceof Ref) { - kidIds.push(kid.toString()); - } - } - if (kidIds.length !== 0) { - this.data.kidIds = kidIds; - } - } - this.data.actions = collectActions(xref, dict, AnnotationActionEventType); - this.data.fieldName = this._constructFieldName(dict); - this.data.pageIndex = params.pageIndex; - } - const it = dict.get("IT"); - if (it instanceof Name) { - this.data.it = it.name; - } - this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported; - this._fallbackFontDict = null; - this._needAppearances = false; - } - _hasFlag(flags, flag) { - return !!(flags & flag); - } - _buildFlags(noView, noPrint) { - let { - flags - } = this; - if (noView === undefined) { - if (noPrint === undefined) { - return undefined; - } - if (noPrint) { - return flags & ~AnnotationFlag.PRINT; - } - return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT; - } - if (noView) { - flags |= AnnotationFlag.PRINT; - if (noPrint) { - return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN; - } - return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW; - } - flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); - if (noPrint) { - return flags & ~AnnotationFlag.PRINT; - } - return flags | AnnotationFlag.PRINT; - } - _isViewable(flags) { - return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); - } - _isPrintable(flags) { - return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE); - } - mustBeViewed(annotationStorage, _renderForms) { - const noView = annotationStorage?.get(this.data.id)?.noView; - if (noView !== undefined) { - return !noView; - } - return this.viewable && !this._hasFlag(this.flags, AnnotationFlag.HIDDEN); - } - mustBePrinted(annotationStorage) { - const noPrint = annotationStorage?.get(this.data.id)?.noPrint; - if (noPrint !== undefined) { - return !noPrint; - } - return this.printable; - } - mustBeViewedWhenEditing(isEditing, modifiedIds = null) { - return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); - } - get viewable() { - if (this.data.quadPoints === null) { - return false; - } - if (this.flags === 0) { - return true; - } - return this._isViewable(this.flags); - } - get printable() { - if (this.data.quadPoints === null) { - return false; - } - if (this.flags === 0) { - return false; - } - return this._isPrintable(this.flags); - } - _parseStringHelper(data) { - const str = typeof data === "string" ? stringToPDFString(data) : ""; - const dir = str && bidi(str).dir === "rtl" ? "rtl" : "ltr"; - return { - str, - dir - }; - } - setDefaultAppearance(params) { - const { - dict, - annotationGlobals - } = params; - const defaultAppearance = getInheritableProperty({ - dict, - key: "DA" - }) || annotationGlobals.acroForm.get("DA"); - this._defaultAppearance = typeof defaultAppearance === "string" ? defaultAppearance : ""; - this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance); - } - setTitle(title) { - this._title = this._parseStringHelper(title); - } - setContents(contents) { - this._contents = this._parseStringHelper(contents); - } - setModificationDate(modificationDate) { - this.modificationDate = typeof modificationDate === "string" ? modificationDate : null; - } - setFlags(flags) { - this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0; - if (this.flags & AnnotationFlag.INVISIBLE && this.constructor.name !== "Annotation") { - this.flags ^= AnnotationFlag.INVISIBLE; - } - } - hasFlag(flag) { - return this._hasFlag(this.flags, flag); - } - setRectangle(rectangle) { - this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); - } - setColor(color) { - this.color = getRgbColor(color); - } - setLineEndings(lineEndings) { - this.lineEndings = ["None", "None"]; - if (Array.isArray(lineEndings) && lineEndings.length === 2) { - for (let i = 0; i < 2; i++) { - const obj = lineEndings[i]; - if (obj instanceof Name) { - switch (obj.name) { - case "None": - continue; - case "Square": - case "Circle": - case "Diamond": - case "OpenArrow": - case "ClosedArrow": - case "Butt": - case "ROpenArrow": - case "RClosedArrow": - case "Slash": - this.lineEndings[i] = obj.name; - continue; - } - } - warn(`Ignoring invalid lineEnding: ${obj}`); - } - } - } - setRotation(mk, dict) { - this.rotation = 0; - let angle = mk instanceof Dict ? mk.get("R") || 0 : dict.get("Rotate") || 0; - if (Number.isInteger(angle) && angle !== 0) { - angle %= 360; - if (angle < 0) { - angle += 360; - } - if (angle % 90 === 0) { - this.rotation = angle; - } - } - } - setBorderAndBackgroundColors(mk) { - if (mk instanceof Dict) { - this.borderColor = getRgbColor(mk.getArray("BC"), null); - this.backgroundColor = getRgbColor(mk.getArray("BG"), null); - } else { - this.borderColor = this.backgroundColor = null; - } - } - setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!(borderStyle instanceof Dict)) { - return; - } - if (borderStyle.has("BS")) { - const dict = borderStyle.get("BS"); - if (dict instanceof Dict) { - const dictType = dict.get("Type"); - if (!dictType || isName(dictType, "Border")) { - this.borderStyle.setWidth(dict.get("W"), this.rectangle); - this.borderStyle.setStyle(dict.get("S")); - this.borderStyle.setDashArray(dict.getArray("D")); - } - } - } else if (borderStyle.has("Border")) { - const array = borderStyle.getArray("Border"); - if (Array.isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2], this.rectangle); - if (array.length === 4) { - this.borderStyle.setDashArray(array[3], true); - } - } - } else { - this.borderStyle.setWidth(0); - } - } - setAppearance(dict) { - this.appearance = null; - const appearanceStates = dict.get("AP"); - if (!(appearanceStates instanceof Dict)) { - return; - } - const normalAppearanceState = appearanceStates.get("N"); - if (normalAppearanceState instanceof BaseStream) { - this.appearance = normalAppearanceState; - return; - } - if (!(normalAppearanceState instanceof Dict)) { - return; - } - const as = dict.get("AS"); - if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { - return; - } - const appearance = normalAppearanceState.get(as.name); - if (appearance instanceof BaseStream) { - this.appearance = appearance; - } - } - setOptionalContent(dict) { - this.oc = null; - const oc = dict.get("OC"); - if (oc instanceof Name) { - warn("setOptionalContent: Support for /Name-entry is not implemented."); - } else if (oc instanceof Dict) { - this.oc = oc; - } - } - async loadResources(keys, appearance) { - const resources = await appearance.dict.getAsync("Resources"); - if (resources) { - await ObjectLoader.load(resources, keys, resources.xref); - } - return resources; - } - async getOperatorList(evaluator, task, intent, annotationStorage) { - const { - hasOwnCanvas, - id, - rect - } = this.data; - let appearance = this.appearance; - const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); - if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) { - this.data.hasOwnCanvas = false; - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; - } - if (!appearance) { - if (!isUsingOwnCanvas) { - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; - } - appearance = new StringStream(""); - appearance.dict = new Dict(); - } - const appearanceDict = appearance.dict; - const resources = await this.loadResources(RESOURCES_KEYS_OPERATOR_LIST, appearance); - const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, 1, 1]); - const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); - const transform = getTransformMatrix(rect, bbox, matrix); - const opList = new OperatorList(); - let optionalContent; - if (this.oc) { - optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); - } - if (optionalContent !== undefined) { - opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); - } - opList.addOp(OPS.beginAnnotation, [id, rect, transform, matrix, isUsingOwnCanvas]); - await evaluator.getOperatorList({ - stream: appearance, - task, - resources, - operatorList: opList, - fallbackFontDict: this._fallbackFontDict - }); - opList.addOp(OPS.endAnnotation, []); - if (optionalContent !== undefined) { - opList.addOp(OPS.endMarkedContent, []); - } - this.reset(); - return { - opList, - separateForm: false, - separateCanvas: isUsingOwnCanvas - }; - } - async save(evaluator, task, annotationStorage, changes) { - return null; - } - get overlaysTextContent() { - return false; - } - get hasTextContent() { - return false; - } - async extractTextContent(evaluator, task, viewBox) { - if (!this.appearance) { - return; - } - const resources = await this.loadResources(RESOURCES_KEYS_TEXT_CONTENT, this.appearance); - const text = []; - const buffer = []; - let firstPosition = null; - const sink = { - desiredSize: Math.Infinity, - ready: true, - enqueue(chunk, size) { - for (const item of chunk.items) { - if (item.str === undefined) { - continue; - } - firstPosition ||= item.transform.slice(-2); - buffer.push(item.str); - if (item.hasEOL) { - text.push(buffer.join("").trimEnd()); - buffer.length = 0; - } - } - } - }; - await evaluator.getTextContent({ - stream: this.appearance, - task, - resources, - includeMarkedContent: true, - keepWhiteSpace: true, - sink, - viewBox - }); - this.reset(); - if (buffer.length) { - text.push(buffer.join("").trimEnd()); - } - if (text.length > 1 || text[0]) { - const appearanceDict = this.appearance.dict; - const bbox = lookupRect(appearanceDict.getArray("BBox"), null); - const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); - this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix); - this.data.textContent = text; - } - } - _transformPoint(coords, bbox, matrix) { - const { - rect - } = this.data; - bbox ||= [0, 0, 1, 1]; - matrix ||= [1, 0, 0, 1, 0, 0]; - const transform = getTransformMatrix(rect, bbox, matrix); - transform[4] -= rect[0]; - transform[5] -= rect[1]; - const p = coords.slice(); - Util.applyTransform(p, transform); - Util.applyTransform(p, matrix); - return p; - } - getFieldObject() { - if (this.data.kidIds) { - return { - id: this.data.id, - actions: this.data.actions, - name: this.data.fieldName, - strokeColor: this.data.borderColor, - fillColor: this.data.backgroundColor, - type: "", - kidIds: this.data.kidIds, - page: this.data.pageIndex, - rotation: this.rotation - }; - } - return null; - } - reset() { - for (const stream of this._streams) { - stream.reset(); - } - } - _constructFieldName(dict) { - if (!dict.has("T") && !dict.has("Parent")) { - warn("Unknown field name, falling back to empty field name."); - return ""; - } - if (!dict.has("Parent")) { - return stringToPDFString(dict.get("T")); - } - const fieldName = []; - if (dict.has("T")) { - fieldName.unshift(stringToPDFString(dict.get("T"))); - } - let loopDict = dict; - const visited = new RefSet(); - if (dict.objId) { - visited.put(dict.objId); - } - while (loopDict.has("Parent")) { - loopDict = loopDict.get("Parent"); - if (!(loopDict instanceof Dict) || loopDict.objId && visited.has(loopDict.objId)) { - break; - } - if (loopDict.objId) { - visited.put(loopDict.objId); - } - if (loopDict.has("T")) { - fieldName.unshift(stringToPDFString(loopDict.get("T"))); - } - } - return fieldName.join("."); - } - get width() { - return this.data.rect[2] - this.data.rect[0]; - } - get height() { - return this.data.rect[3] - this.data.rect[1]; - } -} -class AnnotationBorderStyle { - constructor() { - this.width = 1; - this.rawWidth = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - setWidth(width, rect = [0, 0, 0, 0]) { - if (width instanceof Name) { - this.width = 0; - return; - } - if (typeof width === "number") { - if (width > 0) { - this.rawWidth = width; - const maxWidth = (rect[2] - rect[0]) / 2; - const maxHeight = (rect[3] - rect[1]) / 2; - if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { - warn(`AnnotationBorderStyle.setWidth - ignoring width: ${width}`); - width = 1; - } - } - this.width = width; - } - } - setStyle(style) { - if (!(style instanceof Name)) { - return; - } - switch (style.name) { - case "S": - this.style = AnnotationBorderStyleType.SOLID; - break; - case "D": - this.style = AnnotationBorderStyleType.DASHED; - break; - case "B": - this.style = AnnotationBorderStyleType.BEVELED; - break; - case "I": - this.style = AnnotationBorderStyleType.INSET; - break; - case "U": - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - default: - break; - } - } - setDashArray(dashArray, forceStyle = false) { - if (Array.isArray(dashArray)) { - let isValid = true; - let allZeros = true; - for (const element of dashArray) { - const validNumber = +element >= 0; - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (dashArray.length === 0 || isValid && !allZeros) { - this.dashArray = dashArray; - if (forceStyle) { - this.setStyle(Name.get("D")); - } - } else { - this.width = 0; - } - } else if (dashArray) { - this.width = 0; - } - } - setHorizontalCornerRadius(radius) { - if (Number.isInteger(radius)) { - this.horizontalCornerRadius = radius; - } - } - setVerticalCornerRadius(radius) { - if (Number.isInteger(radius)) { - this.verticalCornerRadius = radius; - } - } -} -class MarkupAnnotation extends Annotation { - constructor(params) { - super(params); - const { - dict - } = params; - if (dict.has("IRT")) { - const rawIRT = dict.getRaw("IRT"); - this.data.inReplyTo = rawIRT instanceof Ref ? rawIRT.toString() : null; - const rt = dict.get("RT"); - this.data.replyType = rt instanceof Name ? rt.name : AnnotationReplyType.REPLY; - } - let popupRef = null; - if (this.data.replyType === AnnotationReplyType.GROUP) { - const parent = dict.get("IRT"); - this.setTitle(parent.get("T")); - this.data.titleObj = this._title; - this.setContents(parent.get("Contents")); - this.data.contentsObj = this._contents; - if (!parent.has("CreationDate")) { - this.data.creationDate = null; - } else { - this.setCreationDate(parent.get("CreationDate")); - this.data.creationDate = this.creationDate; - } - if (!parent.has("M")) { - this.data.modificationDate = null; - } else { - this.setModificationDate(parent.get("M")); - this.data.modificationDate = this.modificationDate; - } - popupRef = parent.getRaw("Popup"); - if (!parent.has("C")) { - this.data.color = null; - } else { - this.setColor(parent.getArray("C")); - this.data.color = this.color; - } - } else { - this.data.titleObj = this._title; - this.setCreationDate(dict.get("CreationDate")); - this.data.creationDate = this.creationDate; - popupRef = dict.getRaw("Popup"); - if (!dict.has("C")) { - this.data.color = null; - } - } - this.data.popupRef = popupRef instanceof Ref ? popupRef.toString() : null; - if (dict.has("RC")) { - this.data.richText = XFAFactory.getRichTextAsHtml(dict.get("RC")); - } - } - setCreationDate(creationDate) { - this.creationDate = typeof creationDate === "string" ? creationDate : null; - } - _setDefaultAppearance({ - xref, - extra, - strokeColor, - fillColor, - blendMode, - strokeAlpha, - fillAlpha, - pointsCallback - }) { - const bbox = this.data.rect = [Infinity, Infinity, -Infinity, -Infinity]; - const buffer = ["q"]; - if (extra) { - buffer.push(extra); - } - if (strokeColor) { - buffer.push(`${strokeColor[0]} ${strokeColor[1]} ${strokeColor[2]} RG`); - } - if (fillColor) { - buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); - } - const pointsArray = this.data.quadPoints || Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]); - for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { - const points = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); - Util.rectBoundingBox(...points, bbox); - } - buffer.push("Q"); - const formDict = new Dict(xref); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.setIfName("Subtype", "Form"); - const appearanceStream = new StringStream(buffer.join(" ")); - appearanceStream.dict = appearanceStreamDict; - formDict.set("Fm0", appearanceStream); - const gsDict = new Dict(xref); - if (blendMode) { - gsDict.setIfName("BM", blendMode); - } - gsDict.setIfNumber("CA", strokeAlpha); - gsDict.setIfNumber("ca", fillAlpha); - const stateDict = new Dict(xref); - stateDict.set("GS0", gsDict); - const resources = new Dict(xref); - resources.set("ExtGState", stateDict); - resources.set("XObject", formDict); - const appearanceDict = new Dict(xref); - appearanceDict.set("Resources", resources); - appearanceDict.set("BBox", bbox); - this.appearance = new StringStream("/GS0 gs /Fm0 Do"); - this.appearance.dict = appearanceDict; - this._streams.push(this.appearance, appearanceStream); - } - static async createNewAnnotation(xref, annotation, changes, params) { - const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); - const ap = await this.createNewAppearanceStream(annotation, xref, params); - let annotationDict; - if (ap) { - const apRef = xref.getNewTemporaryRef(); - annotationDict = this.createNewDict(annotation, xref, { - apRef - }); - changes.put(apRef, { - data: ap - }); - } else { - annotationDict = this.createNewDict(annotation, xref, {}); - } - if (Number.isInteger(annotation.parentTreeId)) { - annotationDict.set("StructParent", annotation.parentTreeId); - } - changes.put(annotationRef, { - data: annotationDict - }); - const retRef = { - ref: annotationRef - }; - if (annotation.popup) { - const popup = annotation.popup; - if (popup.deleted) { - annotationDict.delete("Popup"); - annotationDict.delete("Contents"); - annotationDict.delete("RC"); - return retRef; - } - const popupRef = popup.ref ||= xref.getNewTemporaryRef(); - popup.parent = annotationRef; - const popupDict = PopupAnnotation.createNewDict(popup, xref); - changes.put(popupRef, { - data: popupDict - }); - annotationDict.setIfDefined("Contents", stringToAsciiOrUTF16BE(popup.contents)); - annotationDict.set("Popup", popupRef); - return [retRef, { - ref: popupRef - }]; - } - return retRef; - } - static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) { - const ap = await this.createNewAppearanceStream(annotation, xref, params); - const annotationDict = this.createNewDict(annotation, xref, ap ? { - ap - } : {}); - const newAnnotation = new this.prototype.constructor({ - dict: annotationDict, - xref, - annotationGlobals, - evaluatorOptions: params.evaluatorOptions - }); - if (annotation.ref) { - newAnnotation.ref = newAnnotation.refToReplace = annotation.ref; - } - return newAnnotation; - } -} -class WidgetAnnotation extends Annotation { - constructor(params) { - super(params); - const { - dict, - xref, - annotationGlobals - } = params; - const data = this.data; - this._needAppearances = params.needAppearances; - data.annotationType = AnnotationType.WIDGET; - if (data.fieldName === undefined) { - data.fieldName = this._constructFieldName(dict); - } - if (data.actions === undefined) { - data.actions = collectActions(xref, dict, AnnotationActionEventType); - } - let fieldValue = getInheritableProperty({ - dict, - key: "V", - getArray: true - }); - data.fieldValue = this._decodeFormValue(fieldValue); - const defaultFieldValue = getInheritableProperty({ - dict, - key: "DV", - getArray: true - }); - data.defaultFieldValue = this._decodeFormValue(defaultFieldValue); - if (fieldValue === undefined && annotationGlobals.xfaDatasets) { - const path = this._title.str; - if (path) { - this._hasValueFromXFA = true; - data.fieldValue = fieldValue = annotationGlobals.xfaDatasets.getValue(path); - } - } - if (fieldValue === undefined && data.defaultFieldValue !== null) { - data.fieldValue = data.defaultFieldValue; - } - data.alternativeText = stringToPDFString(dict.get("TU") || ""); - this.setDefaultAppearance(params); - data.hasAppearance ||= this._needAppearances && data.fieldValue !== undefined && data.fieldValue !== null; - const fieldType = getInheritableProperty({ - dict, - key: "FT" - }); - data.fieldType = fieldType instanceof Name ? fieldType.name : null; - const localResources = getInheritableProperty({ - dict, - key: "DR" - }); - const acroFormResources = annotationGlobals.acroForm.get("DR"); - const appearanceResources = this.appearance?.dict.get("Resources"); - this._fieldResources = { - localResources, - acroFormResources, - appearanceResources, - mergedResources: Dict.merge({ - xref, - dictArray: [localResources, appearanceResources, acroFormResources], - mergeSubDicts: true - }) - }; - data.fieldFlags = getInheritableProperty({ - dict, - key: "Ff" - }); - if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { - data.fieldFlags = 0; - } - data.password = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); - data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); - data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); - data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); - } - _decodeFormValue(formValue) { - if (Array.isArray(formValue)) { - return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item)); - } else if (formValue instanceof Name) { - return stringToPDFString(formValue.name); - } else if (typeof formValue === "string") { - return stringToPDFString(formValue); - } - return null; - } - hasFieldFlag(flag) { - return !!(this.data.fieldFlags & flag); - } - _isViewable(flags) { - return true; - } - mustBeViewed(annotationStorage, renderForms) { - if (renderForms) { - return this.viewable; - } - return super.mustBeViewed(annotationStorage, renderForms) && !this._hasFlag(this.flags, AnnotationFlag.NOVIEW); - } - getRotationMatrix(annotationStorage) { - let rotation = annotationStorage?.get(this.data.id)?.rotation; - if (rotation === undefined) { - rotation = this.rotation; - } - return rotation === 0 ? IDENTITY_MATRIX : getRotationMatrix(rotation, this.width, this.height); - } - getBorderAndBackgroundAppearances(annotationStorage) { - let rotation = annotationStorage?.get(this.data.id)?.rotation; - if (rotation === undefined) { - rotation = this.rotation; - } - if (!this.backgroundColor && !this.borderColor) { - return ""; - } - const rect = rotation === 0 || rotation === 180 ? `0 0 ${this.width} ${this.height} re` : `0 0 ${this.height} ${this.width} re`; - let str = ""; - if (this.backgroundColor) { - str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; - } - if (this.borderColor) { - const borderWidth = this.borderStyle.width || 1; - str += `${borderWidth} w ${getPdfColor(this.borderColor, false)} ${rect} S `; - } - return str; - } - async getOperatorList(evaluator, task, intent, annotationStorage) { - if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { - return { - opList: new OperatorList(), - separateForm: true, - separateCanvas: false - }; - } - if (!this._hasText) { - return super.getOperatorList(evaluator, task, intent, annotationStorage); - } - const content = await this._getAppearance(evaluator, task, intent, annotationStorage); - if (this.appearance && content === null) { - return super.getOperatorList(evaluator, task, intent, annotationStorage); - } - const opList = new OperatorList(); - if (!this._defaultAppearance || content === null) { - return { - opList, - separateForm: false, - separateCanvas: false - }; - } - const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); - const matrix = [1, 0, 0, 1, 0, 0]; - const bbox = [0, 0, this.width, this.height]; - const transform = getTransformMatrix(this.data.rect, bbox, matrix); - let optionalContent; - if (this.oc) { - optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); - } - if (optionalContent !== undefined) { - opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); - } - opList.addOp(OPS.beginAnnotation, [this.data.id, this.data.rect, transform, this.getRotationMatrix(annotationStorage), isUsingOwnCanvas]); - const stream = new StringStream(content); - await evaluator.getOperatorList({ - stream, - task, - resources: this._fieldResources.mergedResources, - operatorList: opList - }); - opList.addOp(OPS.endAnnotation, []); - if (optionalContent !== undefined) { - opList.addOp(OPS.endMarkedContent, []); - } - return { - opList, - separateForm: false, - separateCanvas: isUsingOwnCanvas - }; - } - _getMKDict(rotation) { - const mk = new Dict(null); - if (rotation) { - mk.set("R", rotation); - } - mk.setIfArray("BC", getPdfColorArray(this.borderColor)); - mk.setIfArray("BG", getPdfColorArray(this.backgroundColor)); - return mk.size > 0 ? mk : null; - } - amendSavedDict(annotationStorage, dict) {} - setValue(dict, value, xref, changes) { - const { - dict: parentDict, - ref: parentRef - } = getParentToUpdate(dict, this.ref, xref); - if (!parentDict) { - dict.set("V", value); - } else if (!changes.has(parentRef)) { - const newParentDict = parentDict.clone(); - newParentDict.set("V", value); - changes.put(parentRef, { - data: newParentDict - }); - return newParentDict; - } - return null; - } - async save(evaluator, task, annotationStorage, changes) { - const storageEntry = annotationStorage?.get(this.data.id); - const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); - let value = storageEntry?.value, - rotation = storageEntry?.rotation; - if (value === this.data.fieldValue || value === undefined) { - if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) { - return; - } - value ||= this.data.fieldValue; - } - if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { - return; - } - if (rotation === undefined) { - rotation = this.rotation; - } - let appearance = null; - if (!this._needAppearances) { - appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); - if (appearance === null && flags === undefined) { - return; - } - } else {} - let needAppearances = false; - if (appearance?.needAppearances) { - needAppearances = true; - appearance = null; - } - const { - xref - } = evaluator; - const originalDict = xref.fetchIfRef(this.ref); - if (!(originalDict instanceof Dict)) { - return; - } - const dict = new Dict(xref); - for (const key of originalDict.getKeys()) { - if (key !== "AP") { - dict.set(key, originalDict.getRaw(key)); - } - } - if (flags !== undefined) { - dict.set("F", flags); - if (appearance === null && !needAppearances) { - const ap = originalDict.getRaw("AP"); - if (ap) { - dict.set("AP", ap); - } - } - } - const xfa = { - path: this.data.fieldName, - value - }; - const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); - this.amendSavedDict(annotationStorage, newParentDict || dict); - const maybeMK = this._getMKDict(rotation); - if (maybeMK) { - dict.set("MK", maybeMK); - } - changes.put(this.ref, { - data: dict, - xfa, - needAppearances - }); - if (appearance !== null) { - const newRef = xref.getNewTemporaryRef(); - const AP = new Dict(xref); - dict.set("AP", AP); - AP.set("N", newRef); - const resources = this._getSaveFieldResources(xref); - const appearanceStream = new StringStream(appearance); - const appearanceDict = appearanceStream.dict = new Dict(xref); - appearanceDict.setIfName("Subtype", "Form"); - appearanceDict.set("Resources", resources); - const bbox = rotation % 180 === 0 ? [0, 0, this.width, this.height] : [0, 0, this.height, this.width]; - appearanceDict.set("BBox", bbox); - const rotationMatrix = this.getRotationMatrix(annotationStorage); - if (rotationMatrix !== IDENTITY_MATRIX) { - appearanceDict.set("Matrix", rotationMatrix); - } - changes.put(newRef, { - data: appearanceStream, - xfa: null, - needAppearances: false - }); - } - dict.set("M", `D:${getModificationDate()}`); - } - async _getAppearance(evaluator, task, intent, annotationStorage) { - if (this.data.password) { - return null; - } - const storageEntry = annotationStorage?.get(this.data.id); - let value, rotation; - if (storageEntry) { - value = storageEntry.formattedValue || storageEntry.value; - rotation = storageEntry.rotation; - } - if (rotation === undefined && value === undefined && !this._needAppearances) { - if (!this._hasValueFromXFA || this.appearance) { - return null; - } - } - const colors = this.getBorderAndBackgroundAppearances(annotationStorage); - if (value === undefined) { - value = this.data.fieldValue; - if (!value) { - return `/Tx BMC q ${colors}Q EMC`; - } - } - if (Array.isArray(value) && value.length === 1) { - value = value[0]; - } - assert(typeof value === "string", "Expected `value` to be a string."); - value = value.trimEnd(); - if (this.data.combo) { - const option = this.data.options.find(({ - exportValue - }) => value === exportValue); - value = option?.displayValue || value; - } - if (value === "") { - return `/Tx BMC q ${colors}Q EMC`; - } - if (rotation === undefined) { - rotation = this.rotation; - } - let lineCount = -1; - let lines; - if (this.data.multiLine) { - lines = value.split(/\r\n?|\n/).map(line => line.normalize("NFC")); - lineCount = lines.length; - } else { - lines = [value.replace(/\r\n?|\n/, "").normalize("NFC")]; - } - const defaultPadding = 1; - const defaultHPadding = 2; - let { - width: totalWidth, - height: totalHeight - } = this; - if (rotation === 90 || rotation === 270) { - [totalWidth, totalHeight] = [totalHeight, totalWidth]; - } - if (!this._defaultAppearance) { - this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); - } - let font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); - let defaultAppearance, fontSize, lineHeight; - const encodedLines = []; - let encodingError = false; - for (const line of lines) { - const encodedString = font.encodeString(line); - if (encodedString.length > 1) { - encodingError = true; - } - encodedLines.push(encodedString.join("")); - } - if (encodingError && intent & RenderingIntentFlag.SAVE) { - return { - needAppearances: true - }; - } - if (encodingError && this._isOffscreenCanvasSupported) { - const fontFamily = this.data.comb ? "monospace" : "sans-serif"; - const fakeUnicodeFont = new FakeUnicodeFont(evaluator.xref, fontFamily); - const resources = fakeUnicodeFont.createFontResources(lines.join("")); - const newFont = resources.getRaw("Font"); - if (this._fieldResources.mergedResources.has("Font")) { - const oldFont = this._fieldResources.mergedResources.get("Font"); - for (const key of newFont.getKeys()) { - oldFont.set(key, newFont.getRaw(key)); - } - } else { - this._fieldResources.mergedResources.set("Font", newFont); - } - const fontName = fakeUnicodeFont.fontName.name; - font = await WidgetAnnotation._getFontData(evaluator, task, { - fontName, - fontSize: 0 - }, resources); - for (let i = 0, ii = encodedLines.length; i < ii; i++) { - encodedLines[i] = stringToUTF16String(lines[i]); - } - const savedDefaultAppearance = Object.assign(Object.create(null), this.data.defaultAppearanceData); - this.data.defaultAppearanceData.fontSize = 0; - this.data.defaultAppearanceData.fontName = fontName; - [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); - this.data.defaultAppearanceData = savedDefaultAppearance; - } else { - if (!this._isOffscreenCanvasSupported) { - warn("_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly."); - } - [defaultAppearance, fontSize, lineHeight] = this._computeFontSize(totalHeight - 2 * defaultPadding, totalWidth - 2 * defaultHPadding, value, font, lineCount); - } - let descent = font.descent; - if (isNaN(descent)) { - descent = BASELINE_FACTOR * lineHeight; - } else { - descent = Math.max(BASELINE_FACTOR * lineHeight, Math.abs(descent) * fontSize); - } - const defaultVPadding = Math.min(Math.floor((totalHeight - fontSize) / 2), defaultPadding); - const alignment = this.data.textAlignment; - if (this.data.multiLine) { - return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); - } - if (this.data.comb) { - return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); - } - const bottomPadding = defaultVPadding + descent; - if (alignment === 0 || alignment > 2) { - return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(defaultHPadding)} ${numberToString(bottomPadding)} Tm (${escapeString(encodedLines[0])}) Tj` + " ET Q EMC"; - } - const prevInfo = { - shift: 0 - }; - const renderedText = this._renderText(encodedLines[0], font, fontSize, totalWidth, alignment, prevInfo, defaultHPadding, bottomPadding); - return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 0 Tm ${renderedText}` + " ET Q EMC"; - } - static async _getFontData(evaluator, task, appearanceData, resources) { - const operatorList = new OperatorList(); - const initialState = { - font: null, - clone() { - return this; - } - }; - const { - fontName, - fontSize - } = appearanceData; - await evaluator.handleSetFont(resources, [fontName && Name.get(fontName), fontSize], null, operatorList, task, initialState, null); - return initialState.font; - } - _getTextWidth(text, font) { - return Math.sumPrecise(font.charsToGlyphs(text).map(g => g.width)) / 1000; - } - _computeFontSize(height, width, text, font, lineCount) { - let { - fontSize - } = this.data.defaultAppearanceData; - let lineHeight = (fontSize || 12) * LINE_FACTOR, - numberOfLines = Math.round(height / lineHeight); - if (!fontSize) { - const roundWithTwoDigits = x => Math.floor(x * 100) / 100; - if (lineCount === -1) { - const textWidth = this._getTextWidth(text, font); - fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth)); - numberOfLines = 1; - } else { - const lines = text.split(/\r\n?|\n/); - const cachedLines = []; - for (const line of lines) { - const encoded = font.encodeString(line).join(""); - const glyphs = font.charsToGlyphs(encoded); - const positions = font.getCharPositions(encoded); - cachedLines.push({ - line: encoded, - glyphs, - positions - }); - } - const isTooBig = fsize => { - let totalHeight = 0; - for (const cache of cachedLines) { - const chunks = this._splitLine(null, font, fsize, width, cache); - totalHeight += chunks.length * fsize; - if (totalHeight > height) { - return true; - } - } - return false; - }; - numberOfLines = Math.max(numberOfLines, lineCount); - while (true) { - lineHeight = height / numberOfLines; - fontSize = roundWithTwoDigits(lineHeight / LINE_FACTOR); - if (isTooBig(fontSize)) { - numberOfLines++; - continue; - } - break; - } - } - const { - fontName, - fontColor - } = this.data.defaultAppearanceData; - this._defaultAppearance = createDefaultAppearance({ - fontSize, - fontName, - fontColor - }); - } - return [this._defaultAppearance, fontSize, height / numberOfLines]; - } - _renderText(text, font, fontSize, totalWidth, alignment, prevInfo, hPadding, vPadding) { - let shift; - if (alignment === 1) { - const width = this._getTextWidth(text, font) * fontSize; - shift = (totalWidth - width) / 2; - } else if (alignment === 2) { - const width = this._getTextWidth(text, font) * fontSize; - shift = totalWidth - width - hPadding; - } else { - shift = hPadding; - } - const shiftStr = numberToString(shift - prevInfo.shift); - prevInfo.shift = shift; - vPadding = numberToString(vPadding); - return `${shiftStr} ${vPadding} Td (${escapeString(text)}) Tj`; - } - _getSaveFieldResources(xref) { - const { - localResources, - appearanceResources, - acroFormResources - } = this._fieldResources; - const fontName = this.data.defaultAppearanceData?.fontName; - if (!fontName) { - return localResources || Dict.empty; - } - for (const resources of [localResources, appearanceResources]) { - if (resources instanceof Dict) { - const localFont = resources.get("Font"); - if (localFont instanceof Dict && localFont.has(fontName)) { - return resources; - } - } - } - if (acroFormResources instanceof Dict) { - const acroFormFont = acroFormResources.get("Font"); - if (acroFormFont instanceof Dict && acroFormFont.has(fontName)) { - const subFontDict = new Dict(xref); - subFontDict.set(fontName, acroFormFont.getRaw(fontName)); - const subResourcesDict = new Dict(xref); - subResourcesDict.set("Font", subFontDict); - return Dict.merge({ - xref, - dictArray: [subResourcesDict, localResources], - mergeSubDicts: true - }); - } - } - return localResources || Dict.empty; - } - getFieldObject() { - return null; - } -} -class TextWidgetAnnotation extends WidgetAnnotation { - constructor(params) { - super(params); - const { - dict - } = params; - if (dict.has("PMD")) { - this.flags |= AnnotationFlag.HIDDEN; - this.data.hidden = true; - warn("Barcodes are not supported"); - } - this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; - this._hasText = true; - if (typeof this.data.fieldValue !== "string") { - this.data.fieldValue = ""; - } - let alignment = getInheritableProperty({ - dict, - key: "Q" - }); - if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) { - alignment = null; - } - this.data.textAlignment = alignment; - let maximumLength = getInheritableProperty({ - dict, - key: "MaxLen" - }); - if (!Number.isInteger(maximumLength) || maximumLength < 0) { - maximumLength = 0; - } - this.data.maxLen = maximumLength; - this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); - this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.data.multiLine && !this.data.password && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; - this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); - const { - data: { - actions - } - } = this; - if (!actions) { - return; - } - const AFDateTime = /^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\(['"]?([^'"]+)['"]?\);$/; - let canUseHTMLDateTime = false; - if (actions.Format?.length === 1 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Format[0]) && AFDateTime.test(actions.Keystroke[0]) || actions.Format?.length === 0 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Keystroke[0]) || actions.Keystroke?.length === 0 && actions.Format?.length === 1 && AFDateTime.test(actions.Format[0])) { - canUseHTMLDateTime = true; - } - const actionsToVisit = []; - if (actions.Format) { - actionsToVisit.push(...actions.Format); - } - if (actions.Keystroke) { - actionsToVisit.push(...actions.Keystroke); - } - if (canUseHTMLDateTime) { - delete actions.Keystroke; - actions.Format = actionsToVisit; - } - for (const formatAction of actionsToVisit) { - const m = formatAction.match(AFDateTime); - if (!m) { - continue; - } - const isDate = m[1] === "Date"; - let format = m[2]; - const num = parseInt(format, 10); - if (!isNaN(num) && Math.floor(Math.log10(num)) + 1 === m[2].length) { - format = (isDate ? DateFormats : TimeFormats)[num] ?? format; - } - this.data.datetimeFormat = format; - if (!canUseHTMLDateTime) { - break; - } - if (isDate) { - if (/HH|MM|ss|h/.test(format)) { - this.data.datetimeType = "datetime-local"; - this.data.timeStep = /ss/.test(format) ? 1 : 60; - } else { - this.data.datetimeType = "date"; - } - break; - } - this.data.datetimeType = "time"; - this.data.timeStep = /ss/.test(format) ? 1 : 60; - break; - } - } - get hasTextContent() { - return !!this.appearance && !this._needAppearances; - } - _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { - const combWidth = width / this.data.maxLen; - const colors = this.getBorderAndBackgroundAppearances(annotationStorage); - const buf = []; - const positions = font.getCharPositions(text); - for (const [start, end] of positions) { - buf.push(`(${escapeString(text.substring(start, end))}) Tj`); - } - const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); - return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; - } - _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { - const buf = []; - const totalWidth = width - 2 * hPadding; - const prevInfo = { - shift: 0 - }; - for (let i = 0, ii = lines.length; i < ii; i++) { - const line = lines[i]; - const chunks = this._splitLine(line, font, fontSize, totalWidth); - for (let j = 0, jj = chunks.length; j < jj; j++) { - const chunk = chunks[j]; - const vShift = i === 0 && j === 0 ? -vPadding - (lineHeight - descent) : -lineHeight; - buf.push(this._renderText(chunk, font, fontSize, width, alignment, prevInfo, hPadding, vShift)); - } - } - const colors = this.getBorderAndBackgroundAppearances(annotationStorage); - const renderedText = buf.join("\n"); - return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 0 ${numberToString(height)} Tm ${renderedText}` + " ET Q EMC"; - } - _splitLine(line, font, fontSize, width, cache = {}) { - line = cache.line || line; - const glyphs = cache.glyphs || font.charsToGlyphs(line); - if (glyphs.length <= 1) { - return [line]; - } - const positions = cache.positions || font.getCharPositions(line); - const scale = fontSize / 1000; - const chunks = []; - let lastSpacePosInStringStart = -1, - lastSpacePosInStringEnd = -1, - lastSpacePos = -1, - startChunk = 0, - currentWidth = 0; - for (let i = 0, ii = glyphs.length; i < ii; i++) { - const [start, end] = positions[i]; - const glyph = glyphs[i]; - const glyphWidth = glyph.width * scale; - if (glyph.unicode === " ") { - if (currentWidth + glyphWidth > width) { - chunks.push(line.substring(startChunk, start)); - startChunk = start; - currentWidth = glyphWidth; - lastSpacePosInStringStart = -1; - lastSpacePos = -1; - } else { - currentWidth += glyphWidth; - lastSpacePosInStringStart = start; - lastSpacePosInStringEnd = end; - lastSpacePos = i; - } - } else if (currentWidth + glyphWidth > width) { - if (lastSpacePosInStringStart !== -1) { - chunks.push(line.substring(startChunk, lastSpacePosInStringEnd)); - startChunk = lastSpacePosInStringEnd; - i = lastSpacePos + 1; - lastSpacePosInStringStart = -1; - currentWidth = 0; - } else { - chunks.push(line.substring(startChunk, start)); - startChunk = start; - currentWidth = glyphWidth; - } - } else { - currentWidth += glyphWidth; - } - } - if (startChunk < line.length) { - chunks.push(line.substring(startChunk, line.length)); - } - return chunks; - } - async extractTextContent(evaluator, task, viewBox) { - await super.extractTextContent(evaluator, task, viewBox); - const text = this.data.textContent; - if (!text) { - return; - } - const allText = text.join("\n"); - if (allText === this.data.fieldValue) { - return; - } - const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+"); - if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { - this.data.textContent = this.data.fieldValue.split("\n"); - } - } - getFieldObject() { - return { - id: this.data.id, - value: this.data.fieldValue, - defaultValue: this.data.defaultFieldValue || "", - multiline: this.data.multiLine, - password: this.data.password, - charLimit: this.data.maxLen, - comb: this.data.comb, - editable: !this.data.readOnly, - hidden: this.data.hidden, - name: this.data.fieldName, - rect: this.data.rect, - actions: this.data.actions, - page: this.data.pageIndex, - strokeColor: this.data.borderColor, - fillColor: this.data.backgroundColor, - rotation: this.rotation, - datetimeFormat: this.data.datetimeFormat, - hasDatetimeHTML: !!this.data.datetimeType, - type: "text" - }; - } -} -class ButtonWidgetAnnotation extends WidgetAnnotation { - constructor(params) { - super(params); - this.checkedAppearance = null; - this.uncheckedAppearance = null; - const isRadio = this.hasFieldFlag(AnnotationFieldFlag.RADIO), - isPushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); - this.data.checkBox = !isRadio && !isPushButton; - this.data.radioButton = isRadio && !isPushButton; - this.data.pushButton = isPushButton; - this.data.isTooltipOnly = false; - if (this.data.checkBox) { - this._processCheckBox(params); - } else if (this.data.radioButton) { - this._processRadioButton(params); - } else if (this.data.pushButton) { - this.data.hasOwnCanvas = true; - this.data.noHTML = false; - this._processPushButton(params); - } else { - warn("Invalid field flags for button widget annotation"); - } - } - async getOperatorList(evaluator, task, intent, annotationStorage) { - if (this.data.pushButton) { - return super.getOperatorList(evaluator, task, intent, false, annotationStorage); - } - let value = null; - let rotation = null; - if (annotationStorage) { - const storageEntry = annotationStorage.get(this.data.id); - value = storageEntry ? storageEntry.value : null; - rotation = storageEntry ? storageEntry.rotation : null; - } - if (value === null && this.appearance) { - return super.getOperatorList(evaluator, task, intent, annotationStorage); - } - if (value === null || value === undefined) { - value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; - } - const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; - if (appearance) { - const savedAppearance = this.appearance; - const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX); - if (rotation) { - appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); - } - this.appearance = appearance; - const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); - this.appearance = savedAppearance; - appearance.dict.set("Matrix", savedMatrix); - return operatorList; - } - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; - } - async save(evaluator, task, annotationStorage, changes) { - if (this.data.checkBox) { - this._saveCheckbox(evaluator, task, annotationStorage, changes); - return; - } - if (this.data.radioButton) { - this._saveRadioButton(evaluator, task, annotationStorage, changes); - } - } - async _saveCheckbox(evaluator, task, annotationStorage, changes) { - if (!annotationStorage) { - return; - } - const storageEntry = annotationStorage.get(this.data.id); - const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); - let rotation = storageEntry?.rotation, - value = storageEntry?.value; - if (rotation === undefined && flags === undefined) { - if (value === undefined) { - return; - } - const defaultValue = this.data.fieldValue === this.data.exportValue; - if (defaultValue === value) { - return; - } - } - let dict = evaluator.xref.fetchIfRef(this.ref); - if (!(dict instanceof Dict)) { - return; - } - dict = dict.clone(); - if (rotation === undefined) { - rotation = this.rotation; - } - if (value === undefined) { - value = this.data.fieldValue === this.data.exportValue; - } - const xfa = { - path: this.data.fieldName, - value: value ? this.data.exportValue : "" - }; - const name = Name.get(value ? this.data.exportValue : "Off"); - this.setValue(dict, name, evaluator.xref, changes); - dict.set("AS", name); - dict.set("M", `D:${getModificationDate()}`); - if (flags !== undefined) { - dict.set("F", flags); - } - const maybeMK = this._getMKDict(rotation); - if (maybeMK) { - dict.set("MK", maybeMK); - } - changes.put(this.ref, { - data: dict, - xfa, - needAppearances: false - }); - } - async _saveRadioButton(evaluator, task, annotationStorage, changes) { - if (!annotationStorage) { - return; - } - const storageEntry = annotationStorage.get(this.data.id); - const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); - let rotation = storageEntry?.rotation, - value = storageEntry?.value; - if (rotation === undefined && flags === undefined) { - if (value === undefined) { - return; - } - const defaultValue = this.data.fieldValue === this.data.buttonValue; - if (defaultValue === value) { - return; - } - } - let dict = evaluator.xref.fetchIfRef(this.ref); - if (!(dict instanceof Dict)) { - return; - } - dict = dict.clone(); - if (value === undefined) { - value = this.data.fieldValue === this.data.buttonValue; - } - if (rotation === undefined) { - rotation = this.rotation; - } - const xfa = { - path: this.data.fieldName, - value: value ? this.data.buttonValue : "" - }; - const name = Name.get(value ? this.data.buttonValue : "Off"); - if (value) { - this.setValue(dict, name, evaluator.xref, changes); - } - dict.set("AS", name); - dict.set("M", `D:${getModificationDate()}`); - if (flags !== undefined) { - dict.set("F", flags); - } - const maybeMK = this._getMKDict(rotation); - if (maybeMK) { - dict.set("MK", maybeMK); - } - changes.put(this.ref, { - data: dict, - xfa, - needAppearances: false - }); - } - _getDefaultCheckedAppearance(params, type) { - const { - width, - height - } = this; - const bbox = [0, 0, width, height]; - const FONT_RATIO = 0.8; - const fontSize = Math.min(width, height) * FONT_RATIO; - let metrics, char; - if (type === "check") { - metrics = { - width: 0.755 * fontSize, - height: 0.705 * fontSize - }; - char = "\x33"; - } else if (type === "disc") { - metrics = { - width: 0.791 * fontSize, - height: 0.705 * fontSize - }; - char = "\x6C"; - } else { - unreachable(`_getDefaultCheckedAppearance - unsupported type: ${type}`); - } - const xShift = numberToString((width - metrics.width) / 2); - const yShift = numberToString((height - metrics.height) / 2); - const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; - const appearanceStreamDict = new Dict(params.xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", bbox); - appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); - appearanceStreamDict.set("Length", appearance.length); - const resources = new Dict(params.xref); - const font = new Dict(params.xref); - font.set("PdfJsZaDb", this.fallbackFontDict); - resources.set("Font", font); - appearanceStreamDict.set("Resources", resources); - this.checkedAppearance = new StringStream(appearance); - this.checkedAppearance.dict = appearanceStreamDict; - this._streams.push(this.checkedAppearance); - } - _processCheckBox(params) { - const customAppearance = params.dict.get("AP"); - if (!(customAppearance instanceof Dict)) { - return; - } - const normalAppearance = customAppearance.get("N"); - if (!(normalAppearance instanceof Dict)) { - return; - } - const asValue = this._decodeFormValue(params.dict.get("AS")); - if (typeof asValue === "string") { - this.data.fieldValue = asValue; - } - const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; - const exportValues = this._decodeFormValue(normalAppearance.getKeys()); - if (exportValues.length === 0) { - exportValues.push("Off", yes); - } else if (exportValues.length === 1) { - if (exportValues[0] === "Off") { - exportValues.push(yes); - } else { - exportValues.unshift("Off"); - } - } else if (exportValues.includes(yes)) { - exportValues.length = 0; - exportValues.push("Off", yes); - } else { - const otherYes = exportValues.find(v => v !== "Off"); - exportValues.length = 0; - exportValues.push("Off", otherYes); - } - if (!exportValues.includes(this.data.fieldValue)) { - this.data.fieldValue = "Off"; - } - this.data.exportValue = exportValues[1]; - const checkedAppearance = normalAppearance.get(this.data.exportValue); - this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; - const uncheckedAppearance = normalAppearance.get("Off"); - this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; - if (this.checkedAppearance) { - this._streams.push(this.checkedAppearance); - } else { - this._getDefaultCheckedAppearance(params, "check"); - } - if (this.uncheckedAppearance) { - this._streams.push(this.uncheckedAppearance); - } - this._fallbackFontDict = this.fallbackFontDict; - if (this.data.defaultFieldValue === null) { - this.data.defaultFieldValue = "Off"; - } - } - _processRadioButton(params) { - this.data.buttonValue = null; - const fieldParent = params.dict.get("Parent"); - if (fieldParent instanceof Dict) { - this.parent = params.dict.getRaw("Parent"); - const fieldParentValue = fieldParent.get("V"); - if (fieldParentValue instanceof Name) { - this.data.fieldValue = this._decodeFormValue(fieldParentValue); - } - } - const appearanceStates = params.dict.get("AP"); - if (!(appearanceStates instanceof Dict)) { - return; - } - const normalAppearance = appearanceStates.get("N"); - if (!(normalAppearance instanceof Dict)) { - return; - } - for (const key of normalAppearance.getKeys()) { - if (key !== "Off") { - this.data.buttonValue = this._decodeFormValue(key); - break; - } - } - const checkedAppearance = normalAppearance.get(this.data.buttonValue); - this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; - const uncheckedAppearance = normalAppearance.get("Off"); - this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; - if (this.checkedAppearance) { - this._streams.push(this.checkedAppearance); - } else { - this._getDefaultCheckedAppearance(params, "disc"); - } - if (this.uncheckedAppearance) { - this._streams.push(this.uncheckedAppearance); - } - this._fallbackFontDict = this.fallbackFontDict; - if (this.data.defaultFieldValue === null) { - this.data.defaultFieldValue = "Off"; - } - } - _processPushButton(params) { - const { - dict, - annotationGlobals - } = params; - if (!dict.has("A") && !dict.has("AA") && !this.data.alternativeText) { - warn("Push buttons without action dictionaries are not supported"); - return; - } - this.data.isTooltipOnly = !dict.has("A") && !dict.has("AA"); - Catalog.parseDestDictionary({ - destDict: dict, - resultObj: this.data, - docBaseUrl: annotationGlobals.baseUrl, - docAttachments: annotationGlobals.attachments - }); - } - getFieldObject() { - let type = "button"; - let exportValues; - if (this.data.checkBox) { - type = "checkbox"; - exportValues = this.data.exportValue; - } else if (this.data.radioButton) { - type = "radiobutton"; - exportValues = this.data.buttonValue; - } - return { - id: this.data.id, - value: this.data.fieldValue || "Off", - defaultValue: this.data.defaultFieldValue, - exportValues, - editable: !this.data.readOnly, - name: this.data.fieldName, - rect: this.data.rect, - hidden: this.data.hidden, - actions: this.data.actions, - page: this.data.pageIndex, - strokeColor: this.data.borderColor, - fillColor: this.data.backgroundColor, - rotation: this.rotation, - type - }; - } - get fallbackFontDict() { - const dict = new Dict(); - dict.setIfName("BaseFont", "ZapfDingbats"); - dict.setIfName("Type", "FallbackType"); - dict.setIfName("Subtype", "FallbackType"); - dict.setIfName("Encoding", "ZapfDingbatsEncoding"); - return shadow(this, "fallbackFontDict", dict); - } -} -class ChoiceWidgetAnnotation extends WidgetAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.indices = dict.getArray("I"); - this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; - this.data.options = []; - const options = getInheritableProperty({ - dict, - key: "Opt" - }); - if (Array.isArray(options)) { - for (let i = 0, ii = options.length; i < ii; i++) { - const option = xref.fetchIfRef(options[i]); - const isOptionArray = Array.isArray(option); - this.data.options[i] = { - exportValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[0]) : option), - displayValue: this._decodeFormValue(isOptionArray ? xref.fetchIfRef(option[1]) : option) - }; - } - } - if (!this.hasIndices) { - if (typeof this.data.fieldValue === "string") { - this.data.fieldValue = [this.data.fieldValue]; - } else { - this.data.fieldValue ||= []; - } - } else { - this.data.fieldValue = []; - const ii = this.data.options.length; - for (const i of this.indices) { - if (Number.isInteger(i) && i >= 0 && i < ii) { - this.data.fieldValue.push(this.data.options[i].exportValue); - } - } - } - if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { - this.data.options = this.data.fieldValue.map(value => ({ - exportValue: value, - displayValue: value - })); - } - this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); - this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); - this._hasText = true; - } - getFieldObject() { - const type = this.data.combo ? "combobox" : "listbox"; - const value = this.data.fieldValue.length > 0 ? this.data.fieldValue[0] : null; - return { - id: this.data.id, - value, - defaultValue: this.data.defaultFieldValue, - editable: !this.data.readOnly, - name: this.data.fieldName, - rect: this.data.rect, - numItems: this.data.fieldValue.length, - multipleSelection: this.data.multiSelect, - hidden: this.data.hidden, - actions: this.data.actions, - items: this.data.options, - page: this.data.pageIndex, - strokeColor: this.data.borderColor, - fillColor: this.data.backgroundColor, - rotation: this.rotation, - type - }; - } - amendSavedDict(annotationStorage, dict) { - if (!this.hasIndices) { - return; - } - let values = annotationStorage?.get(this.data.id)?.value; - if (!Array.isArray(values)) { - values = [values]; - } - const indices = []; - const { - options - } = this.data; - for (let i = 0, j = 0, ii = options.length; i < ii; i++) { - if (options[i].exportValue === values[j]) { - indices.push(i); - j += 1; - } - } - dict.set("I", indices); - } - async _getAppearance(evaluator, task, intent, annotationStorage) { - if (this.data.combo) { - return super._getAppearance(evaluator, task, intent, annotationStorage); - } - let exportedValue, rotation; - const storageEntry = annotationStorage?.get(this.data.id); - if (storageEntry) { - rotation = storageEntry.rotation; - exportedValue = storageEntry.value; - } - if (rotation === undefined && exportedValue === undefined && !this._needAppearances) { - return null; - } - if (exportedValue === undefined) { - exportedValue = this.data.fieldValue; - } else if (!Array.isArray(exportedValue)) { - exportedValue = [exportedValue]; - } - const defaultPadding = 1; - const defaultHPadding = 2; - let { - width: totalWidth, - height: totalHeight - } = this; - if (rotation === 90 || rotation === 270) { - [totalWidth, totalHeight] = [totalHeight, totalWidth]; - } - const lineCount = this.data.options.length; - const valueIndices = []; - for (let i = 0; i < lineCount; i++) { - const { - exportValue - } = this.data.options[i]; - if (exportedValue.includes(exportValue)) { - valueIndices.push(i); - } - } - if (!this._defaultAppearance) { - this.data.defaultAppearanceData = parseDefaultAppearance(this._defaultAppearance = "/Helvetica 0 Tf 0 g"); - } - const font = await WidgetAnnotation._getFontData(evaluator, task, this.data.defaultAppearanceData, this._fieldResources.mergedResources); - let defaultAppearance; - let { - fontSize - } = this.data.defaultAppearanceData; - if (!fontSize) { - const lineHeight = (totalHeight - defaultPadding) / lineCount; - let lineWidth = -1; - let value; - for (const { - displayValue - } of this.data.options) { - const width = this._getTextWidth(displayValue, font); - if (width > lineWidth) { - lineWidth = width; - value = displayValue; - } - } - [defaultAppearance, fontSize] = this._computeFontSize(lineHeight, totalWidth - 2 * defaultHPadding, value, font, -1); - } else { - defaultAppearance = this._defaultAppearance; - } - const lineHeight = fontSize * LINE_FACTOR; - const vPadding = (lineHeight - fontSize) / 2; - const numberOfVisibleLines = Math.floor(totalHeight / lineHeight); - let firstIndex = 0; - if (valueIndices.length > 0) { - const minIndex = Math.min(...valueIndices); - const maxIndex = Math.max(...valueIndices); - firstIndex = Math.max(0, maxIndex - numberOfVisibleLines + 1); - if (firstIndex > minIndex) { - firstIndex = minIndex; - } - } - const end = Math.min(firstIndex + numberOfVisibleLines + 1, lineCount); - const buf = ["/Tx BMC q", `1 1 ${totalWidth} ${totalHeight} re W n`]; - if (valueIndices.length) { - buf.push("0.600006 0.756866 0.854904 rg"); - for (const index of valueIndices) { - if (firstIndex <= index && index < end) { - buf.push(`1 ${totalHeight - (index - firstIndex + 1) * lineHeight} ${totalWidth} ${lineHeight} re f`); - } - } - } - buf.push("BT", defaultAppearance, `1 0 0 1 0 ${totalHeight} Tm`); - const prevInfo = { - shift: 0 - }; - for (let i = firstIndex; i < end; i++) { - const { - displayValue - } = this.data.options[i]; - const vpadding = i === firstIndex ? vPadding : 0; - buf.push(this._renderText(displayValue, font, fontSize, totalWidth, 0, prevInfo, defaultHPadding, -lineHeight + vpadding)); - } - buf.push("ET Q EMC"); - return buf.join("\n"); - } -} -class SignatureWidgetAnnotation extends WidgetAnnotation { - constructor(params) { - super(params); - this.data.fieldValue = null; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = !this.data.hasOwnCanvas; - } - getFieldObject() { - return { - id: this.data.id, - value: null, - page: this.data.pageIndex, - type: "signature" - }; - } -} -class TextAnnotation extends MarkupAnnotation { - constructor(params) { - const DEFAULT_ICON_SIZE = 22; - super(params); - this.data.noRotate = true; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - const { - dict - } = params; - this.data.annotationType = AnnotationType.TEXT; - if (this.data.hasAppearance) { - this.data.name = "NoIcon"; - } else { - this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; - this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; - this.data.name = dict.has("Name") ? dict.get("Name").name : "Note"; - } - if (dict.has("State")) { - this.data.state = dict.get("State") || null; - this.data.stateModel = dict.get("StateModel") || null; - } else { - this.data.state = null; - this.data.stateModel = null; - } - } -} -class LinkAnnotation extends Annotation { - constructor(params) { - super(params); - const { - dict, - annotationGlobals - } = params; - this.data.annotationType = AnnotationType.LINK; - this.data.noHTML = false; - const quadPoints = getQuadPoints(dict, this.rectangle); - if (quadPoints) { - this.data.quadPoints = quadPoints; - } - this.data.borderColor ||= this.data.color; - Catalog.parseDestDictionary({ - destDict: dict, - resultObj: this.data, - docBaseUrl: annotationGlobals.baseUrl, - docAttachments: annotationGlobals.attachments - }); - } - get overlaysTextContent() { - return true; - } -} -class PopupAnnotation extends Annotation { - constructor(params) { - super(params); - const { - dict - } = params; - this.data.annotationType = AnnotationType.POPUP; - this.data.noHTML = false; - if (this.width === 0 || this.height === 0) { - this.data.rect = null; - } - let parentItem = dict.get("Parent"); - if (!parentItem) { - warn("Popup annotation has a missing or invalid parent annotation."); - return; - } - this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); - this.data.creationDate = parentItem.get("CreationDate") || ""; - const rt = parentItem.get("RT"); - if (isName(rt, AnnotationReplyType.GROUP)) { - parentItem = parentItem.get("IRT"); - } - if (!parentItem.has("M")) { - this.data.modificationDate = null; - } else { - this.setModificationDate(parentItem.get("M")); - this.data.modificationDate = this.modificationDate; - } - if (!parentItem.has("C")) { - this.data.color = null; - } else { - this.setColor(parentItem.getArray("C")); - this.data.color = this.color; - } - if (!this.viewable) { - const parentFlags = parentItem.get("F"); - if (this._isViewable(parentFlags)) { - this.setFlags(parentFlags); - } - } - this.setTitle(parentItem.get("T")); - this.data.titleObj = this._title; - this.setContents(parentItem.get("Contents")); - this.data.contentsObj = this._contents; - if (parentItem.has("RC")) { - this.data.richText = XFAFactory.getRichTextAsHtml(parentItem.get("RC")); - } - this.data.open = !!dict.get("Open"); - } - static createNewDict(annotation, xref, _params) { - const { - oldAnnotation, - rect, - parent - } = annotation; - const popup = oldAnnotation || new Dict(xref); - popup.setIfNotExists("Type", Name.get("Annot")); - popup.setIfNotExists("Subtype", Name.get("Popup")); - popup.setIfNotExists("Open", false); - popup.setIfArray("Rect", rect); - popup.set("Parent", parent); - return popup; - } - static async createNewAppearanceStream(annotation, xref, params) { - return null; - } -} -class FreeTextAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - this.data.hasOwnCanvas = this.data.noRotate; - this.data.isEditable = !this.data.noHTML; - this.data.noHTML = false; - const { - annotationGlobals, - evaluatorOptions, - xref - } = params; - this.data.annotationType = AnnotationType.FREETEXT; - this.setDefaultAppearance(params); - this._hasAppearance = !!this.appearance; - if (this._hasAppearance) { - const { - fontColor, - fontSize - } = parseAppearanceStream(this.appearance, evaluatorOptions, xref, annotationGlobals.globalColorSpaceCache); - this.data.defaultAppearanceData.fontColor = fontColor; - this.data.defaultAppearanceData.fontSize = fontSize || 10; - } else { - this.data.defaultAppearanceData.fontSize ||= 10; - const { - fontColor, - fontSize - } = this.data.defaultAppearanceData; - if (this._contents.str) { - this.data.textContent = this._contents.str.split(/\r\n?|\n/).map(line => line.trimEnd()); - const { - coords, - bbox, - matrix - } = FakeUnicodeFont.getFirstPositionInfo(this.rectangle, this.rotation, fontSize); - this.data.textPosition = this._transformPoint(coords, bbox, matrix); - } - if (this._isOffscreenCanvasSupported) { - const strokeAlpha = params.dict.get("CA"); - const fakeUnicodeFont = new FakeUnicodeFont(xref, "sans-serif"); - this.appearance = fakeUnicodeFont.createAppearance(this._contents.str, this.rectangle, this.rotation, fontSize, fontColor, strokeAlpha); - this._streams.push(this.appearance); - } else { - warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly."); - } - } - } - get hasTextContent() { - return this._hasAppearance; - } - static createNewDict(annotation, xref, { - apRef, - ap - }) { - const { - color, - date, - fontSize, - oldAnnotation, - rect, - rotation, - user, - value - } = annotation; - const freetext = oldAnnotation || new Dict(xref); - freetext.setIfNotExists("Type", Name.get("Annot")); - freetext.setIfNotExists("Subtype", Name.get("FreeText")); - freetext.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); - if (oldAnnotation) { - freetext.delete("RC"); - } - freetext.setIfArray("Rect", rect); - const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; - freetext.set("DA", da); - freetext.setIfDefined("Contents", stringToAsciiOrUTF16BE(value)); - freetext.setIfNotExists("F", 4); - freetext.setIfNotExists("Border", [0, 0, 0]); - freetext.setIfNumber("Rotate", rotation); - freetext.setIfDefined("T", stringToAsciiOrUTF16BE(user)); - if (apRef || ap) { - const n = new Dict(xref); - freetext.set("AP", n); - n.set("N", apRef || ap); - } - return freetext; - } - static async createNewAppearanceStream(annotation, xref, params) { - const { - baseFontRef, - evaluator, - task - } = params; - const { - color, - fontSize, - rect, - rotation, - value - } = annotation; - if (!color) { - return null; - } - const resources = new Dict(xref); - const font = new Dict(xref); - if (baseFontRef) { - font.set("Helv", baseFontRef); - } else { - const baseFont = new Dict(xref); - baseFont.setIfName("BaseFont", "Helvetica"); - baseFont.setIfName("Type", "Font"); - baseFont.setIfName("Subtype", "Type1"); - baseFont.setIfName("Encoding", "WinAnsiEncoding"); - font.set("Helv", baseFont); - } - resources.set("Font", font); - const helv = await WidgetAnnotation._getFontData(evaluator, task, { - fontName: "Helv", - fontSize - }, resources); - const [x1, y1, x2, y2] = rect; - let w = x2 - x1; - let h = y2 - y1; - if (rotation % 180 !== 0) { - [w, h] = [h, w]; - } - const lines = value.split("\n"); - const scale = fontSize / 1000; - let totalWidth = -Infinity; - const encodedLines = []; - for (let line of lines) { - const encoded = helv.encodeString(line); - if (encoded.length > 1) { - return null; - } - line = encoded.join(""); - encodedLines.push(line); - let lineWidth = 0; - const glyphs = helv.charsToGlyphs(line); - for (const glyph of glyphs) { - lineWidth += glyph.width * scale; - } - totalWidth = Math.max(totalWidth, lineWidth); - } - let hscale = 1; - if (totalWidth > w) { - hscale = w / totalWidth; - } - let vscale = 1; - const lineHeight = LINE_FACTOR * fontSize; - const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; - const totalHeight = lineHeight * lines.length; - if (totalHeight > h) { - vscale = h / totalHeight; - } - const fscale = Math.min(hscale, vscale); - const newFontSize = fontSize * fscale; - let firstPoint, clipBox, matrix; - switch (rotation) { - case 0: - matrix = [1, 0, 0, 1]; - clipBox = [rect[0], rect[1], w, h]; - firstPoint = [rect[0], rect[3] - lineAscent]; - break; - case 90: - matrix = [0, 1, -1, 0]; - clipBox = [rect[1], -rect[2], w, h]; - firstPoint = [rect[1], -rect[0] - lineAscent]; - break; - case 180: - matrix = [-1, 0, 0, -1]; - clipBox = [-rect[2], -rect[3], w, h]; - firstPoint = [-rect[2], -rect[1] - lineAscent]; - break; - case 270: - matrix = [0, -1, 1, 0]; - clipBox = [-rect[3], rect[0], w, h]; - firstPoint = [-rect[3], rect[2] - lineAscent]; - break; - } - const buffer = ["q", `${matrix.join(" ")} 0 0 cm`, `${clipBox.join(" ")} re W n`, `BT`, `${getPdfColor(color, true)}`, `0 Tc /Helv ${numberToString(newFontSize)} Tf`]; - buffer.push(`${firstPoint.join(" ")} Td (${escapeString(encodedLines[0])}) Tj`); - const vShift = numberToString(lineHeight); - for (let i = 1, ii = encodedLines.length; i < ii; i++) { - const line = encodedLines[i]; - buffer.push(`0 -${vShift} Td (${escapeString(line)}) Tj`); - } - buffer.push("ET", "Q"); - const appearance = buffer.join("\n"); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", rect); - appearanceStreamDict.set("Resources", resources); - appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } -} -class LineAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.LINE; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); - this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); - this.setLineEndings(dict.getArray("LE")); - this.data.lineEndings = this.lineEndings; - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = getPdfColorArray(interiorColor); - const fillAlpha = fillColor ? strokeAlpha : null; - const borderWidth = this.borderStyle.width || 1, - borderAdjust = 2 * borderWidth; - const bbox = [this.data.lineCoordinates[0] - borderAdjust, this.data.lineCoordinates[1] - borderAdjust, this.data.lineCoordinates[2] + borderAdjust, this.data.lineCoordinates[3] + borderAdjust]; - if (!Util.intersect(this.rectangle, bbox)) { - this.rectangle = bbox; - } - this._setDefaultAppearance({ - xref, - extra: `${borderWidth} w`, - strokeColor, - fillColor, - strokeAlpha, - fillAlpha, - pointsCallback: (buffer, points) => { - buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); - return [points[0] - borderWidth, points[7] - borderWidth, points[2] + borderWidth, points[3] + borderWidth]; - } - }); - } - } -} -class SquareAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.SQUARE; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = getPdfColorArray(interiorColor); - const fillAlpha = fillColor ? strokeAlpha : null; - if (this.borderStyle.width === 0 && !fillColor) { - return; - } - this._setDefaultAppearance({ - xref, - extra: `${this.borderStyle.width} w`, - strokeColor, - fillColor, - strokeAlpha, - fillAlpha, - pointsCallback: (buffer, points) => { - const x = points[4] + this.borderStyle.width / 2; - const y = points[5] + this.borderStyle.width / 2; - const width = points[6] - points[4] - this.borderStyle.width; - const height = points[3] - points[7] - this.borderStyle.width; - buffer.push(`${x} ${y} ${width} ${height} re`); - if (fillColor) { - buffer.push("B"); - } else { - buffer.push("S"); - } - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } -} -class CircleAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.CIRCLE; - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = getPdfColorArray(interiorColor); - const fillAlpha = fillColor ? strokeAlpha : null; - if (this.borderStyle.width === 0 && !fillColor) { - return; - } - const controlPointsDistance = 4 / 3 * Math.tan(Math.PI / (2 * 4)); - this._setDefaultAppearance({ - xref, - extra: `${this.borderStyle.width} w`, - strokeColor, - fillColor, - strokeAlpha, - fillAlpha, - pointsCallback: (buffer, points) => { - const x0 = points[0] + this.borderStyle.width / 2; - const y0 = points[1] - this.borderStyle.width / 2; - const x1 = points[6] - this.borderStyle.width / 2; - const y1 = points[7] + this.borderStyle.width / 2; - const xMid = x0 + (x1 - x0) / 2; - const yMid = y0 + (y1 - y0) / 2; - const xOffset = (x1 - x0) / 2 * controlPointsDistance; - const yOffset = (y1 - y0) / 2 * controlPointsDistance; - buffer.push(`${xMid} ${y1} m`, `${xMid + xOffset} ${y1} ${x1} ${yMid + yOffset} ${x1} ${yMid} c`, `${x1} ${yMid - yOffset} ${xMid + xOffset} ${y0} ${xMid} ${y0} c`, `${xMid - xOffset} ${y0} ${x0} ${yMid - yOffset} ${x0} ${yMid} c`, `${x0} ${yMid + yOffset} ${xMid - xOffset} ${y1} ${xMid} ${y1} c`, "h"); - if (fillColor) { - buffer.push("B"); - } else { - buffer.push("S"); - } - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } -} -class PolylineAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.POLYLINE; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - this.data.vertices = null; - if (!(this instanceof PolygonAnnotation)) { - this.setLineEndings(dict.getArray("LE")); - this.data.lineEndings = this.lineEndings; - } - const rawVertices = dict.getArray("Vertices"); - if (!isNumberArray(rawVertices, null)) { - return; - } - const vertices = this.data.vertices = Float32Array.from(rawVertices); - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - let fillColor = getRgbColor(dict.getArray("IC"), null); - if (fillColor) { - fillColor = getPdfColorArray(fillColor); - } - let operator; - if (fillColor) { - if (this.color) { - operator = fillColor.every((c, i) => c === strokeColor[i]) ? "f" : "B"; - } else { - operator = "f"; - } - } else { - operator = "S"; - } - const borderWidth = this.borderStyle.width || 1, - borderAdjust = 2 * borderWidth; - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (let i = 0, ii = vertices.length; i < ii; i += 2) { - Util.rectBoundingBox(vertices[i] - borderAdjust, vertices[i + 1] - borderAdjust, vertices[i] + borderAdjust, vertices[i + 1] + borderAdjust, bbox); - } - if (!Util.intersect(this.rectangle, bbox)) { - this.rectangle = bbox; - } - this._setDefaultAppearance({ - xref, - extra: `${borderWidth} w`, - strokeColor, - strokeAlpha, - fillColor, - fillAlpha: fillColor ? strokeAlpha : null, - pointsCallback: (buffer, points) => { - for (let i = 0, ii = vertices.length; i < ii; i += 2) { - buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); - } - buffer.push(operator); - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } -} -class PolygonAnnotation extends PolylineAnnotation { - constructor(params) { - super(params); - this.data.annotationType = AnnotationType.POLYGON; - } -} -class CaretAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - this.data.annotationType = AnnotationType.CARET; - } -} -class InkAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.INK; - this.data.inkLists = []; - this.data.isEditable = !this.data.noHTML; - this.data.noHTML = false; - this.data.opacity = dict.get("CA") || 1; - const rawInkLists = dict.getArray("InkList"); - if (!Array.isArray(rawInkLists)) { - return; - } - for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { - if (!Array.isArray(rawInkLists[i])) { - continue; - } - const inkList = new Float32Array(rawInkLists[i].length); - this.data.inkLists.push(inkList); - for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { - const x = xref.fetchIfRef(rawInkLists[i][j]), - y = xref.fetchIfRef(rawInkLists[i][j + 1]); - if (typeof x === "number" && typeof y === "number") { - inkList[j] = x; - inkList[j + 1] = y; - } - } - } - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - const borderWidth = this.borderStyle.width || 1, - borderAdjust = 2 * borderWidth; - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (const inkList of this.data.inkLists) { - for (let i = 0, ii = inkList.length; i < ii; i += 2) { - Util.rectBoundingBox(inkList[i] - borderAdjust, inkList[i + 1] - borderAdjust, inkList[i] + borderAdjust, inkList[i + 1] + borderAdjust, bbox); - } - } - if (!Util.intersect(this.rectangle, bbox)) { - this.rectangle = bbox; - } - this._setDefaultAppearance({ - xref, - extra: `${borderWidth} w`, - strokeColor, - strokeAlpha, - pointsCallback: (buffer, points) => { - for (const inkList of this.data.inkLists) { - for (let i = 0, ii = inkList.length; i < ii; i += 2) { - buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); - } - buffer.push("S"); - } - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } - static createNewDict(annotation, xref, { - apRef, - ap - }) { - const { - oldAnnotation, - color, - date, - opacity, - paths, - outlines, - rect, - rotation, - thickness, - user - } = annotation; - const ink = oldAnnotation || new Dict(xref); - ink.setIfNotExists("Type", Name.get("Annot")); - ink.setIfNotExists("Subtype", Name.get("Ink")); - ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); - ink.setIfArray("Rect", rect); - ink.setIfArray("InkList", outlines?.points || paths?.points); - ink.setIfNotExists("F", 4); - ink.setIfNumber("Rotate", rotation); - ink.setIfDefined("T", stringToAsciiOrUTF16BE(user)); - if (outlines) { - ink.setIfName("IT", "InkHighlight"); - } - if (thickness > 0) { - const bs = new Dict(xref); - ink.set("BS", bs); - bs.set("W", thickness); - } - ink.setIfArray("C", getPdfColorArray(color)); - ink.setIfNumber("CA", opacity); - if (ap || apRef) { - const n = new Dict(xref); - ink.set("AP", n); - n.set("N", apRef || ap); - } - return ink; - } - static async createNewAppearanceStream(annotation, xref, params) { - if (annotation.outlines) { - return this.createNewAppearanceStreamForHighlight(annotation, xref, params); - } - const { - color, - rect, - paths, - thickness, - opacity - } = annotation; - if (!color) { - return null; - } - const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; - if (opacity !== 1) { - appearanceBuffer.push("/R0 gs"); - } - for (const outline of paths.lines) { - appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); - for (let i = 6, ii = outline.length; i < ii; i += 6) { - if (isNaN(outline[i])) { - appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); - } else { - const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); - appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); - } - } - if (outline.length === 6) { - appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`); - } - } - appearanceBuffer.push("S"); - const appearance = appearanceBuffer.join("\n"); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", rect); - appearanceStreamDict.set("Length", appearance.length); - if (opacity !== 1) { - const resources = new Dict(xref); - const extGState = new Dict(xref); - const r0 = new Dict(xref); - r0.set("CA", opacity); - r0.setIfName("Type", "ExtGState"); - extGState.set("R0", r0); - resources.set("ExtGState", extGState); - appearanceStreamDict.set("Resources", resources); - } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } - static async createNewAppearanceStreamForHighlight(annotation, xref, params) { - const { - color, - rect, - outlines: { - outline - }, - opacity - } = annotation; - if (!color) { - return null; - } - const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; - appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); - for (let i = 6, ii = outline.length; i < ii; i += 6) { - if (isNaN(outline[i])) { - appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); - } else { - const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); - appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); - } - } - appearanceBuffer.push("h f"); - const appearance = appearanceBuffer.join("\n"); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", rect); - appearanceStreamDict.set("Length", appearance.length); - const resources = new Dict(xref); - const extGState = new Dict(xref); - resources.set("ExtGState", extGState); - appearanceStreamDict.set("Resources", resources); - const r0 = new Dict(xref); - extGState.set("R0", r0); - r0.setIfName("BM", "Multiply"); - if (opacity !== 1) { - r0.set("ca", opacity); - r0.setIfName("Type", "ExtGState"); - } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } -} -class HighlightAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.HIGHLIGHT; - this.data.isEditable = !this.data.noHTML; - this.data.noHTML = false; - this.data.opacity = dict.get("CA") || 1; - const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); - if (quadPoints) { - const resources = this.appearance?.dict.get("Resources"); - if (!this.appearance || !resources?.has("ExtGState")) { - if (this.appearance) { - warn("HighlightAnnotation - ignoring built-in appearance stream."); - } - const fillColor = getPdfColorArray(this.color, [1, 1, 0]); - const fillAlpha = dict.get("CA"); - this._setDefaultAppearance({ - xref, - fillColor, - blendMode: "Multiply", - fillAlpha, - pointsCallback: (buffer, points) => { - buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } else { - this.data.popupRef = null; - } - } - get overlaysTextContent() { - return true; - } - static createNewDict(annotation, xref, { - apRef, - ap - }) { - const { - color, - date, - oldAnnotation, - opacity, - rect, - rotation, - user, - quadPoints - } = annotation; - const highlight = oldAnnotation || new Dict(xref); - highlight.setIfNotExists("Type", Name.get("Annot")); - highlight.setIfNotExists("Subtype", Name.get("Highlight")); - highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); - highlight.setIfArray("Rect", rect); - highlight.setIfNotExists("F", 4); - highlight.setIfNotExists("Border", [0, 0, 0]); - highlight.setIfNumber("Rotate", rotation); - highlight.setIfArray("QuadPoints", quadPoints); - highlight.setIfArray("C", getPdfColorArray(color)); - highlight.setIfNumber("CA", opacity); - highlight.setIfDefined("T", stringToAsciiOrUTF16BE(user)); - if (apRef || ap) { - const n = new Dict(xref); - highlight.set("AP", n); - n.set("N", apRef || ap); - } - return highlight; - } - static async createNewAppearanceStream(annotation, xref, params) { - const { - color, - rect, - outlines, - opacity - } = annotation; - if (!color) { - return null; - } - const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; - const buffer = []; - for (const outline of outlines) { - buffer.length = 0; - buffer.push(`${numberToString(outline[0])} ${numberToString(outline[1])} m`); - for (let i = 2, ii = outline.length; i < ii; i += 2) { - buffer.push(`${numberToString(outline[i])} ${numberToString(outline[i + 1])} l`); - } - buffer.push("h"); - appearanceBuffer.push(buffer.join("\n")); - } - appearanceBuffer.push("f*"); - const appearance = appearanceBuffer.join("\n"); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", rect); - appearanceStreamDict.set("Length", appearance.length); - const resources = new Dict(xref); - const extGState = new Dict(xref); - resources.set("ExtGState", extGState); - appearanceStreamDict.set("Resources", resources); - const r0 = new Dict(xref); - extGState.set("R0", r0); - r0.setIfName("BM", "Multiply"); - if (opacity !== 1) { - r0.set("ca", opacity); - r0.setIfName("Type", "ExtGState"); - } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } -} -class UnderlineAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.UNDERLINE; - const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); - if (quadPoints) { - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - this._setDefaultAppearance({ - xref, - extra: "[] 0 d 0.571 w", - strokeColor, - strokeAlpha, - pointsCallback: (buffer, points) => { - buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } else { - this.data.popupRef = null; - } - } - get overlaysTextContent() { - return true; - } -} -class SquigglyAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.SQUIGGLY; - const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); - if (quadPoints) { - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - this._setDefaultAppearance({ - xref, - extra: "[] 0 d 1 w", - strokeColor, - strokeAlpha, - pointsCallback: (buffer, points) => { - const dy = (points[1] - points[5]) / 6; - let shift = dy; - let x = points[4]; - const y = points[5]; - const xEnd = points[6]; - buffer.push(`${x} ${y + shift} m`); - do { - x += 2; - shift = shift === 0 ? dy : 0; - buffer.push(`${x} ${y + shift} l`); - } while (x < xEnd); - buffer.push("S"); - return [points[4], y - 2 * dy, xEnd, y + 2 * dy]; - } - }); - } - } else { - this.data.popupRef = null; - } - } - get overlaysTextContent() { - return true; - } -} -class StrikeOutAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - this.data.annotationType = AnnotationType.STRIKEOUT; - const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); - if (quadPoints) { - if (!this.appearance) { - const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); - const strokeAlpha = dict.get("CA"); - this._setDefaultAppearance({ - xref, - extra: "[] 0 d 1 w", - strokeColor, - strokeAlpha, - pointsCallback: (buffer, points) => { - buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S"); - return [points[0], points[7], points[2], points[3]]; - } - }); - } - } else { - this.data.popupRef = null; - } - } - get overlaysTextContent() { - return true; - } -} -class StampAnnotation extends MarkupAnnotation { - #savedHasOwnCanvas = null; - constructor(params) { - super(params); - this.data.annotationType = AnnotationType.STAMP; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.isEditable = !this.data.noHTML; - this.data.noHTML = false; - } - mustBeViewedWhenEditing(isEditing, modifiedIds = null) { - if (isEditing) { - if (!this.data.isEditable) { - return true; - } - this.#savedHasOwnCanvas ??= this.data.hasOwnCanvas; - this.data.hasOwnCanvas = true; - return true; - } - if (this.#savedHasOwnCanvas !== null) { - this.data.hasOwnCanvas = this.#savedHasOwnCanvas; - this.#savedHasOwnCanvas = null; - } - return !modifiedIds?.has(this.data.id); - } - static async createImage(bitmap, xref) { - const { - width, - height - } = bitmap; - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d", { - alpha: true - }); - ctx.drawImage(bitmap, 0, 0); - const data = ctx.getImageData(0, 0, width, height).data; - const buf32 = new Uint32Array(data.buffer); - const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff); - if (hasAlpha) { - ctx.fillStyle = "white"; - ctx.fillRect(0, 0, width, height); - ctx.drawImage(bitmap, 0, 0); - } - const jpegBufferPromise = canvas.convertToBlob({ - type: "image/jpeg", - quality: 1 - }).then(blob => blob.arrayBuffer()); - const xobjectName = Name.get("XObject"); - const imageName = Name.get("Image"); - const image = new Dict(xref); - image.set("Type", xobjectName); - image.set("Subtype", imageName); - image.set("BitsPerComponent", 8); - image.setIfName("ColorSpace", "DeviceRGB"); - image.setIfName("Filter", "DCTDecode"); - image.set("BBox", [0, 0, width, height]); - image.set("Width", width); - image.set("Height", height); - let smaskStream = null; - if (hasAlpha) { - const alphaBuffer = new Uint8Array(buf32.length); - if (FeatureTest.isLittleEndian) { - for (let i = 0, ii = buf32.length; i < ii; i++) { - alphaBuffer[i] = buf32[i] >>> 24; - } - } else { - for (let i = 0, ii = buf32.length; i < ii; i++) { - alphaBuffer[i] = buf32[i] & 0xff; - } - } - const smask = new Dict(xref); - smask.set("Type", xobjectName); - smask.set("Subtype", imageName); - smask.set("BitsPerComponent", 8); - smask.setIfName("ColorSpace", "DeviceGray"); - smask.set("Width", width); - smask.set("Height", height); - smaskStream = new Stream(alphaBuffer, 0, 0, smask); - } - const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); - return { - imageStream, - smaskStream, - width, - height - }; - } - static createNewDict(annotation, xref, { - apRef, - ap - }) { - const { - date, - oldAnnotation, - rect, - rotation, - user - } = annotation; - const stamp = oldAnnotation || new Dict(xref); - stamp.setIfNotExists("Type", Name.get("Annot")); - stamp.setIfNotExists("Subtype", Name.get("Stamp")); - stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); - stamp.setIfArray("Rect", rect); - stamp.setIfNotExists("F", 4); - stamp.setIfNotExists("Border", [0, 0, 0]); - stamp.setIfNumber("Rotate", rotation); - stamp.setIfDefined("T", stringToAsciiOrUTF16BE(user)); - if (apRef || ap) { - const n = new Dict(xref); - stamp.set("AP", n); - n.set("N", apRef || ap); - } - return stamp; - } - static async #createNewAppearanceStreamForDrawing(annotation, xref) { - const { - areContours, - color, - rect, - lines, - thickness - } = annotation; - if (!color) { - return null; - } - const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, areContours)}`]; - for (const line of lines) { - appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} m`); - for (let i = 6, ii = line.length; i < ii; i += 6) { - if (isNaN(line[i])) { - appearanceBuffer.push(`${numberToString(line[i + 4])} ${numberToString(line[i + 5])} l`); - } else { - const [c1x, c1y, c2x, c2y, x, y] = line.slice(i, i + 6); - appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); - } - } - if (line.length === 6) { - appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} l`); - } - } - appearanceBuffer.push(areContours ? "F" : "S"); - const appearance = appearanceBuffer.join("\n"); - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", rect); - appearanceStreamDict.set("Length", appearance.length); - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } - static async createNewAppearanceStream(annotation, xref, params) { - if (annotation.oldAnnotation) { - return null; - } - if (annotation.isSignature) { - return this.#createNewAppearanceStreamForDrawing(annotation, xref); - } - const { - rotation - } = annotation; - const { - imageRef, - width, - height - } = params.image; - const resources = new Dict(xref); - const xobject = new Dict(xref); - resources.set("XObject", xobject); - xobject.set("Im0", imageRef); - const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; - const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.setIfName("Subtype", "Form"); - appearanceStreamDict.setIfName("Type", "XObject"); - appearanceStreamDict.set("BBox", [0, 0, width, height]); - appearanceStreamDict.set("Resources", resources); - if (rotation) { - const matrix = getRotationMatrix(rotation, width, height); - appearanceStreamDict.set("Matrix", matrix); - } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; - } -} -class FileAttachmentAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - const { - dict, - xref - } = params; - const file = new FileSpec(dict.get("FS"), xref); - this.data.annotationType = AnnotationType.FILEATTACHMENT; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.noHTML = false; - this.data.file = file.serializable; - const name = dict.get("Name"); - this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin"; - const fillAlpha = dict.get("ca"); - this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null; - } -} - -;// ./src/core/calculate_md5.js - -const PARAMS = { - get r() { - return shadow(this, "r", new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21])); - }, - get k() { - return shadow(this, "k", new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551])); - } -}; -function calculateMD5(data, offset, length) { - let h0 = 1732584193, - h1 = -271733879, - h2 = -1732584194, - h3 = 271733878; - const paddedLength = length + 72 & ~63; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 8; - if (i < n) { - i = n; - } - padded[i++] = length << 3 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >>> 29 & 0xff; - i += 3; - const w = new Int32Array(16); - const { - k, - r - } = PARAMS; - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; - } - let a = h0, - b = h1, - c = h2, - d = h3, - f, - g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = b & c | ~b & d; - g = j; - } else if (j < 32) { - f = d & b | ~d & c; - g = 5 * j + 1 & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = 3 * j + 5 & 15; - } else { - f = c ^ (b | ~d); - g = 7 * j & 15; - } - const tmp = d, - rotateArg = a + f + k[j] + w[g] | 0, - rotate = r[j]; - d = c; - c = b; - b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; - a = tmp; - } - h0 = h0 + a | 0; - h1 = h1 + b | 0; - h2 = h2 + c | 0; - h3 = h3 + d | 0; - } - return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); -} - -;// ./src/core/dataset_reader.js - - - -function decodeString(str) { - try { - return stringToUTF8String(str); - } catch (ex) { - warn(`UTF-8 decoding failed: "${ex}".`); - return str; - } -} -class DatasetXMLParser extends SimpleXMLParser { - constructor(options) { - super(options); - this.node = null; - } - onEndElement(name) { - const node = super.onEndElement(name); - if (node && name === "xfa:datasets") { - this.node = node; - throw new Error("Aborting DatasetXMLParser."); - } - } -} -class DatasetReader { - constructor(data) { - if (data.datasets) { - this.node = new SimpleXMLParser({ - hasAttributes: true - }).parseFromString(data.datasets).documentElement; - } else { - const parser = new DatasetXMLParser({ - hasAttributes: true - }); - try { - parser.parseFromString(data["xdp:xdp"]); - } catch {} - this.node = parser.node; - } - } - getValue(path) { - if (!this.node || !path) { - return ""; - } - const node = this.node.searchNode(parseXFAPath(path), 0); - if (!node) { - return ""; - } - const first = node.firstChild; - if (first?.nodeName === "value") { - return node.children.map(child => decodeString(child.textContent)); - } - return decodeString(node.textContent); - } -} - -;// ./src/core/intersector.js -class SingleIntersector { - #annotation; - #minX = Infinity; - #minY = Infinity; - #maxX = -Infinity; - #maxY = -Infinity; - #quadPoints = null; - #text = []; - #extraChars = []; - #lastIntersectingQuadIndex = -1; - #canTakeExtraChars = false; - constructor(annotation) { - this.#annotation = annotation; - const quadPoints = annotation.data.quadPoints; - if (!quadPoints) { - [this.#minX, this.#minY, this.#maxX, this.#maxY] = annotation.data.rect; - return; - } - for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { - this.#minX = Math.min(this.#minX, quadPoints[i]); - this.#maxX = Math.max(this.#maxX, quadPoints[i + 2]); - this.#minY = Math.min(this.#minY, quadPoints[i + 5]); - this.#maxY = Math.max(this.#maxY, quadPoints[i + 1]); - } - if (quadPoints.length > 8) { - this.#quadPoints = quadPoints; - } - } - overlaps(other) { - return !(this.#minX >= other.#maxX || this.#maxX <= other.#minX || this.#minY >= other.#maxY || this.#maxY <= other.#minY); - } - #intersects(x, y) { - if (this.#minX >= x || this.#maxX <= x || this.#minY >= y || this.#maxY <= y) { - return false; - } - const quadPoints = this.#quadPoints; - if (!quadPoints) { - return true; - } - if (this.#lastIntersectingQuadIndex >= 0) { - const i = this.#lastIntersectingQuadIndex; - if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { - return true; - } - this.#lastIntersectingQuadIndex = -1; - } - for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { - if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { - this.#lastIntersectingQuadIndex = i; - return true; - } - } - return false; - } - addGlyph(x, y, glyph) { - if (!this.#intersects(x, y)) { - this.disableExtraChars(); - return false; - } - if (this.#extraChars.length > 0) { - this.#text.push(this.#extraChars.join("")); - this.#extraChars.length = 0; - } - this.#text.push(glyph); - this.#canTakeExtraChars = true; - return true; - } - addExtraChar(char) { - if (this.#canTakeExtraChars) { - this.#extraChars.push(char); - } - } - disableExtraChars() { - if (!this.#canTakeExtraChars) { - return; - } - this.#canTakeExtraChars = false; - this.#extraChars.length = 0; - } - setText() { - this.#annotation.data.overlaidText = this.#text.join(""); - } -} -class Intersector { - #intersectors = new Map(); - constructor(annotations) { - for (const annotation of annotations) { - if (!annotation.data.quadPoints && !annotation.data.rect) { - continue; - } - const intersector = new SingleIntersector(annotation); - for (const [otherIntersector, overlapping] of this.#intersectors) { - if (otherIntersector.overlaps(intersector)) { - if (!overlapping) { - this.#intersectors.set(otherIntersector, new Set([intersector])); - } else { - overlapping.add(intersector); - } - } - } - this.#intersectors.set(intersector, null); - } - } - addGlyph(transform, width, height, glyph) { - const x = transform[4] + width / 2; - const y = transform[5] + height / 2; - let overlappingIntersectors; - for (const [intersector, overlapping] of this.#intersectors) { - if (overlappingIntersectors) { - if (overlappingIntersectors.has(intersector)) { - intersector.addGlyph(x, y, glyph); - } else { - intersector.disableExtraChars(); - } - continue; - } - if (!intersector.addGlyph(x, y, glyph)) { - continue; - } - overlappingIntersectors = overlapping; - } - } - addExtraChar(char) { - for (const intersector of this.#intersectors.keys()) { - intersector.addExtraChar(char); - } - } - setText() { - for (const intersector of this.#intersectors.keys()) { - intersector.setText(); - } - } -} - -;// ./src/core/calculate_sha_other.js - -class Word64 { - constructor(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - and(word) { - this.high &= word.high; - this.low &= word.low; - } - xor(word) { - this.high ^= word.high; - this.low ^= word.low; - } - shiftRight(places) { - if (places >= 32) { - this.low = this.high >>> places - 32 | 0; - this.high = 0; - } else { - this.low = this.low >>> places | this.high << 32 - places; - this.high = this.high >>> places | 0; - } - } - rotateRight(places) { - let low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = low >>> places | high << 32 - places; - this.high = high >>> places | low << 32 - places; - } - not() { - this.high = ~this.high; - this.low = ~this.low; - } - add(word) { - const lowAdd = (this.low >>> 0) + (word.low >>> 0); - let highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xffffffff) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - } - copyTo(bytes, offset) { - bytes[offset] = this.high >>> 24 & 0xff; - bytes[offset + 1] = this.high >> 16 & 0xff; - bytes[offset + 2] = this.high >> 8 & 0xff; - bytes[offset + 3] = this.high & 0xff; - bytes[offset + 4] = this.low >>> 24 & 0xff; - bytes[offset + 5] = this.low >> 16 & 0xff; - bytes[offset + 6] = this.low >> 8 & 0xff; - bytes[offset + 7] = this.low & 0xff; - } - assign(word) { - this.high = word.high; - this.low = word.low; - } -} -const calculate_sha_other_PARAMS = { - get k() { - return shadow(this, "k", [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]); - } -}; -function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); -} -function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); -} -function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); -} -function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); -} -function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); -} -function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); -} -function calculateSHA512(data, offset, length, mode384 = false) { - let h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } else { - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - const paddedLength = Math.ceil((length + 17) / 128) * 128; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 16; - if (i < n) { - i = n; - } - i += 11; - padded[i++] = length >>> 29 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length << 3 & 0xff; - const w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - const { - k - } = calculate_sha_other_PARAMS; - let a = new Word64(0, 0), - b = new Word64(0, 0), - c = new Word64(0, 0); - let d = new Word64(0, 0), - e = new Word64(0, 0), - f = new Word64(0, 0); - let g = new Word64(0, 0), - h = new Word64(0, 0); - const t1 = new Word64(0, 0), - t2 = new Word64(0, 0); - const tmp1 = new Word64(0, 0), - tmp2 = new Word64(0, 0); - let tmp3; - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; - w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - a.assign(h0); - b.assign(h1); - c.assign(h2); - d.assign(h3); - e.assign(h4); - f.assign(h5); - g.assign(h6); - h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - let result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result, 0); - h1.copyTo(result, 8); - h2.copyTo(result, 16); - h3.copyTo(result, 24); - h4.copyTo(result, 32); - h5.copyTo(result, 40); - h6.copyTo(result, 48); - h7.copyTo(result, 56); - } else { - result = new Uint8Array(48); - h0.copyTo(result, 0); - h1.copyTo(result, 8); - h2.copyTo(result, 16); - h3.copyTo(result, 24); - h4.copyTo(result, 32); - h5.copyTo(result, 40); - } - return result; -} -function calculateSHA384(data, offset, length) { - return calculateSHA512(data, offset, length, true); -} - -;// ./src/core/calculate_sha256.js - -const calculate_sha256_PARAMS = { - get k() { - return shadow(this, "k", [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]); - } -}; -function rotr(x, n) { - return x >>> n | x << 32 - n; -} -function calculate_sha256_ch(x, y, z) { - return x & y ^ ~x & z; -} -function calculate_sha256_maj(x, y, z) { - return x & y ^ x & z ^ y & z; -} -function calculate_sha256_sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); -} -function calculate_sha256_sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); -} -function calculate_sha256_littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; -} -function calculate_sha256_littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; -} -function calculateSHA256(data, offset, length) { - let h0 = 0x6a09e667, - h1 = 0xbb67ae85, - h2 = 0x3c6ef372, - h3 = 0xa54ff53a, - h4 = 0x510e527f, - h5 = 0x9b05688c, - h6 = 0x1f83d9ab, - h7 = 0x5be0cd19; - const paddedLength = Math.ceil((length + 9) / 64) * 64; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 8; - if (i < n) { - i = n; - } - i += 3; - padded[i++] = length >>> 29 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length << 3 & 0xff; - const w = new Uint32Array(64); - const { - k - } = calculate_sha256_PARAMS; - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; - i += 4; - } - for (j = 16; j < 64; ++j) { - w[j] = calculate_sha256_littleSigmaPrime(w[j - 2]) + w[j - 7] + calculate_sha256_littleSigma(w[j - 15]) + w[j - 16] | 0; - } - let a = h0, - b = h1, - c = h2, - d = h3, - e = h4, - f = h5, - g = h6, - h = h7, - t1, - t2; - for (j = 0; j < 64; ++j) { - t1 = h + calculate_sha256_sigmaPrime(e) + calculate_sha256_ch(e, f, g) + k[j] + w[j]; - t2 = calculate_sha256_sigma(a) + calculate_sha256_maj(a, b, c); - h = g; - g = f; - f = e; - e = d + t1 | 0; - d = c; - c = b; - b = a; - a = t1 + t2 | 0; - } - h0 = h0 + a | 0; - h1 = h1 + b | 0; - h2 = h2 + c | 0; - h3 = h3 + d | 0; - h4 = h4 + e | 0; - h5 = h5 + f | 0; - h6 = h6 + g | 0; - h7 = h7 + h | 0; - } - return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); -} - -;// ./src/core/decrypt_stream.js - -const chunkSize = 512; -class DecryptStream extends DecodeStream { - constructor(str, maybeLength, decrypt) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - } - readBlock() { - let chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk?.length) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - const hasMoreData = this.nextChunk?.length > 0; - const decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - const bufferLength = this.bufferLength, - newLength = bufferLength + chunk.length, - buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - } -} - -;// ./src/core/crypto.js - - - - - - -class ARCFourCipher { - constructor(key) { - this.a = 0; - this.b = 0; - const s = new Uint8Array(256); - const keyLength = key.length; - for (let i = 0; i < 256; ++i) { - s[i] = i; - } - for (let i = 0, j = 0; i < 256; ++i) { - const tmp = s[i]; - j = j + tmp + key[i % keyLength] & 0xff; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - encryptBlock(data) { - let a = this.a, - b = this.b; - const s = this.s; - const n = data.length; - const output = new Uint8Array(n); - for (let i = 0; i < n; ++i) { - a = a + 1 & 0xff; - const tmp = s[a]; - b = b + tmp & 0xff; - const tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; - } - this.a = a; - this.b = b; - return output; - } - decryptBlock(data) { - return this.encryptBlock(data); - } - encrypt(data) { - return this.encryptBlock(data); - } -} -class NullCipher { - decryptBlock(data) { - return data; - } - encrypt(data) { - return data; - } -} -class AESBaseCipher { - _s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); - _inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); - _mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - _mixCol = new Uint8Array(256).map((_, i) => i < 128 ? i << 1 : i << 1 ^ 0x1b); - constructor() { - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - _expandKey(cipherKey) { - unreachable("Cannot call `_expandKey` on the base class"); - } - _decrypt(input, key) { - let t, u, v; - const state = new Uint8Array(16); - state.set(input); - for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (let j = 0; j < 16; ++j) { - state[j] = this._inv_s[state[j]]; - } - for (let j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (let j = 0; j < 16; j += 4) { - const s0 = this._mix[state[j]]; - const s1 = this._mix[state[j + 1]]; - const s2 = this._mix[state[j + 2]]; - const s3 = this._mix[state[j + 3]]; - t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; - state[j] = t >>> 24 & 0xff; - state[j + 1] = t >> 16 & 0xff; - state[j + 2] = t >> 8 & 0xff; - state[j + 3] = t & 0xff; - } - } - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (let j = 0; j < 16; ++j) { - state[j] = this._inv_s[state[j]]; - state[j] ^= key[j]; - } - return state; - } - _encrypt(input, key) { - const s = this._s; - let t, u, v; - const state = new Uint8Array(16); - state.set(input); - for (let j = 0; j < 16; ++j) { - state[j] ^= key[j]; - } - for (let i = 1; i < this._cyclesOfRepetition; i++) { - for (let j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - for (let j = 0; j < 16; j += 4) { - const s0 = state[j]; - const s1 = state[j + 1]; - const s2 = state[j + 2]; - const s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j] ^= t ^ this._mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; - } - for (let j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - for (let j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - _decryptBlock2(data, finalize) { - const sourceLength = data.length; - let buffer = this.buffer, - bufferLength = this.bufferPosition; - const result = []; - let iv = this.iv; - for (let i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - const plain = this._decrypt(buffer, this._key); - for (let j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array(0); - } - let outputLength = 16 * result.length; - if (finalize) { - const lastBlock = result.at(-1); - let psLen = lastBlock[15]; - if (psLen <= 16) { - for (let i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - const output = new Uint8Array(outputLength); - for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - decryptBlock(data, finalize, iv = null) { - const sourceLength = data.length; - const buffer = this.buffer; - let bufferLength = this.bufferPosition; - if (iv) { - this.iv = iv; - } else { - for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - this.bufferLength = bufferLength; - return new Uint8Array(0); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - this.decryptBlock = this._decryptBlock2; - return this.decryptBlock(data, finalize); - } - encrypt(data, iv) { - const sourceLength = data.length; - let buffer = this.buffer, - bufferLength = this.bufferPosition; - const result = []; - iv ||= new Uint8Array(16); - for (let i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (let j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - const cipher = this._encrypt(buffer, this._key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array(0); - } - const outputLength = 16 * result.length; - const output = new Uint8Array(outputLength); - for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } -} -class AES128Cipher extends AESBaseCipher { - _rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); - constructor(key) { - super(); - this._cyclesOfRepetition = 10; - this._keySize = 160; - this._key = this._expandKey(key); - } - _expandKey(cipherKey) { - const b = 176; - const s = this._s; - const rcon = this._rcon; - const result = new Uint8Array(b); - result.set(cipherKey); - for (let j = 16, i = 1; j < b; ++i) { - let t1 = result[j - 3]; - let t2 = result[j - 2]; - let t3 = result[j - 1]; - let t4 = result[j - 4]; - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - t1 ^= rcon[i]; - for (let n = 0; n < 4; ++n) { - result[j] = t1 ^= result[j - 16]; - j++; - result[j] = t2 ^= result[j - 16]; - j++; - result[j] = t3 ^= result[j - 16]; - j++; - result[j] = t4 ^= result[j - 16]; - j++; - } - } - return result; - } -} -class AES256Cipher extends AESBaseCipher { - constructor(key) { - super(); - this._cyclesOfRepetition = 14; - this._keySize = 224; - this._key = this._expandKey(key); - } - _expandKey(cipherKey) { - const b = 240; - const s = this._s; - const result = new Uint8Array(b); - result.set(cipherKey); - let r = 1; - let t1, t2, t3, t4; - for (let j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - t1 = result[j - 3]; - t2 = result[j - 2]; - t3 = result[j - 1]; - t4 = result[j - 4]; - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - t1 ^= r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xff; - } - } - for (let n = 0; n < 4; ++n) { - result[j] = t1 ^= result[j - 32]; - j++; - result[j] = t2 ^= result[j - 32]; - j++; - result[j] = t3 ^= result[j - 32]; - j++; - result[j] = t4 ^= result[j - 32]; - j++; - } - } - return result; - } -} -class PDFBase { - _hash(password, input, userBytes) { - unreachable("Abstract method `_hash` called"); - } - checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - const result = this._hash(password, hashData, userBytes); - return isArrayEqual(result, ownerPassword); - } - checkUserPassword(password, userValidationSalt, userPassword) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - const result = this._hash(password, hashData, []); - return isArrayEqual(result, userPassword); - } - getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - const key = this._hash(password, hashData, userBytes); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); - } - getUserKey(password, userKeySalt, userEncryption) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - const key = this._hash(password, hashData, []); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); - } -} -class PDF17 extends PDFBase { - _hash(password, input, userBytes) { - return calculateSHA256(input, 0, input.length); - } -} -class PDF20 extends PDFBase { - _hash(password, input, userBytes) { - let k = calculateSHA256(input, 0, input.length).subarray(0, 32); - let e = [0]; - let i = 0; - while (i < 64 || e.at(-1) > i - 32) { - const combinedLength = password.length + k.length + userBytes.length, - combinedArray = new Uint8Array(combinedLength); - let writeOffset = 0; - combinedArray.set(password, writeOffset); - writeOffset += password.length; - combinedArray.set(k, writeOffset); - writeOffset += k.length; - combinedArray.set(userBytes, writeOffset); - const k1 = new Uint8Array(combinedLength * 64); - for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { - k1.set(combinedArray, pos); - } - const cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - const remainder = Math.sumPrecise(e.slice(0, 16)) % 3; - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } -} -class CipherTransform { - constructor(stringCipherConstructor, streamCipherConstructor) { - this.StringCipherConstructor = stringCipherConstructor; - this.StreamCipherConstructor = streamCipherConstructor; - } - createStream(stream, length) { - const cipher = new this.StreamCipherConstructor(); - return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - }); - } - decryptString(s) { - const cipher = new this.StringCipherConstructor(); - let data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - encryptString(s) { - const cipher = new this.StringCipherConstructor(); - if (cipher instanceof AESBaseCipher) { - const strLen = s.length; - const pad = 16 - strLen % 16; - s += String.fromCharCode(pad).repeat(pad); - const iv = new Uint8Array(16); - crypto.getRandomValues(iv); - let data = stringToBytes(s); - data = cipher.encrypt(data, iv); - const buf = new Uint8Array(16 + data.length); - buf.set(iv); - buf.set(data, 16); - return bytesToString(buf); - } - let data = stringToBytes(s); - data = cipher.encrypt(data); - return bytesToString(data); - } -} -class CipherTransformFactory { - static get _defaultPasswordBytes() { - return shadow(this, "_defaultPasswordBytes", new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a])); - } - #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { - if (password) { - const passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); - } - return null; - } - #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { - const hashDataSize = 40 + ownerPassword.length + fileId.length; - const hashData = new Uint8Array(hashDataSize); - let i = 0, - j, - n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++]; - } - hashData.set(ownerPassword, i); - i += ownerPassword.length; - hashData[i++] = flags & 0xff; - hashData[i++] = flags >> 8 & 0xff; - hashData[i++] = flags >> 16 & 0xff; - hashData[i++] = flags >>> 24 & 0xff; - hashData.set(fileId, i); - i += fileId.length; - if (revision >= 4 && !encryptMetadata) { - hashData.fill(0xff, i, i + 4); - i += 4; - } - let hash = calculateMD5(hashData, 0, i); - const keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - const encryptionKey = hash.subarray(0, keyLengthInBytes); - let cipher, checkData; - if (revision >= 3) { - i = 0; - hashData.set(CipherTransformFactory._defaultPasswordBytes, i); - i += 32; - hashData.set(fileId, i); - i += fileId.length; - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - const derivedKey = new Uint8Array(n); - for (j = 1; j <= 19; ++j) { - for (let k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(CipherTransformFactory._defaultPasswordBytes); - } - return checkData.every((data, k) => userPassword[k] === data) ? encryptionKey : null; - } - #decodeUserPassword(password, ownerPassword, revision, keyLength) { - const hashData = new Uint8Array(32); - let i = 0; - const n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - let j = 0; - while (i < 32) { - hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++]; - } - let hash = calculateMD5(hashData, 0, i); - const keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - let cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - const derivedKey = new Uint8Array(keyLengthInBytes); - for (j = 19; j >= 0; j--) { - for (let k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - #buildObjectKey(num, gen, encryptionKey, isAes = false) { - const n = encryptionKey.length; - const key = new Uint8Array(n + 9); - key.set(encryptionKey); - let i = n; - key[i++] = num & 0xff; - key[i++] = num >> 8 & 0xff; - key[i++] = num >> 16 & 0xff; - key[i++] = gen & 0xff; - key[i++] = gen >> 8 & 0xff; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6c; - key[i++] = 0x54; - } - const hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(n + 5, 16)); - } - #buildCipherConstructor(cf, name, num, gen, key) { - if (!(name instanceof Name)) { - throw new FormatError("Invalid crypt filter name."); - } - const self = this; - const cryptFilter = cf.get(name.name); - const cfm = cryptFilter?.get("CFM"); - if (!cfm || cfm.name === "None") { - return function () { - return new NullCipher(); - }; - } - if (cfm.name === "V2") { - return function () { - return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); - }; - } - if (cfm.name === "AESV2") { - return function () { - return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); - }; - } - if (cfm.name === "AESV3") { - return function () { - return new AES256Cipher(key); - }; - } - throw new FormatError("Unknown crypto method"); - } - constructor(dict, fileId, password) { - const filter = dict.get("Filter"); - if (!isName(filter, "Standard")) { - throw new FormatError("unknown encryption method"); - } - this.filterName = filter.name; - this.dict = dict; - const algorithm = dict.get("V"); - if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { - throw new FormatError("unsupported encryption algorithm"); - } - this.algorithm = algorithm; - let keyLength = dict.get("Length"); - if (!keyLength) { - if (algorithm <= 3) { - keyLength = 40; - } else { - const cfDict = dict.get("CF"); - const streamCryptoName = dict.get("StmF"); - if (cfDict instanceof Dict && streamCryptoName instanceof Name) { - cfDict.suppressEncryption = true; - const handlerDict = cfDict.get(streamCryptoName.name); - keyLength = handlerDict?.get("Length") || 128; - if (keyLength < 40) { - keyLength <<= 3; - } - } - } - } - if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { - throw new FormatError("invalid key length"); - } - const ownerBytes = stringToBytes(dict.get("O")), - userBytes = stringToBytes(dict.get("U")); - const ownerPassword = ownerBytes.subarray(0, 32); - const userPassword = userBytes.subarray(0, 32); - const flags = dict.get("P"); - const revision = dict.get("R"); - const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; - this.encryptMetadata = encryptMetadata; - const fileIdBytes = stringToBytes(fileId); - let passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch { - warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); - } - } - passwordBytes = stringToBytes(password); - } - let encryptionKey; - if (algorithm !== 5) { - encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); - } else { - const ownerValidationSalt = ownerBytes.subarray(32, 40); - const ownerKeySalt = ownerBytes.subarray(40, 48); - const uBytes = userBytes.subarray(0, 48); - const userValidationSalt = userBytes.subarray(32, 40); - const userKeySalt = userBytes.subarray(40, 48); - const ownerEncryption = stringToBytes(dict.get("OE")); - const userEncryption = stringToBytes(dict.get("UE")); - const perms = stringToBytes(dict.get("Perms")); - encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); - } - if (!encryptionKey) { - if (!password) { - throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); - } - const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); - encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); - } - if (!encryptionKey) { - throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); - } - if (algorithm === 4 && encryptionKey.length < 16) { - this.encryptionKey = new Uint8Array(16); - this.encryptionKey.set(encryptionKey); - } else { - this.encryptionKey = encryptionKey; - } - if (algorithm >= 4) { - const cf = dict.get("CF"); - if (cf instanceof Dict) { - cf.suppressEncryption = true; - } - this.cf = cf; - this.stmf = dict.get("StmF") || Name.get("Identity"); - this.strf = dict.get("StrF") || Name.get("Identity"); - this.eff = dict.get("EFF") || this.stmf; - } - } - createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); - } - const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); - const cipherConstructor = function () { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } -} - -;// ./src/core/xref.js - - - - - - -class XRef { - #firstXRefStmPos = null; - constructor(stream, pdfManager) { - this.stream = stream; - this.pdfManager = pdfManager; - this.entries = []; - this._xrefStms = new Set(); - this._cacheMap = new Map(); - this._pendingRefs = new RefSet(); - this._newPersistentRefNum = null; - this._newTemporaryRefNum = null; - this._persistentRefsCache = null; - } - getNewPersistentRef(obj) { - if (this._newPersistentRefNum === null) { - this._newPersistentRefNum = this.entries.length || 1; - } - const num = this._newPersistentRefNum++; - this._cacheMap.set(num, obj); - return Ref.get(num, 0); - } - getNewTemporaryRef() { - if (this._newTemporaryRefNum === null) { - this._newTemporaryRefNum = this.entries.length || 1; - if (this._newPersistentRefNum) { - this._persistentRefsCache = new Map(); - for (let i = this._newTemporaryRefNum; i < this._newPersistentRefNum; i++) { - this._persistentRefsCache.set(i, this._cacheMap.get(i)); - this._cacheMap.delete(i); - } - } - } - return Ref.get(this._newTemporaryRefNum++, 0); - } - resetNewTemporaryRef() { - this._newTemporaryRefNum = null; - if (this._persistentRefsCache) { - for (const [num, obj] of this._persistentRefsCache) { - this._cacheMap.set(num, obj); - } - } - this._persistentRefsCache = null; - } - setStartXRef(startXRef) { - this.startXRefQueue = [startXRef]; - } - parse(recoveryMode = false) { - let trailerDict; - if (!recoveryMode) { - trailerDict = this.readXRef(); - } else { - warn("Indexing all PDF objects"); - trailerDict = this.indexObjects(); - } - trailerDict.assignXref(this); - this.trailer = trailerDict; - let encrypt; - try { - encrypt = trailerDict.get("Encrypt"); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`XRef.parse - Invalid "Encrypt" reference: "${ex}".`); - } - if (encrypt instanceof Dict) { - const ids = trailerDict.get("ID"); - const fileId = ids?.length ? ids[0] : ""; - encrypt.suppressEncryption = true; - this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password); - } - let root; - try { - root = trailerDict.get("Root"); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`XRef.parse - Invalid "Root" reference: "${ex}".`); - } - if (root instanceof Dict) { - try { - const pages = root.get("Pages"); - if (pages instanceof Dict) { - this.root = root; - return; - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`XRef.parse - Invalid "Pages" reference: "${ex}".`); - } - } - if (!recoveryMode) { - throw new XRefParseException(); - } - throw new InvalidPDFException("Invalid Root reference."); - } - processXRefTable(parser) { - if (!("tableState" in this)) { - this.tableState = { - entryNum: 0, - streamPos: parser.lexer.stream.pos, - parserBuf1: parser.buf1, - parserBuf2: parser.buf2 - }; - } - const obj = this.readXRefTable(parser); - if (!isCmd(obj, "trailer")) { - throw new FormatError("Invalid XRef table: could not find trailer dictionary"); - } - let dict = parser.getObj(); - if (!(dict instanceof Dict) && dict.dict) { - dict = dict.dict; - } - if (!(dict instanceof Dict)) { - throw new FormatError("Invalid XRef table: could not parse trailer dictionary"); - } - delete this.tableState; - return dict; - } - readXRefTable(parser) { - const stream = parser.lexer.stream; - const tableState = this.tableState; - stream.pos = tableState.streamPos; - parser.buf1 = tableState.parserBuf1; - parser.buf2 = tableState.parserBuf2; - let obj; - while (true) { - if (!("firstEntryNum" in tableState) || !("entryCount" in tableState)) { - if (isCmd(obj = parser.getObj(), "trailer")) { - break; - } - tableState.firstEntryNum = obj; - tableState.entryCount = parser.getObj(); - } - let first = tableState.firstEntryNum; - const count = tableState.entryCount; - if (!Number.isInteger(first) || !Number.isInteger(count)) { - throw new FormatError("Invalid XRef table: wrong types in subsection header"); - } - for (let i = tableState.entryNum; i < count; i++) { - tableState.streamPos = stream.pos; - tableState.entryNum = i; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - const entry = {}; - entry.offset = parser.getObj(); - entry.gen = parser.getObj(); - const type = parser.getObj(); - if (type instanceof Cmd) { - switch (type.cmd) { - case "f": - entry.free = true; - break; - case "n": - entry.uncompressed = true; - break; - } - } - if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) { - throw new FormatError(`Invalid entry in XRef subsection: ${first}, ${count}`); - } - if (i === 0 && entry.free && first === 1) { - first = 0; - } - if (!this.entries[i + first]) { - this.entries[i + first] = entry; - } - } - tableState.entryNum = 0; - tableState.streamPos = stream.pos; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - delete tableState.firstEntryNum; - delete tableState.entryCount; - } - if (this.entries[0] && !this.entries[0].free) { - throw new FormatError("Invalid XRef table: unexpected first object"); - } - return obj; - } - processXRefStream(stream) { - if (!("streamState" in this)) { - const { - dict, - pos - } = stream; - const byteWidths = dict.get("W"); - const range = dict.get("Index") || [0, dict.get("Size")]; - this.streamState = { - entryRanges: range, - byteWidths, - entryNum: 0, - streamPos: pos - }; - } - this.readXRefStream(stream); - delete this.streamState; - return stream.dict; - } - readXRefStream(stream) { - const streamState = this.streamState; - stream.pos = streamState.streamPos; - const [typeFieldWidth, offsetFieldWidth, generationFieldWidth] = streamState.byteWidths; - const entryRanges = streamState.entryRanges; - while (entryRanges.length > 0) { - const [first, n] = entryRanges; - if (!Number.isInteger(first) || !Number.isInteger(n)) { - throw new FormatError(`Invalid XRef range fields: ${first}, ${n}`); - } - if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) { - throw new FormatError(`Invalid XRef entry fields length: ${first}, ${n}`); - } - for (let i = streamState.entryNum; i < n; ++i) { - streamState.entryNum = i; - streamState.streamPos = stream.pos; - let type = 0, - offset = 0, - generation = 0; - for (let j = 0; j < typeFieldWidth; ++j) { - const typeByte = stream.getByte(); - if (typeByte === -1) { - throw new FormatError("Invalid XRef byteWidths 'type'."); - } - type = type << 8 | typeByte; - } - if (typeFieldWidth === 0) { - type = 1; - } - for (let j = 0; j < offsetFieldWidth; ++j) { - const offsetByte = stream.getByte(); - if (offsetByte === -1) { - throw new FormatError("Invalid XRef byteWidths 'offset'."); - } - offset = offset << 8 | offsetByte; - } - for (let j = 0; j < generationFieldWidth; ++j) { - const generationByte = stream.getByte(); - if (generationByte === -1) { - throw new FormatError("Invalid XRef byteWidths 'generation'."); - } - generation = generation << 8 | generationByte; - } - const entry = {}; - entry.offset = offset; - entry.gen = generation; - switch (type) { - case 0: - entry.free = true; - break; - case 1: - entry.uncompressed = true; - break; - case 2: - break; - default: - throw new FormatError(`Invalid XRef entry type: ${type}`); - } - if (!this.entries[first + i]) { - this.entries[first + i] = entry; - } - } - streamState.entryNum = 0; - streamState.streamPos = stream.pos; - entryRanges.splice(0, 2); - } - } - indexObjects() { - const TAB = 0x9, - LF = 0xa, - CR = 0xd, - SPACE = 0x20; - const PERCENT = 0x25, - LT = 0x3c; - function readToken(data, offset) { - let token = "", - ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - if (++offset >= data.length) { - break; - } - token += String.fromCharCode(ch); - ch = data[offset]; - } - return token; - } - function skipUntil(data, offset, what) { - const length = what.length, - dataLength = data.length; - let skipped = 0; - while (offset < dataLength) { - let i = 0; - while (i < length && data[offset + i] === what[i]) { - ++i; - } - if (i >= length) { - break; - } - offset++; - skipped++; - } - return skipped; - } - const gEndobjRegExp = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g; - const gStartxrefRegExp = /\b(startxref|\d+\s+\d+\s+obj)\b/g; - const objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - const trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); - const startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]); - const xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); - this.entries.length = 0; - this._cacheMap.clear(); - const stream = this.stream; - stream.pos = 0; - const buffer = stream.getBytes(), - bufferStr = bytesToString(buffer), - length = buffer.length; - let position = stream.start; - const trailers = [], - xrefStms = []; - while (position < length) { - let ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - const token = readToken(buffer, position); - let m; - if (token.startsWith("xref") && (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if (m = objRegExp.exec(token)) { - const num = m[1] | 0, - gen = m[2] | 0; - const startPos = position + token.length; - let contentLength, - updateEntries = false; - if (!this.entries[num]) { - updateEntries = true; - } else if (this.entries[num].gen === gen) { - try { - const parser = new Parser({ - lexer: new Lexer(stream.makeSubStream(startPos)) - }); - parser.getObj(); - updateEntries = true; - } catch (ex) { - if (ex instanceof ParserEOFException) { - warn(`indexObjects -- checking object (${token}): "${ex}".`); - } else { - updateEntries = true; - } - } - } - if (updateEntries) { - this.entries[num] = { - offset: position - stream.start, - gen, - uncompressed: true - }; - } - gEndobjRegExp.lastIndex = startPos; - const match = gEndobjRegExp.exec(bufferStr); - if (match) { - const endPos = gEndobjRegExp.lastIndex + 1; - contentLength = endPos - position; - if (match[1] !== "endobj") { - warn(`indexObjects: Found "${match[1]}" inside of another "obj", ` + 'caused by missing "endobj" -- trying to recover.'); - contentLength -= match[1].length + 1; - } - } else { - contentLength = length - position; - } - const content = buffer.subarray(position, position + contentLength); - const xrefTagOffset = skipUntil(content, 0, xrefBytes); - if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { - xrefStms.push(position - stream.start); - this._xrefStms.add(position - stream.start); - } - position += contentLength; - } else if (token.startsWith("trailer") && (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - const startPos = position + token.length; - let contentLength; - gStartxrefRegExp.lastIndex = startPos; - const match = gStartxrefRegExp.exec(bufferStr); - if (match) { - const endPos = gStartxrefRegExp.lastIndex + 1; - contentLength = endPos - position; - if (match[1] !== "startxref") { - warn(`indexObjects: Found "${match[1]}" after "trailer", ` + 'caused by missing "startxref" -- trying to recover.'); - contentLength -= match[1].length + 1; - } - } else { - contentLength = length - position; - } - position += contentLength; - } else { - position += token.length + 1; - } - } - for (const xrefStm of xrefStms) { - this.startXRefQueue.push(xrefStm); - this.readXRef(true); - } - const trailerDicts = []; - let isEncrypted = false; - for (const trailer of trailers) { - stream.pos = trailer; - const parser = new Parser({ - lexer: new Lexer(stream), - xref: this, - allowStreams: true, - recoveryMode: true - }); - const obj = parser.getObj(); - if (!isCmd(obj, "trailer")) { - continue; - } - const dict = parser.getObj(); - if (!(dict instanceof Dict)) { - continue; - } - trailerDicts.push(dict); - if (dict.has("Encrypt")) { - isEncrypted = true; - } - } - let trailerDict, trailerError; - for (const dict of [...trailerDicts, "genFallback", ...trailerDicts]) { - if (dict === "genFallback") { - if (!trailerError) { - break; - } - this._generationFallback = true; - continue; - } - let validPagesDict = false; - try { - const rootDict = dict.get("Root"); - if (!(rootDict instanceof Dict)) { - continue; - } - const pagesDict = rootDict.get("Pages"); - if (!(pagesDict instanceof Dict)) { - continue; - } - const pagesCount = pagesDict.get("Count"); - if (Number.isInteger(pagesCount)) { - validPagesDict = true; - } - } catch (ex) { - trailerError = ex; - continue; - } - if (validPagesDict && (!isEncrypted || dict.has("Encrypt")) && dict.has("ID")) { - return dict; - } - trailerDict = dict; - } - if (trailerDict) { - return trailerDict; - } - if (this.topDict) { - return this.topDict; - } - if (!trailerDicts.length) { - for (const [num, entry] of this.entries.entries()) { - if (!entry) { - continue; - } - const ref = Ref.get(num, entry.gen); - let obj; - try { - obj = this.fetch(ref); - } catch { - continue; - } - if (obj instanceof BaseStream) { - obj = obj.dict; - } - if (obj instanceof Dict && obj.has("Root")) { - return obj; - } - } - } - throw new InvalidPDFException("Invalid PDF structure."); - } - readXRef(recoveryMode = false) { - const stream = this.stream; - const startXRefParsedCache = new Set(); - while (this.startXRefQueue.length) { - try { - const startXRef = this.startXRefQueue[0]; - if (startXRefParsedCache.has(startXRef)) { - warn("readXRef - skipping XRef table since it was already parsed."); - this.startXRefQueue.shift(); - continue; - } - startXRefParsedCache.add(startXRef); - stream.pos = startXRef + stream.start; - const parser = new Parser({ - lexer: new Lexer(stream), - xref: this, - allowStreams: true - }); - let obj = parser.getObj(); - let dict; - if (isCmd(obj, "xref")) { - dict = this.processXRefTable(parser); - if (!this.topDict) { - this.topDict = dict; - } - obj = dict.get("XRefStm"); - if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { - this._xrefStms.add(obj); - this.startXRefQueue.push(obj); - this.#firstXRefStmPos ??= obj; - } - } else if (Number.isInteger(obj)) { - if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) { - throw new FormatError("Invalid XRef stream"); - } - dict = this.processXRefStream(obj); - if (!this.topDict) { - this.topDict = dict; - } - if (!dict) { - throw new FormatError("Failed to read XRef stream"); - } - } else { - throw new FormatError("Invalid XRef stream header"); - } - obj = dict.get("Prev"); - if (Number.isInteger(obj)) { - this.startXRefQueue.push(obj); - } else if (obj instanceof Ref) { - this.startXRefQueue.push(obj.num); - } - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - info("(while reading XRef): " + e); - } - this.startXRefQueue.shift(); - } - if (this.topDict) { - return this.topDict; - } - if (recoveryMode) { - return undefined; - } - throw new XRefParseException(); - } - get lastXRefStreamPos() { - return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null); - } - getEntry(i) { - const xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - } - fetchIfRef(obj, suppressEncryption = false) { - if (obj instanceof Ref) { - return this.fetch(obj, suppressEncryption); - } - return obj; - } - fetch(ref, suppressEncryption = false) { - if (!(ref instanceof Ref)) { - throw new Error("ref object is not a reference"); - } - const num = ref.num; - const cacheEntry = this._cacheMap.get(num); - if (cacheEntry !== undefined) { - if (cacheEntry instanceof Dict && !cacheEntry.objId) { - cacheEntry.objId = ref.toString(); - } - return cacheEntry; - } - let xrefEntry = this.getEntry(num); - if (xrefEntry === null) { - return xrefEntry; - } - if (this._pendingRefs.has(ref)) { - this._pendingRefs.remove(ref); - warn(`Ignoring circular reference: ${ref}.`); - return CIRCULAR_REF; - } - this._pendingRefs.put(ref); - try { - xrefEntry = xrefEntry.uncompressed ? this.fetchUncompressed(ref, xrefEntry, suppressEncryption) : this.fetchCompressed(ref, xrefEntry, suppressEncryption); - this._pendingRefs.remove(ref); - } catch (ex) { - this._pendingRefs.remove(ref); - throw ex; - } - if (xrefEntry instanceof Dict) { - xrefEntry.objId = ref.toString(); - } else if (xrefEntry instanceof BaseStream) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - } - fetchUncompressed(ref, xrefEntry, suppressEncryption = false) { - const gen = ref.gen; - let num = ref.num; - if (xrefEntry.gen !== gen) { - const msg = `Inconsistent generation in XRef: ${ref}`; - if (this._generationFallback && xrefEntry.gen < gen) { - warn(msg); - return this.fetchUncompressed(Ref.get(num, xrefEntry.gen), xrefEntry, suppressEncryption); - } - throw new XRefEntryException(msg); - } - const stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); - const parser = new Parser({ - lexer: new Lexer(stream), - xref: this, - allowStreams: true - }); - const obj1 = parser.getObj(); - const obj2 = parser.getObj(); - const obj3 = parser.getObj(); - if (obj1 !== num || obj2 !== gen || !(obj3 instanceof Cmd)) { - throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); - } - if (obj3.cmd !== "obj") { - if (obj3.cmd.startsWith("obj")) { - num = parseInt(obj3.cmd.substring(3), 10); - if (!Number.isNaN(num)) { - return num; - } - } - throw new XRefEntryException(`Bad (uncompressed) XRef entry: ${ref}`); - } - xrefEntry = this.encrypt && !suppressEncryption ? parser.getObj(this.encrypt.createCipherTransform(num, gen)) : parser.getObj(); - if (!(xrefEntry instanceof BaseStream)) { - this._cacheMap.set(num, xrefEntry); - } - return xrefEntry; - } - fetchCompressed(ref, xrefEntry, suppressEncryption = false) { - const tableOffset = xrefEntry.offset; - const stream = this.fetch(Ref.get(tableOffset, 0)); - if (!(stream instanceof BaseStream)) { - throw new FormatError("bad ObjStm stream"); - } - const first = stream.dict.get("First"); - const n = stream.dict.get("N"); - if (!Number.isInteger(first) || !Number.isInteger(n)) { - throw new FormatError("invalid first and n parameters for ObjStm stream"); - } - let parser = new Parser({ - lexer: new Lexer(stream), - xref: this, - allowStreams: true - }); - const nums = new Array(n); - const offsets = new Array(n); - for (let i = 0; i < n; ++i) { - const num = parser.getObj(); - if (!Number.isInteger(num)) { - throw new FormatError(`invalid object number in the ObjStm stream: ${num}`); - } - const offset = parser.getObj(); - if (!Number.isInteger(offset)) { - throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`); - } - nums[i] = num; - const entry = this.getEntry(num); - if (entry?.offset === tableOffset && entry.gen !== i) { - entry.gen = i; - } - offsets[i] = offset; - } - const start = (stream.start || 0) + first; - const entries = new Array(n); - for (let i = 0; i < n; ++i) { - const length = i < n - 1 ? offsets[i + 1] - offsets[i] : undefined; - if (length < 0) { - throw new FormatError("Invalid offset in the ObjStm stream."); - } - parser = new Parser({ - lexer: new Lexer(stream.makeSubStream(start + offsets[i], length, stream.dict)), - xref: this, - allowStreams: true - }); - const obj = parser.getObj(); - entries[i] = obj; - if (obj instanceof BaseStream) { - continue; - } - const num = nums[i], - entry = this.entries[num]; - if (entry && entry.offset === tableOffset && entry.gen === i) { - this._cacheMap.set(num, obj); - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - throw new XRefEntryException(`Bad (compressed) XRef entry: ${ref}`); - } - return xrefEntry; - } - async fetchIfRefAsync(obj, suppressEncryption) { - if (obj instanceof Ref) { - return this.fetchAsync(obj, suppressEncryption); - } - return obj; - } - async fetchAsync(ref, suppressEncryption) { - try { - return this.fetch(ref, suppressEncryption); - } catch (ex) { - if (!(ex instanceof MissingDataException)) { - throw ex; - } - await this.pdfManager.requestRange(ex.begin, ex.end); - return this.fetchAsync(ref, suppressEncryption); - } - } - getCatalogObj() { - return this.root; - } -} - -;// ./src/core/document.js - - - - - - - - - - - - - - - - - - - - -const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; -class Page { - #resourcesPromise = null; - constructor({ - pdfManager, - xref, - pageIndex, - pageDict, - ref, - globalIdFactory, - fontCache, - builtInCMapCache, - standardFontDataCache, - globalColorSpaceCache, - globalImageCache, - systemFontCache, - nonBlendModesSet, - xfaFactory - }) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.builtInCMapCache = builtInCMapCache; - this.standardFontDataCache = standardFontDataCache; - this.globalColorSpaceCache = globalColorSpaceCache; - this.globalImageCache = globalImageCache; - this.systemFontCache = systemFontCache; - this.nonBlendModesSet = nonBlendModesSet; - this.evaluatorOptions = pdfManager.evaluatorOptions; - this.xfaFactory = xfaFactory; - const idCounters = { - obj: 0 - }; - this._localIdFactory = class extends globalIdFactory { - static createObjId() { - return `p${pageIndex}_${++idCounters.obj}`; - } - static getPageObjId() { - return `p${ref.toString()}`; - } - }; - } - #createPartialEvaluator(handler) { - return new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalColorSpaceCache: this.globalColorSpaceCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions - }); - } - #getInheritableProperty(key, getArray = false) { - const value = getInheritableProperty({ - dict: this.pageDict, - key, - getArray, - stopWhenFound: false - }); - if (!Array.isArray(value)) { - return value; - } - if (value.length === 1 || !(value[0] instanceof Dict)) { - return value[0]; - } - return Dict.merge({ - xref: this.xref, - dictArray: value - }); - } - get content() { - return this.pageDict.getArray("Contents"); - } - get resources() { - const resources = this.#getInheritableProperty("Resources"); - return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); - } - #getBoundingBox(name) { - if (this.xfaData) { - return this.xfaData.bbox; - } - const box = lookupNormalRect(this.#getInheritableProperty(name, true), null); - if (box) { - if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { - return box; - } - warn(`Empty, or invalid, /${name} entry.`); - } - return null; - } - get mediaBox() { - return shadow(this, "mediaBox", this.#getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); - } - get cropBox() { - return shadow(this, "cropBox", this.#getBoundingBox("CropBox") || this.mediaBox); - } - get userUnit() { - const obj = this.pageDict.get("UserUnit"); - return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); - } - get view() { - const { - cropBox, - mediaBox - } = this; - if (cropBox !== mediaBox && !isArrayEqual(cropBox, mediaBox)) { - const box = Util.intersect(cropBox, mediaBox); - if (box && box[2] - box[0] > 0 && box[3] - box[1] > 0) { - return shadow(this, "view", box); - } - warn("Empty /CropBox and /MediaBox intersection."); - } - return shadow(this, "view", mediaBox); - } - get rotate() { - let rotate = this.#getInheritableProperty("Rotate") || 0; - if (rotate % 90 !== 0) { - rotate = 0; - } else if (rotate >= 360) { - rotate %= 360; - } else if (rotate < 0) { - rotate = (rotate % 360 + 360) % 360; - } - return shadow(this, "rotate", rotate); - } - #onSubStreamError(reason, objId) { - if (this.evaluatorOptions.ignoreErrors) { - warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); - return; - } - throw reason; - } - async getContentStream() { - const content = await this.pdfManager.ensure(this, "content"); - if (content instanceof BaseStream) { - return content; - } - if (Array.isArray(content)) { - return new StreamsSequenceStream(content, this.#onSubStreamError.bind(this)); - } - return new NullStream(); - } - get xfaData() { - return shadow(this, "xfaData", this.xfaFactory ? { - bbox: this.xfaFactory.getBoundingBox(this.pageIndex) - } : null); - } - async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { - const promises = []; - for (const annotation of annotations) { - if (annotation.id) { - const ref = Ref.fromString(annotation.id); - if (!ref) { - warn(`A non-linked annotation cannot be modified: ${annotation.id}`); - continue; - } - if (annotation.deleted) { - deletedAnnotations.put(ref, ref); - if (annotation.popupRef) { - const popupRef = Ref.fromString(annotation.popupRef); - if (popupRef) { - deletedAnnotations.put(popupRef, popupRef); - } - } - continue; - } - if (annotation.popup?.deleted) { - const popupRef = Ref.fromString(annotation.popupRef); - if (popupRef) { - deletedAnnotations.put(popupRef, popupRef); - } - } - existingAnnotations?.put(ref); - annotation.ref = ref; - promises.push(this.xref.fetchAsync(ref).then(obj => { - if (obj instanceof Dict) { - annotation.oldAnnotation = obj.clone(); - } - }, () => { - warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); - })); - delete annotation.id; - } - } - await Promise.all(promises); - } - async saveNewAnnotations(handler, task, annotations, imagePromises, changes) { - if (this.xfaFactory) { - throw new Error("XFA: Cannot save new annotations."); - } - const partialEvaluator = this.#createPartialEvaluator(handler); - const deletedAnnotations = new RefSetCache(); - const existingAnnotations = new RefSet(); - await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); - const pageDict = this.pageDict; - const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a))); - const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises, changes); - for (const { - ref - } of newData.annotations) { - if (ref instanceof Ref && !existingAnnotations.has(ref)) { - annotationsArray.push(ref); - } - } - const dict = pageDict.clone(); - dict.set("Annots", annotationsArray); - changes.put(this.ref, { - data: dict - }); - for (const deletedRef of deletedAnnotations) { - changes.put(deletedRef, { - data: null - }); - } - } - async save(handler, task, annotationStorage, changes) { - const partialEvaluator = this.#createPartialEvaluator(handler); - const annotations = await this._parsedAnnotations; - const promises = []; - for (const annotation of annotations) { - promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) { - warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); - return null; - })); - } - return Promise.all(promises); - } - async loadResources(keys) { - await (this.#resourcesPromise ??= this.pdfManager.ensure(this, "resources")); - await ObjectLoader.load(this.resources, keys, this.xref); - } - async #getMergedResources(streamDict, keys) { - const localResources = streamDict?.get("Resources"); - if (!(localResources instanceof Dict && localResources.size)) { - return this.resources; - } - await ObjectLoader.load(localResources, keys, this.xref); - return Dict.merge({ - xref: this.xref, - dictArray: [localResources, this.resources], - mergeSubDicts: true - }); - } - async getOperatorList({ - handler, - sink, - task, - intent, - cacheKey, - annotationStorage = null, - modifiedIds = null - }) { - const contentStreamPromise = this.getContentStream(); - const resourcesPromise = this.loadResources(RESOURCES_KEYS_OPERATOR_LIST); - const partialEvaluator = this.#createPartialEvaluator(handler); - const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; - const newAnnots = newAnnotsByPage?.get(this.pageIndex); - let newAnnotationsPromise = Promise.resolve(null); - let deletedAnnotations = null; - if (newAnnots) { - const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); - let imagePromises; - const missingBitmaps = new Set(); - for (const { - bitmapId, - bitmap - } of newAnnots) { - if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { - missingBitmaps.add(bitmapId); - } - } - const { - isOffscreenCanvasSupported - } = this.evaluatorOptions; - if (missingBitmaps.size > 0) { - const annotationWithBitmaps = newAnnots.slice(); - for (const [key, annotation] of annotationStorage) { - if (!key.startsWith(AnnotationEditorPrefix)) { - continue; - } - if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { - annotationWithBitmaps.push(annotation); - } - } - imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); - } else { - imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported); - } - deletedAnnotations = new RefSet(); - newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => { - if (!annotationGlobals) { - return null; - } - return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises); - }); - } - const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(async ([contentStream]) => { - const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_OPERATOR_LIST); - const opList = new OperatorList(intent, sink); - handler.send("StartRenderPage", { - transparency: partialEvaluator.hasBlendModes(resources, this.nonBlendModesSet), - pageIndex: this.pageIndex, - cacheKey - }); - await partialEvaluator.getOperatorList({ - stream: contentStream, - task, - resources, - operatorList: opList - }); - return opList; - }); - let [pageOpList, annotations, newAnnotations] = await Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]); - if (newAnnotations) { - annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); - for (let i = 0, ii = newAnnotations.length; i < ii; i++) { - const newAnnotation = newAnnotations[i]; - if (newAnnotation.refToReplace) { - const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); - if (j >= 0) { - annotations.splice(j, 1, newAnnotation); - newAnnotations.splice(i--, 1); - ii--; - } - } - } - annotations = annotations.concat(newAnnotations); - } - if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { - pageOpList.flush(true); - return { - length: pageOpList.totalLength - }; - } - const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), - isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), - intentAny = !!(intent & RenderingIntentFlag.ANY), - intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), - intentPrint = !!(intent & RenderingIntentFlag.PRINT); - const opListPromises = []; - for (const annotation of annotations) { - if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { - opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { - warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); - return { - opList: null, - separateForm: false, - separateCanvas: false - }; - })); - } - } - const opLists = await Promise.all(opListPromises); - let form = false, - canvas = false; - for (const { - opList, - separateForm, - separateCanvas - } of opLists) { - pageOpList.addOpList(opList); - form ||= separateForm; - canvas ||= separateCanvas; - } - pageOpList.flush(true, { - form, - canvas - }); - return { - length: pageOpList.totalLength - }; - } - async extractTextContent({ - handler, - task, - includeMarkedContent, - disableNormalization, - sink, - intersector = null - }) { - const contentStreamPromise = this.getContentStream(); - const resourcesPromise = this.loadResources(RESOURCES_KEYS_TEXT_CONTENT); - const langPromise = this.pdfManager.ensureCatalog("lang"); - const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); - const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_TEXT_CONTENT); - const partialEvaluator = this.#createPartialEvaluator(handler); - return partialEvaluator.getTextContent({ - stream: contentStream, - task, - resources, - includeMarkedContent, - disableNormalization, - sink, - viewBox: this.view, - lang, - intersector - }); - } - async getStructTree() { - const structTreeRoot = await this.pdfManager.ensureCatalog("structTreeRoot"); - if (!structTreeRoot) { - return null; - } - await this._parsedAnnotations; - try { - const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); - const data = await this.pdfManager.ensure(structTree, "serializable"); - return data; - } catch (ex) { - warn(`getStructTree: "${ex}".`); - return null; - } - } - _parseStructTree(structTreeRoot) { - const tree = new StructTreePage(structTreeRoot, this.pageDict); - tree.parse(this.ref); - return tree; - } - async getAnnotationsData(handler, task, intent) { - const annotations = await this._parsedAnnotations; - if (annotations.length === 0) { - return annotations; - } - const annotationsData = [], - textContentPromises = []; - let partialEvaluator; - const intentAny = !!(intent & RenderingIntentFlag.ANY), - intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), - intentPrint = !!(intent & RenderingIntentFlag.PRINT); - const highlightedAnnotations = []; - for (const annotation of annotations) { - const isVisible = intentAny || intentDisplay && annotation.viewable; - if (isVisible || intentPrint && annotation.printable) { - annotationsData.push(annotation.data); - } - if (annotation.hasTextContent && isVisible) { - partialEvaluator ??= this.#createPartialEvaluator(handler); - textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) { - warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); - })); - } else if (annotation.overlaysTextContent && isVisible) { - highlightedAnnotations.push(annotation); - } - } - if (highlightedAnnotations.length > 0) { - const intersector = new Intersector(highlightedAnnotations); - textContentPromises.push(this.extractTextContent({ - handler, - task, - includeMarkedContent: false, - disableNormalization: false, - sink: null, - viewBox: this.view, - lang: null, - intersector - }).then(() => { - intersector.setText(); - })); - } - await Promise.all(textContentPromises); - return annotationsData; - } - get annotations() { - const annots = this.#getInheritableProperty("Annots"); - return shadow(this, "annotations", Array.isArray(annots) ? annots : []); - } - get _parsedAnnotations() { - const promise = this.pdfManager.ensure(this, "annotations").then(async annots => { - if (annots.length === 0) { - return annots; - } - const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]); - if (!annotationGlobals) { - return []; - } - const orphanFields = fieldObjects?.orphanFields; - const annotationPromises = []; - for (const annotationRef of annots) { - annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, this.ref).catch(function (reason) { - warn(`_parsedAnnotations: "${reason}".`); - return null; - })); - } - const sortedAnnotations = []; - let popupAnnotations, widgetAnnotations; - for (const annotation of await Promise.all(annotationPromises)) { - if (!annotation) { - continue; - } - if (annotation instanceof WidgetAnnotation) { - (widgetAnnotations ||= []).push(annotation); - continue; - } - if (annotation instanceof PopupAnnotation) { - (popupAnnotations ||= []).push(annotation); - continue; - } - sortedAnnotations.push(annotation); - } - if (widgetAnnotations) { - sortedAnnotations.push(...widgetAnnotations); - } - if (popupAnnotations) { - sortedAnnotations.push(...popupAnnotations); - } - return sortedAnnotations; - }); - return shadow(this, "_parsedAnnotations", promise); - } - get jsActions() { - const actions = collectActions(this.xref, this.pageDict, PageActionEventType); - return shadow(this, "jsActions", actions); - } -} -const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); -const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); -const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); -function find(stream, signature, limit = 1024, backwards = false) { - const signatureLength = signature.length; - const scanBytes = stream.peekBytes(limit); - const scanLength = scanBytes.length - signatureLength; - if (scanLength <= 0) { - return false; - } - if (backwards) { - const signatureEnd = signatureLength - 1; - let pos = scanBytes.length - 1; - while (pos >= signatureEnd) { - let j = 0; - while (j < signatureLength && scanBytes[pos - j] === signature[signatureEnd - j]) { - j++; - } - if (j >= signatureLength) { - stream.pos += pos - signatureEnd; - return true; - } - pos--; - } - } else { - let pos = 0; - while (pos <= scanLength) { - let j = 0; - while (j < signatureLength && scanBytes[pos + j] === signature[j]) { - j++; - } - if (j >= signatureLength) { - stream.pos += pos; - return true; - } - pos++; - } - } - return false; -} -class PDFDocument { - #pagePromises = new Map(); - #version = null; - constructor(pdfManager, stream) { - if (stream.length <= 0) { - throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); - } - this.pdfManager = pdfManager; - this.stream = stream; - this.xref = new XRef(stream, pdfManager); - const idCounters = { - font: 0 - }; - this._globalIdFactory = class { - static getDocId() { - return `g_${pdfManager.docId}`; - } - static createFontId() { - return `f${++idCounters.font}`; - } - static createObjId() { - unreachable("Abstract method `createObjId` called."); - } - static getPageObjId() { - unreachable("Abstract method `getPageObjId` called."); - } - }; - } - parse(recoveryMode) { - this.xref.parse(recoveryMode); - this.catalog = new Catalog(this.pdfManager, this.xref); - } - get linearization() { - let linearization = null; - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - return shadow(this, "linearization", linearization); - } - get startXRef() { - const stream = this.stream; - let startXRef = 0; - if (this.linearization) { - stream.reset(); - if (find(stream, ENDOBJ_SIGNATURE)) { - stream.skip(6); - let ch = stream.peekByte(); - while (isWhiteSpace(ch)) { - stream.pos++; - ch = stream.peekByte(); - } - startXRef = stream.pos - stream.start; - } - } else { - const step = 1024; - const startXRefLength = STARTXREF_SIGNATURE.length; - let found = false, - pos = stream.end; - while (!found && pos > 0) { - pos -= step - startXRefLength; - if (pos < 0) { - pos = 0; - } - stream.pos = pos; - found = find(stream, STARTXREF_SIGNATURE, step, true); - } - if (found) { - stream.skip(9); - let ch; - do { - ch = stream.getByte(); - } while (isWhiteSpace(ch)); - let str = ""; - while (ch >= 0x20 && ch <= 0x39) { - str += String.fromCharCode(ch); - ch = stream.getByte(); - } - startXRef = parseInt(str, 10); - if (isNaN(startXRef)) { - startXRef = 0; - } - } - } - return shadow(this, "startXRef", startXRef); - } - checkHeader() { - const stream = this.stream; - stream.reset(); - if (!find(stream, PDF_HEADER_SIGNATURE)) { - return; - } - stream.moveStart(); - stream.skip(PDF_HEADER_SIGNATURE.length); - let version = "", - ch; - while ((ch = stream.getByte()) > 0x20 && version.length < 7) { - version += String.fromCharCode(ch); - } - if (PDF_VERSION_REGEXP.test(version)) { - this.#version = version; - } else { - warn(`Invalid PDF header version: ${version}`); - } - } - parseStartXRef() { - this.xref.setStartXRef(this.startXRef); - } - get numPages() { - let num = 0; - if (this.catalog.hasActualNumPages) { - num = this.catalog.numPages; - } else if (this.xfaFactory) { - num = this.xfaFactory.getNumPages(); - } else if (this.linearization) { - num = this.linearization.numPages; - } else { - num = this.catalog.numPages; - } - return shadow(this, "numPages", num); - } - #hasOnlyDocumentSignatures(fields, recursionDepth = 0) { - const RECURSION_LIMIT = 10; - if (!Array.isArray(fields)) { - return false; - } - return fields.every(field => { - field = this.xref.fetchIfRef(field); - if (!(field instanceof Dict)) { - return false; - } - if (field.has("Kids")) { - if (++recursionDepth > RECURSION_LIMIT) { - warn("#hasOnlyDocumentSignatures: maximum recursion depth reached"); - return false; - } - return this.#hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); - } - const isSignature = isName(field.get("FT"), "Sig"); - const rectangle = field.get("Rect"); - const isInvisible = Array.isArray(rectangle) && rectangle.every(value => value === 0); - return isSignature && isInvisible; - }); - } - #collectSignatureCertificates(fields, collectedSignatureCertificates, visited = new RefSet()) { - if (!Array.isArray(fields)) { - return; - } - for (let field of fields) { - if (field instanceof Ref) { - if (visited.has(field)) { - continue; - } - visited.put(field); - } - field = this.xref.fetchIfRef(field); - if (!(field instanceof Dict)) { - continue; - } - if (field.has("Kids")) { - this.#collectSignatureCertificates(field.get("Kids"), collectedSignatureCertificates, visited); - continue; - } - const isSignature = isName(field.get("FT"), "Sig"); - if (!isSignature) { - continue; - } - const value = field.get("V"); - if (!(value instanceof Dict)) { - continue; - } - const subFilter = value.get("SubFilter"); - if (!(subFilter instanceof Name)) { - continue; - } - collectedSignatureCertificates.add(subFilter.name); - } - } - get _xfaStreams() { - const { - acroForm - } = this.catalog; - if (!acroForm) { - return null; - } - const xfa = acroForm.get("XFA"); - const entries = new Map(["xdp:xdp", "template", "datasets", "config", "connectionSet", "localeSet", "stylesheet", "/xdp:xdp"].map(e => [e, null])); - if (xfa instanceof BaseStream && !xfa.isEmpty) { - entries.set("xdp:xdp", xfa); - return entries; - } - if (!Array.isArray(xfa) || xfa.length === 0) { - return null; - } - for (let i = 0, ii = xfa.length; i < ii; i += 2) { - let name; - if (i === 0) { - name = "xdp:xdp"; - } else if (i === ii - 2) { - name = "/xdp:xdp"; - } else { - name = xfa[i]; - } - if (!entries.has(name)) { - continue; - } - const data = this.xref.fetchIfRef(xfa[i + 1]); - if (!(data instanceof BaseStream) || data.isEmpty) { - continue; - } - entries.set(name, data); - } - return entries; - } - get xfaDatasets() { - const streams = this._xfaStreams; - if (!streams) { - return shadow(this, "xfaDatasets", null); - } - for (const key of ["datasets", "xdp:xdp"]) { - const stream = streams.get(key); - if (!stream) { - continue; - } - try { - const str = stringToUTF8String(stream.getString()); - const data = { - [key]: str - }; - return shadow(this, "xfaDatasets", new DatasetReader(data)); - } catch { - warn("XFA - Invalid utf-8 string."); - break; - } - } - return shadow(this, "xfaDatasets", null); - } - get xfaData() { - const streams = this._xfaStreams; - if (!streams) { - return null; - } - const data = Object.create(null); - for (const [key, stream] of streams) { - if (!stream) { - continue; - } - try { - data[key] = stringToUTF8String(stream.getString()); - } catch { - warn("XFA - Invalid utf-8 string."); - return null; - } - } - return data; - } - get xfaFactory() { - let data; - if (this.pdfManager.enableXfa && this.catalog.needsRendering && this.formInfo.hasXfa && !this.formInfo.hasAcroForm) { - data = this.xfaData; - } - return shadow(this, "xfaFactory", data ? new XFAFactory(data) : null); - } - get isPureXfa() { - return this.xfaFactory ? this.xfaFactory.isValid() : false; - } - get htmlForXfa() { - return this.xfaFactory ? this.xfaFactory.getPages() : null; - } - async #loadXfaImages() { - const xfaImages = await this.pdfManager.ensureCatalog("xfaImages"); - if (!xfaImages) { - return; - } - this.xfaFactory.setImages(xfaImages); - } - async #loadXfaFonts(handler, task) { - const acroForm = await this.pdfManager.ensureCatalog("acroForm"); - if (!acroForm) { - return; - } - const resources = await acroForm.getAsync("DR"); - if (!(resources instanceof Dict)) { - return; - } - await ObjectLoader.load(resources, ["Font"], this.xref); - const fontRes = resources.get("Font"); - if (!(fontRes instanceof Dict)) { - return; - } - const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions, { - useSystemFonts: false - }); - const { - builtInCMapCache, - fontCache, - standardFontDataCache - } = this.catalog; - const partialEvaluator = new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: -1, - idFactory: this._globalIdFactory, - fontCache, - builtInCMapCache, - standardFontDataCache, - options - }); - const operatorList = new OperatorList(); - const pdfFonts = []; - const initialState = { - get font() { - return pdfFonts.at(-1); - }, - set font(font) { - pdfFonts.push(font); - }, - clone() { - return this; - } - }; - const parseFont = (fontName, fallbackFontDict, cssFontInfo) => partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, fallbackFontDict, cssFontInfo).catch(reason => { - warn(`loadXfaFonts: "${reason}".`); - return null; - }); - const promises = []; - for (const [fontName, font] of fontRes) { - const descriptor = font.get("FontDescriptor"); - if (!(descriptor instanceof Dict)) { - continue; - } - let fontFamily = descriptor.get("FontFamily"); - fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); - const fontWeight = descriptor.get("FontWeight"); - const italicAngle = -descriptor.get("ItalicAngle"); - const cssFontInfo = { - fontFamily, - fontWeight, - italicAngle - }; - if (!validateCSSFont(cssFontInfo)) { - continue; - } - promises.push(parseFont(fontName, null, cssFontInfo)); - } - await Promise.all(promises); - const missingFonts = this.xfaFactory.setFonts(pdfFonts); - if (!missingFonts) { - return; - } - options.ignoreErrors = true; - promises.length = 0; - pdfFonts.length = 0; - const reallyMissingFonts = new Set(); - for (const missing of missingFonts) { - if (!getXfaFontName(`${missing}-Regular`)) { - reallyMissingFonts.add(missing); - } - } - if (reallyMissingFonts.size) { - missingFonts.push("PdfJS-Fallback"); - } - for (const missing of missingFonts) { - if (reallyMissingFonts.has(missing)) { - continue; - } - for (const fontInfo of [{ - name: "Regular", - fontWeight: 400, - italicAngle: 0 - }, { - name: "Bold", - fontWeight: 700, - italicAngle: 0 - }, { - name: "Italic", - fontWeight: 400, - italicAngle: 12 - }, { - name: "BoldItalic", - fontWeight: 700, - italicAngle: 12 - }]) { - const name = `${missing}-${fontInfo.name}`; - promises.push(parseFont(name, getXfaFontDict(name), { - fontFamily: missing, - fontWeight: fontInfo.fontWeight, - italicAngle: fontInfo.italicAngle - })); - } - } - await Promise.all(promises); - this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); - } - loadXfaResources(handler, task) { - return Promise.all([this.#loadXfaFonts(handler, task).catch(() => {}), this.#loadXfaImages()]); - } - serializeXfaData(annotationStorage) { - return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; - } - get version() { - return this.catalog.version || this.#version; - } - get formInfo() { - const formInfo = { - hasFields: false, - hasAcroForm: false, - hasXfa: false, - hasSignatures: false - }; - const { - acroForm - } = this.catalog; - if (!acroForm) { - return shadow(this, "formInfo", formInfo); - } - try { - const fields = acroForm.get("Fields"); - const hasFields = Array.isArray(fields) && fields.length > 0; - formInfo.hasFields = hasFields; - const xfa = acroForm.get("XFA"); - formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty; - const sigFlags = acroForm.get("SigFlags"); - const hasSignatures = !!(sigFlags & 0x1); - const hasOnlyDocumentSignatures = hasSignatures && this.#hasOnlyDocumentSignatures(fields); - formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; - formInfo.hasSignatures = hasSignatures; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(`Cannot fetch form information: "${ex}".`); - } - return shadow(this, "formInfo", formInfo); - } - get documentInfo() { - const { - catalog, - formInfo, - xref - } = this; - const docInfo = { - PDFFormatVersion: this.version, - Language: catalog.lang, - EncryptFilterName: xref.encrypt?.filterName ?? null, - IsLinearized: !!this.linearization, - IsAcroFormPresent: formInfo.hasAcroForm, - IsXFAPresent: formInfo.hasXfa, - IsCollectionPresent: !!catalog.collection, - IsSignaturesPresent: formInfo.hasSignatures - }; - let infoDict; - try { - infoDict = xref.trailer.get("Info"); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info("The document information dictionary is invalid."); - } - if (!(infoDict instanceof Dict)) { - return shadow(this, "documentInfo", docInfo); - } - for (const [key, value] of infoDict) { - switch (key) { - case "Title": - case "Author": - case "Subject": - case "Keywords": - case "Creator": - case "Producer": - case "CreationDate": - case "ModDate": - if (typeof value === "string") { - docInfo[key] = stringToPDFString(value); - continue; - } - break; - case "Trapped": - if (value instanceof Name) { - docInfo[key] = value; - continue; - } - break; - default: - let customValue; - switch (typeof value) { - case "string": - customValue = stringToPDFString(value); - break; - case "number": - case "boolean": - customValue = value; - break; - default: - if (value instanceof Name) { - customValue = value; - } - break; - } - if (customValue === undefined) { - warn(`Bad value, for custom key "${key}", in Info: ${value}.`); - continue; - } - docInfo.Custom ??= Object.create(null); - docInfo.Custom[key] = customValue; - continue; - } - warn(`Bad value, for key "${key}", in Info: ${value}.`); - } - return shadow(this, "documentInfo", docInfo); - } - get fingerprints() { - const FINGERPRINT_FIRST_BYTES = 1024; - const EMPTY_FINGERPRINT = "\x00".repeat(16); - function validate(data) { - return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; - } - const id = this.xref.trailer.get("ID"); - let hashOriginal, hashModified; - if (Array.isArray(id) && validate(id[0])) { - hashOriginal = stringToBytes(id[0]); - if (id[1] !== id[0] && validate(id[1])) { - hashModified = stringToBytes(id[1]); - } - } else { - hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - return shadow(this, "fingerprints", [toHexUtil(hashOriginal), hashModified ? toHexUtil(hashModified) : null]); - } - async #getLinearizationPage(pageIndex) { - const { - catalog, - linearization, - xref - } = this; - const ref = Ref.get(linearization.objectNumberFirst, 0); - try { - const obj = await xref.fetchAsync(ref); - if (obj instanceof Dict) { - let type = obj.getRaw("Type"); - if (type instanceof Ref) { - type = await xref.fetchAsync(type); - } - if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { - if (!catalog.pageKidsCountCache.has(ref)) { - catalog.pageKidsCountCache.put(ref, 1); - } - if (!catalog.pageIndexCache.has(ref)) { - catalog.pageIndexCache.put(ref, 0); - } - return [obj, ref]; - } - } - throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary."); - } catch (reason) { - warn(`_getLinearizationPage: "${reason.message}".`); - return catalog.getPageDict(pageIndex); - } - } - getPage(pageIndex) { - const cachedPromise = this.#pagePromises.get(pageIndex); - if (cachedPromise) { - return cachedPromise; - } - const { - catalog, - linearization, - xfaFactory - } = this; - let promise; - if (xfaFactory) { - promise = Promise.resolve([Dict.empty, null]); - } else if (linearization?.pageFirst === pageIndex) { - promise = this.#getLinearizationPage(pageIndex); - } else { - promise = catalog.getPageDict(pageIndex); - } - promise = promise.then(([pageDict, ref]) => new Page({ - pdfManager: this.pdfManager, - xref: this.xref, - pageIndex, - pageDict, - ref, - globalIdFactory: this._globalIdFactory, - fontCache: catalog.fontCache, - builtInCMapCache: catalog.builtInCMapCache, - standardFontDataCache: catalog.standardFontDataCache, - globalColorSpaceCache: catalog.globalColorSpaceCache, - globalImageCache: catalog.globalImageCache, - systemFontCache: catalog.systemFontCache, - nonBlendModesSet: catalog.nonBlendModesSet, - xfaFactory - })); - this.#pagePromises.set(pageIndex, promise); - return promise; - } - async checkFirstPage(recoveryMode = false) { - if (recoveryMode) { - return; - } - try { - await this.getPage(0); - } catch (reason) { - if (reason instanceof XRefEntryException) { - this.#pagePromises.delete(0); - await this.cleanup(); - throw new XRefParseException(); - } - } - } - async checkLastPage(recoveryMode = false) { - const { - catalog, - pdfManager - } = this; - catalog.setActualNumPages(); - let numPages; - try { - await Promise.all([pdfManager.ensureDoc("xfaFactory"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("numPages")]); - if (this.xfaFactory) { - return; - } else if (this.linearization) { - numPages = this.linearization.numPages; - } else { - numPages = catalog.numPages; - } - if (!Number.isInteger(numPages)) { - throw new FormatError("Page count is not an integer."); - } else if (numPages <= 1) { - return; - } - await this.getPage(numPages - 1); - } catch (reason) { - this.#pagePromises.delete(numPages - 1); - await this.cleanup(); - if (reason instanceof XRefEntryException && !recoveryMode) { - throw new XRefParseException(); - } - warn(`checkLastPage - invalid /Pages tree /Count: ${numPages}.`); - let pagesTree; - try { - pagesTree = await catalog.getAllPageDicts(recoveryMode); - } catch (reasonAll) { - if (reasonAll instanceof XRefEntryException && !recoveryMode) { - throw new XRefParseException(); - } - catalog.setActualNumPages(1); - return; - } - for (const [pageIndex, [pageDict, ref]] of pagesTree) { - let promise; - if (pageDict instanceof Error) { - promise = Promise.reject(pageDict); - promise.catch(() => {}); - } else { - promise = Promise.resolve(new Page({ - pdfManager, - xref: this.xref, - pageIndex, - pageDict, - ref, - globalIdFactory: this._globalIdFactory, - fontCache: catalog.fontCache, - builtInCMapCache: catalog.builtInCMapCache, - standardFontDataCache: catalog.standardFontDataCache, - globalColorSpaceCache: this.globalColorSpaceCache, - globalImageCache: catalog.globalImageCache, - systemFontCache: catalog.systemFontCache, - nonBlendModesSet: catalog.nonBlendModesSet, - xfaFactory: null - })); - } - this.#pagePromises.set(pageIndex, promise); - } - catalog.setActualNumPages(pagesTree.size); - } - } - async fontFallback(id, handler) { - const { - catalog, - pdfManager - } = this; - for (const translatedFont of await Promise.all(catalog.fontCache)) { - if (translatedFont.loadedName === id) { - translatedFont.fallback(handler, pdfManager.evaluatorOptions); - return; - } - } - } - async cleanup(manuallyTriggered = false) { - return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); - } - async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) { - const { - xref - } = this; - if (!(fieldRef instanceof Ref) || visitedRefs.has(fieldRef)) { - return; - } - visitedRefs.put(fieldRef); - const field = await xref.fetchAsync(fieldRef); - if (!(field instanceof Dict)) { - return; - } - let subtype = await field.getAsync("Subtype"); - subtype = subtype instanceof Name ? subtype.name : null; - switch (subtype) { - case "Link": - return; - } - if (field.has("T")) { - const partName = stringToPDFString(await field.getAsync("T")); - name = name === "" ? partName : `${name}.${partName}`; - } else { - let obj = field; - while (true) { - obj = obj.getRaw("Parent") || parentRef; - if (obj instanceof Ref) { - if (visitedRefs.has(obj)) { - break; - } - obj = await xref.fetchAsync(obj); - } - if (!(obj instanceof Dict)) { - break; - } - if (obj.has("T")) { - const partName = stringToPDFString(await obj.getAsync("T")); - name = name === "" ? partName : `${name}.${partName}`; - break; - } - } - } - if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { - orphanFields.put(fieldRef, parentRef); - } - if (!promises.has(name)) { - promises.set(name, []); - } - promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { - warn(`#collectFieldObjects: "${reason}".`); - return null; - })); - if (!field.has("Kids")) { - return; - } - const kids = await field.getAsync("Kids"); - if (Array.isArray(kids)) { - for (const kid of kids) { - await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields); - } - } - } - get fieldObjects() { - const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { - if (!formInfo.hasFields) { - return null; - } - const annotationGlobals = await this.annotationGlobals; - if (!annotationGlobals) { - return null; - } - const { - acroForm - } = annotationGlobals; - const visitedRefs = new RefSet(); - const allFields = Object.create(null); - const fieldPromises = new Map(); - const orphanFields = new RefSetCache(); - for (const fieldRef of acroForm.get("Fields")) { - await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields); - } - const allPromises = []; - for (const [name, promises] of fieldPromises) { - allPromises.push(Promise.all(promises).then(fields => { - fields = fields.filter(field => !!field); - if (fields.length > 0) { - allFields[name] = fields; - } - })); - } - await Promise.all(allPromises); - return { - allFields: objectSize(allFields) > 0 ? allFields : null, - orphanFields - }; - }); - return shadow(this, "fieldObjects", promise); - } - get hasJSActions() { - const promise = this.pdfManager.ensureDoc("_parseHasJSActions"); - return shadow(this, "hasJSActions", promise); - } - async _parseHasJSActions() { - const [catalogJsActions, fieldObjects] = await Promise.all([this.pdfManager.ensureCatalog("jsActions"), this.pdfManager.ensureDoc("fieldObjects")]); - if (catalogJsActions) { - return true; - } - if (fieldObjects?.allFields) { - return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null)); - } - return false; - } - get calculationOrderIds() { - const calculationOrder = this.catalog.acroForm?.get("CO"); - if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { - return shadow(this, "calculationOrderIds", null); - } - const ids = []; - for (const id of calculationOrder) { - if (id instanceof Ref) { - ids.push(id.toString()); - } - } - return shadow(this, "calculationOrderIds", ids.length ? ids : null); - } - get annotationGlobals() { - return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); - } -} - -;// ./src/core/pdf_manager.js - - - - - - - - - - -function parseDocBaseUrl(url) { - if (url) { - const absoluteUrl = createValidAbsoluteUrl(url); - if (absoluteUrl) { - return absoluteUrl.href; - } - warn(`Invalid absolute docBaseUrl: "${url}".`); - } - return null; -} -class BasePdfManager { - constructor({ - docBaseUrl, - docId, - enableXfa, - evaluatorOptions, - handler, - password - }) { - this._docBaseUrl = parseDocBaseUrl(docBaseUrl); - this._docId = docId; - this._password = password; - this.enableXfa = enableXfa; - evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; - evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; - this.evaluatorOptions = Object.freeze(evaluatorOptions); - ImageResizer.setOptions(evaluatorOptions); - JpegStream.setOptions(evaluatorOptions); - OperatorList.setOptions(evaluatorOptions); - const options = { - ...evaluatorOptions, - handler - }; - JpxImage.setOptions(options); - IccColorSpace.setOptions(options); - CmykICCBasedCS.setOptions(options); - } - get docId() { - return this._docId; - } - get password() { - return this._password; - } - get docBaseUrl() { - return this._docBaseUrl; - } - ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - } - ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - } - ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - } - getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - } - fontFallback(id, handler) { - return this.pdfDocument.fontFallback(id, handler); - } - cleanup(manuallyTriggered = false) { - return this.pdfDocument.cleanup(manuallyTriggered); - } - async ensure(obj, prop, args) { - unreachable("Abstract method `ensure` called"); - } - requestRange(begin, end) { - unreachable("Abstract method `requestRange` called"); - } - requestLoadedStream(noFetch = false) { - unreachable("Abstract method `requestLoadedStream` called"); - } - sendProgressiveData(chunk) { - unreachable("Abstract method `sendProgressiveData` called"); - } - updatePassword(password) { - this._password = password; - } - terminate(reason) { - unreachable("Abstract method `terminate` called"); - } -} -class LocalPdfManager extends BasePdfManager { - constructor(args) { - super(args); - const stream = new Stream(args.source); - this.pdfDocument = new PDFDocument(this, stream); - this._loadedStreamPromise = Promise.resolve(stream); - } - async ensure(obj, prop, args) { - const value = obj[prop]; - if (typeof value === "function") { - return value.apply(obj, args); - } - return value; - } - requestRange(begin, end) { - return Promise.resolve(); - } - requestLoadedStream(noFetch = false) { - return this._loadedStreamPromise; - } - terminate(reason) {} -} -class NetworkPdfManager extends BasePdfManager { - constructor(args) { - super(args); - this.streamManager = new ChunkedStreamManager(args.source, { - msgHandler: args.handler, - length: args.length, - disableAutoFetch: args.disableAutoFetch, - rangeChunkSize: args.rangeChunkSize - }); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); - } - async ensure(obj, prop, args) { - try { - const value = obj[prop]; - if (typeof value === "function") { - return value.apply(obj, args); - } - return value; - } catch (ex) { - if (!(ex instanceof MissingDataException)) { - throw ex; - } - await this.requestRange(ex.begin, ex.end); - return this.ensure(obj, prop, args); - } - } - requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - } - requestLoadedStream(noFetch = false) { - return this.streamManager.requestAllChunks(noFetch); - } - sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ - chunk - }); - } - terminate(reason) { - this.streamManager.abort(reason); - } -} - -;// ./src/shared/message_handler.js - -const CallbackKind = { - DATA: 1, - ERROR: 2 -}; -const StreamKind = { - CANCEL: 1, - CANCEL_COMPLETE: 2, - CLOSE: 3, - ENQUEUE: 4, - ERROR: 5, - PULL: 6, - PULL_COMPLETE: 7, - START_COMPLETE: 8 -}; -function onFn() {} -function wrapReason(ex) { - if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { - return ex; - } - if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { - unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); - } - switch (ex.name) { - case "AbortException": - return new AbortException(ex.message); - case "InvalidPDFException": - return new InvalidPDFException(ex.message); - case "PasswordException": - return new PasswordException(ex.message, ex.code); - case "ResponseException": - return new ResponseException(ex.message, ex.status, ex.missing); - case "UnknownErrorException": - return new UnknownErrorException(ex.message, ex.details); - } - return new UnknownErrorException(ex.message, ex.toString()); -} -class MessageHandler { - #messageAC = new AbortController(); - constructor(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackId = 1; - this.streamId = 1; - this.streamSinks = Object.create(null); - this.streamControllers = Object.create(null); - this.callbackCapabilities = Object.create(null); - this.actionHandler = Object.create(null); - comObj.addEventListener("message", this.#onMessage.bind(this), { - signal: this.#messageAC.signal - }); - } - #onMessage({ - data - }) { - if (data.targetName !== this.sourceName) { - return; - } - if (data.stream) { - this.#processStreamMessage(data); - return; - } - if (data.callback) { - const callbackId = data.callbackId; - const capability = this.callbackCapabilities[callbackId]; - if (!capability) { - throw new Error(`Cannot resolve callback ${callbackId}`); - } - delete this.callbackCapabilities[callbackId]; - if (data.callback === CallbackKind.DATA) { - capability.resolve(data.data); - } else if (data.callback === CallbackKind.ERROR) { - capability.reject(wrapReason(data.reason)); - } else { - throw new Error("Unexpected callback case"); - } - return; - } - const action = this.actionHandler[data.action]; - if (!action) { - throw new Error(`Unknown action from worker: ${data.action}`); - } - if (data.callbackId) { - const sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - Promise.try(action, data.data).then(function (result) { - comObj.postMessage({ - sourceName, - targetName, - callback: CallbackKind.DATA, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - callback: CallbackKind.ERROR, - callbackId: data.callbackId, - reason: wrapReason(reason) - }); - }); - return; - } - if (data.streamId) { - this.#createStreamSink(data); - return; - } - action(data.data); - } - on(actionName, handler) { - const ah = this.actionHandler; - if (ah[actionName]) { - throw new Error(`There is already an actionName called "${actionName}"`); - } - ah[actionName] = handler; - } - send(actionName, data, transfers) { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data - }, transfers); - } - sendWithPromise(actionName, data, transfers) { - const callbackId = this.callbackId++; - const capability = Promise.withResolvers(); - this.callbackCapabilities[callbackId] = capability; - try { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - callbackId, - data - }, transfers); - } catch (ex) { - capability.reject(ex); - } - return capability.promise; - } - sendWithStream(actionName, data, queueingStrategy, transfers) { - const streamId = this.streamId++, - sourceName = this.sourceName, - targetName = this.targetName, - comObj = this.comObj; - return new ReadableStream({ - start: controller => { - const startCapability = Promise.withResolvers(); - this.streamControllers[streamId] = { - controller, - startCall: startCapability, - pullCall: null, - cancelCall: null, - isClosed: false - }; - comObj.postMessage({ - sourceName, - targetName, - action: actionName, - streamId, - data, - desiredSize: controller.desiredSize - }, transfers); - return startCapability.promise; - }, - pull: controller => { - const pullCapability = Promise.withResolvers(); - this.streamControllers[streamId].pullCall = pullCapability; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL, - streamId, - desiredSize: controller.desiredSize - }); - return pullCapability.promise; - }, - cancel: reason => { - assert(reason instanceof Error, "cancel must have a valid reason"); - const cancelCapability = Promise.withResolvers(); - this.streamControllers[streamId].cancelCall = cancelCapability; - this.streamControllers[streamId].isClosed = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL, - streamId, - reason: wrapReason(reason) - }); - return cancelCapability.promise; - } - }, queueingStrategy); - } - #createStreamSink(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const self = this, - action = this.actionHandler[data.action]; - const streamSink = { - enqueue(chunk, size = 1, transfers) { - if (this.isCancelled) { - return; - } - const lastDesiredSize = this.desiredSize; - this.desiredSize -= size; - if (lastDesiredSize > 0 && this.desiredSize <= 0) { - this.sinkCapability = Promise.withResolvers(); - this.ready = this.sinkCapability.promise; - } - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ENQUEUE, - streamId, - chunk - }, transfers); - }, - close() { - if (this.isCancelled) { - return; - } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CLOSE, - streamId - }); - delete self.streamSinks[streamId]; - }, - error(reason) { - assert(reason instanceof Error, "error must have a valid reason"); - if (this.isCancelled) { - return; - } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ERROR, - streamId, - reason: wrapReason(reason) - }); - }, - sinkCapability: Promise.withResolvers(), - onPull: null, - onCancel: null, - isCancelled: false, - desiredSize: data.desiredSize, - ready: null - }; - streamSink.sinkCapability.resolve(); - streamSink.ready = streamSink.sinkCapability.promise; - this.streamSinks[streamId] = streamSink; - Promise.try(action, data.data, streamSink).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - } - #processStreamMessage(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const streamController = this.streamControllers[streamId], - streamSink = this.streamSinks[streamId]; - switch (data.stream) { - case StreamKind.START_COMPLETE: - if (data.success) { - streamController.startCall.resolve(); - } else { - streamController.startCall.reject(wrapReason(data.reason)); - } - break; - case StreamKind.PULL_COMPLETE: - if (data.success) { - streamController.pullCall.resolve(); - } else { - streamController.pullCall.reject(wrapReason(data.reason)); - } - break; - case StreamKind.PULL: - if (!streamSink) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - break; - } - if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { - streamSink.sinkCapability.resolve(); - } - streamSink.desiredSize = data.desiredSize; - Promise.try(streamSink.onPull || onFn).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - break; - case StreamKind.ENQUEUE: - assert(streamController, "enqueue should have stream controller"); - if (streamController.isClosed) { - break; - } - streamController.controller.enqueue(data.chunk); - break; - case StreamKind.CLOSE: - assert(streamController, "close should have stream controller"); - if (streamController.isClosed) { - break; - } - streamController.isClosed = true; - streamController.controller.close(); - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.ERROR: - assert(streamController, "error should have stream controller"); - streamController.controller.error(wrapReason(data.reason)); - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL_COMPLETE: - if (data.success) { - streamController.cancelCall.resolve(); - } else { - streamController.cancelCall.reject(wrapReason(data.reason)); - } - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL: - if (!streamSink) { - break; - } - const dataReason = wrapReason(data.reason); - Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - streamSink.sinkCapability.reject(dataReason); - streamSink.isCancelled = true; - delete this.streamSinks[streamId]; - break; - default: - throw new Error("Unexpected stream case"); - } - } - async #deleteStreamController(streamController, streamId) { - await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); - delete this.streamControllers[streamId]; - } - destroy() { - this.#messageAC?.abort(); - this.#messageAC = null; - } -} - -;// ./src/core/writer.js - - - - - - - -async function writeObject(ref, obj, buffer, { - encrypt = null -}) { - const transform = encrypt?.createCipherTransform(ref.num, ref.gen); - buffer.push(`${ref.num} ${ref.gen} obj\n`); - if (obj instanceof Dict) { - await writeDict(obj, buffer, transform); - } else if (obj instanceof BaseStream) { - await writeStream(obj, buffer, transform); - } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { - await writeArray(obj, buffer, transform); - } - buffer.push("\nendobj\n"); -} -async function writeDict(dict, buffer, transform) { - buffer.push("<<"); - for (const key of dict.getKeys()) { - buffer.push(` /${escapePDFName(key)} `); - await writeValue(dict.getRaw(key), buffer, transform); - } - buffer.push(">>"); -} -async function writeStream(stream, buffer, transform) { - let bytes = stream.getBytes(); - const { - dict - } = stream; - const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); - const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; - const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); - const MIN_LENGTH_FOR_COMPRESSING = 256; - if (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode) { - try { - const cs = new CompressionStream("deflate"); - const writer = cs.writable.getWriter(); - await writer.ready; - writer.write(bytes).then(async () => { - await writer.ready; - await writer.close(); - }).catch(() => {}); - const buf = await new Response(cs.readable).arrayBuffer(); - bytes = new Uint8Array(buf); - let newFilter, newParams; - if (!filter) { - newFilter = Name.get("FlateDecode"); - } else if (!isFilterZeroFlateDecode) { - newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; - if (params) { - newParams = Array.isArray(params) ? [null, ...params] : [null, params]; - } - } - if (newFilter) { - dict.set("Filter", newFilter); - } - if (newParams) { - dict.set("DecodeParms", newParams); - } - } catch (ex) { - info(`writeStream - cannot compress data: "${ex}".`); - } - } - let string = bytesToString(bytes); - if (transform) { - string = transform.encryptString(string); - } - dict.set("Length", string.length); - await writeDict(dict, buffer, transform); - buffer.push(" stream\n", string, "\nendstream"); -} -async function writeArray(array, buffer, transform) { - buffer.push("["); - let first = true; - for (const val of array) { - if (!first) { - buffer.push(" "); - } else { - first = false; - } - await writeValue(val, buffer, transform); - } - buffer.push("]"); -} -async function writeValue(value, buffer, transform) { - if (value instanceof Name) { - buffer.push(`/${escapePDFName(value.name)}`); - } else if (value instanceof Ref) { - buffer.push(`${value.num} ${value.gen} R`); - } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { - await writeArray(value, buffer, transform); - } else if (typeof value === "string") { - if (transform) { - value = transform.encryptString(value); - } - buffer.push(`(${escapeString(value)})`); - } else if (typeof value === "number") { - buffer.push(numberToString(value)); - } else if (typeof value === "boolean") { - buffer.push(value.toString()); - } else if (value instanceof Dict) { - await writeDict(value, buffer, transform); - } else if (value instanceof BaseStream) { - await writeStream(value, buffer, transform); - } else if (value === null) { - buffer.push("null"); - } else { - warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); - } -} -function writeInt(number, size, offset, buffer) { - for (let i = size + offset - 1; i > offset - 1; i--) { - buffer[i] = number & 0xff; - number >>= 8; - } - return offset + size; -} -function writeString(string, offset, buffer) { - const ii = string.length; - for (let i = 0; i < ii; i++) { - buffer[offset + i] = string.charCodeAt(i) & 0xff; - } - return offset + ii; -} -function computeMD5(filesize, xrefInfo) { - const time = Math.floor(Date.now() / 1000); - const filename = xrefInfo.filename || ""; - const md5Buffer = [time.toString(), filename, filesize.toString(), ...xrefInfo.infoMap.values()]; - const md5BufferLen = Math.sumPrecise(md5Buffer.map(str => str.length)); - const array = new Uint8Array(md5BufferLen); - let offset = 0; - for (const str of md5Buffer) { - offset = writeString(str, offset, array); - } - return bytesToString(calculateMD5(array, 0, array.length)); -} -function writeXFADataForAcroform(str, changes) { - const xml = new SimpleXMLParser({ - hasAttributes: true - }).parseFromString(str); - for (const { - xfa - } of changes) { - if (!xfa) { - continue; - } - const { - path, - value - } = xfa; - if (!path) { - continue; - } - const nodePath = parseXFAPath(path); - let node = xml.documentElement.searchNode(nodePath, 0); - if (!node && nodePath.length > 1) { - node = xml.documentElement.searchNode([nodePath.at(-1)], 0); - } - if (node) { - node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; - } else { - warn(`Node not found for path: ${path}`); - } - } - const buffer = []; - xml.documentElement.dump(buffer); - return buffer.join(""); -} -async function updateAcroform({ - xref, - acroForm, - acroFormRef, - hasXfa, - hasXfaDatasetsEntry, - xfaDatasetsRef, - needAppearances, - changes -}) { - if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { - warn("XFA - Cannot save it"); - } - if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { - return; - } - const dict = acroForm.clone(); - if (hasXfa && !hasXfaDatasetsEntry) { - const newXfa = acroForm.get("XFA").slice(); - newXfa.splice(2, 0, "datasets"); - newXfa.splice(3, 0, xfaDatasetsRef); - dict.set("XFA", newXfa); - } - if (needAppearances) { - dict.set("NeedAppearances", true); - } - changes.put(acroFormRef, { - data: dict - }); -} -function updateXFA({ - xfaData, - xfaDatasetsRef, - changes, - xref -}) { - if (xfaData === null) { - const datasets = xref.fetchIfRef(xfaDatasetsRef); - xfaData = writeXFADataForAcroform(datasets.getString(), changes); - } - const xfaDataStream = new StringStream(xfaData); - xfaDataStream.dict = new Dict(xref); - xfaDataStream.dict.setIfName("Type", "EmbeddedFile"); - changes.put(xfaDatasetsRef, { - data: xfaDataStream - }); -} -async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { - buffer.push("xref\n"); - const indexes = getIndexes(newRefs); - let indexesPosition = 0; - for (const { - ref, - data - } of newRefs) { - if (ref.num === indexes[indexesPosition]) { - buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); - indexesPosition += 2; - } - if (data !== null) { - buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); - baseOffset += data.length; - } else { - buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`); - } - } - computeIDs(baseOffset, xrefInfo, newXref); - buffer.push("trailer\n"); - await writeDict(newXref, buffer); - buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); -} -function getIndexes(newRefs) { - const indexes = []; - for (const { - ref - } of newRefs) { - if (ref.num === indexes.at(-2) + indexes.at(-1)) { - indexes[indexes.length - 1] += 1; - } else { - indexes.push(ref.num, 1); - } - } - return indexes; -} -async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { - const xrefTableData = []; - let maxOffset = 0; - let maxGen = 0; - for (const { - ref, - data - } of newRefs) { - let gen; - maxOffset = Math.max(maxOffset, baseOffset); - if (data !== null) { - gen = Math.min(ref.gen, 0xffff); - xrefTableData.push([1, baseOffset, gen]); - baseOffset += data.length; - } else { - gen = Math.min(ref.gen + 1, 0xffff); - xrefTableData.push([0, 0, gen]); - } - maxGen = Math.max(maxGen, gen); - } - newXref.set("Index", getIndexes(newRefs)); - const offsetSize = getSizeInBytes(maxOffset); - const maxGenSize = getSizeInBytes(maxGen); - const sizes = [1, offsetSize, maxGenSize]; - newXref.set("W", sizes); - computeIDs(baseOffset, xrefInfo, newXref); - const structSize = Math.sumPrecise(sizes); - const data = new Uint8Array(structSize * xrefTableData.length); - const stream = new Stream(data); - stream.dict = newXref; - let offset = 0; - for (const [type, objOffset, gen] of xrefTableData) { - offset = writeInt(type, sizes[0], offset, data); - offset = writeInt(objOffset, sizes[1], offset, data); - offset = writeInt(gen, sizes[2], offset, data); - } - await writeObject(xrefInfo.newRef, stream, buffer, {}); - buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); -} -function computeIDs(baseOffset, xrefInfo, newXref) { - if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { - const md5 = computeMD5(baseOffset, xrefInfo); - newXref.set("ID", [xrefInfo.fileIds[0], md5]); - } -} -function getTrailerDict(xrefInfo, changes, useXrefStream) { - const newXref = new Dict(null); - newXref.set("Prev", xrefInfo.startXRef); - const refForXrefTable = xrefInfo.newRef; - if (useXrefStream) { - changes.put(refForXrefTable, { - data: "" - }); - newXref.set("Size", refForXrefTable.num + 1); - newXref.setIfName("Type", "XRef"); - } else { - newXref.set("Size", refForXrefTable.num); - } - if (xrefInfo.rootRef !== null) { - newXref.set("Root", xrefInfo.rootRef); - } - if (xrefInfo.infoRef !== null) { - newXref.set("Info", xrefInfo.infoRef); - } - if (xrefInfo.encryptRef !== null) { - newXref.set("Encrypt", xrefInfo.encryptRef); - } - return newXref; -} -async function writeChanges(changes, xref, buffer = []) { - const newRefs = []; - for (const [ref, { - data - }] of changes.items()) { - if (data === null || typeof data === "string") { - newRefs.push({ - ref, - data - }); - continue; - } - await writeObject(ref, data, buffer, xref); - newRefs.push({ - ref, - data: buffer.join("") - }); - buffer.length = 0; - } - return newRefs.sort((a, b) => a.ref.num - b.ref.num); -} -async function incrementalUpdate({ - originalData, - xrefInfo, - changes, - xref = null, - hasXfa = false, - xfaDatasetsRef = null, - hasXfaDatasetsEntry = false, - needAppearances, - acroFormRef = null, - acroForm = null, - xfaData = null, - useXrefStream = false -}) { - await updateAcroform({ - xref, - acroForm, - acroFormRef, - hasXfa, - hasXfaDatasetsEntry, - xfaDatasetsRef, - needAppearances, - changes - }); - if (hasXfa) { - updateXFA({ - xfaData, - xfaDatasetsRef, - changes, - xref - }); - } - const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); - const buffer = []; - const newRefs = await writeChanges(changes, xref, buffer); - let baseOffset = originalData.length; - const lastByte = originalData.at(-1); - if (lastByte !== 0x0a && lastByte !== 0x0d) { - buffer.push("\n"); - baseOffset += 1; - } - for (const { - data - } of newRefs) { - if (data !== null) { - buffer.push(data); - } - } - await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); - const totalLength = originalData.length + Math.sumPrecise(buffer.map(str => str.length)); - const array = new Uint8Array(totalLength); - array.set(originalData); - let offset = originalData.length; - for (const str of buffer) { - offset = writeString(str, offset, array); - } - return array; -} - -;// ./src/core/worker_stream.js - -class PDFWorkerStream { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this._contentLength = null; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - getFullReader() { - assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); - return this._fullRequestReader; - } - getRangeReader(begin, end) { - const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); - this._rangeRequestReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} -class PDFWorkerStreamReader { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; - this._contentLength = null; - this._isRangeSupported = false; - this._isStreamingSupported = false; - const readableStream = this._msgHandler.sendWithStream("GetReader"); - this._reader = readableStream.getReader(); - this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { - this._isStreamingSupported = data.isStreamingSupported; - this._isRangeSupported = data.isRangeSupported; - this._contentLength = data.contentLength; - }); - } - get headersReady() { - return this._headersReady; - } - get contentLength() { - return this._contentLength; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - get isRangeSupported() { - return this._isRangeSupported; - } - async read() { - const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value: undefined, - done: true - }; - } - return { - value: value.buffer, - done: false - }; - } - cancel(reason) { - this._reader.cancel(reason); - } -} -class PDFWorkerStreamRangeReader { - constructor(begin, end, msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; - const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { - begin, - end - }); - this._reader = readableStream.getReader(); - } - get isStreamingSupported() { - return false; - } - async read() { - const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value: undefined, - done: true - }; - } - return { - value: value.buffer, - done: false - }; - } - cancel(reason) { - this._reader.cancel(reason); - } -} - -;// ./src/core/worker.js - - - - - - - - - - -class WorkerTask { - constructor(name) { - this.name = name; - this.terminated = false; - this._capability = Promise.withResolvers(); - } - get finished() { - return this._capability.promise; - } - finish() { - this._capability.resolve(); - } - terminate() { - this.terminated = true; - } - ensureNotTerminated() { - if (this.terminated) { - throw new Error("Worker task was terminated"); - } - } -} -class WorkerMessageHandler { - static { - if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { - this.initializeFromPort(self); - } - } - static setup(handler, port) { - let testMessageProcessed = false; - handler.on("test", data => { - if (testMessageProcessed) { - return; - } - testMessageProcessed = true; - handler.send("test", data instanceof Uint8Array); - }); - handler.on("configure", data => { - setVerbosityLevel(data.verbosity); - }); - handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); - } - static createDocumentHandler(docParams, port) { - let pdfManager; - let terminated = false; - let cancelXHRs = null; - const WorkerTasks = new Set(); - const verbosity = getVerbosityLevel(); - const { - docId, - apiVersion - } = docParams; - const workerVersion = "5.4.54"; - if (apiVersion !== workerVersion) { - throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); - } - const buildMsg = (type, prop) => `The \`${type}.prototype\` contains unexpected enumerable property ` + `"${prop}", thus breaking e.g. \`for...in\` iteration of ${type}s.`; - for (const prop in {}) { - throw new Error(buildMsg("Object", prop)); - } - for (const prop in []) { - throw new Error(buildMsg("Array", prop)); - } - const workerHandlerName = docId + "_worker"; - let handler = new MessageHandler(workerHandlerName, docId, port); - function ensureNotTerminated() { - if (terminated) { - throw new Error("Worker was terminated"); - } - } - function startWorkerTask(task) { - WorkerTasks.add(task); - } - function finishWorkerTask(task) { - task.finish(); - WorkerTasks.delete(task); - } - async function loadDocument(recoveryMode) { - await pdfManager.ensureDoc("checkHeader"); - await pdfManager.ensureDoc("parseStartXRef"); - await pdfManager.ensureDoc("parse", [recoveryMode]); - await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); - await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); - const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); - if (isPureXfa) { - const task = new WorkerTask("loadXfaResources"); - startWorkerTask(task); - await pdfManager.ensureDoc("loadXfaResources", [handler, task]); - finishWorkerTask(task); - } - const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); - const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; - return { - numPages, - fingerprints, - htmlForXfa - }; - } - async function getPdfManager({ - data, - password, - disableAutoFetch, - rangeChunkSize, - length, - docBaseUrl, - enableXfa, - evaluatorOptions - }) { - const pdfManagerArgs = { - source: null, - disableAutoFetch, - docBaseUrl, - docId, - enableXfa, - evaluatorOptions, - handler, - length, - password, - rangeChunkSize - }; - if (data) { - pdfManagerArgs.source = data; - return new LocalPdfManager(pdfManagerArgs); - } - const pdfStream = new PDFWorkerStream(handler), - fullRequest = pdfStream.getFullReader(); - const pdfManagerCapability = Promise.withResolvers(); - let newPdfManager, - cachedChunks = [], - loaded = 0; - fullRequest.headersReady.then(function () { - if (!fullRequest.isRangeSupported) { - return; - } - pdfManagerArgs.source = pdfStream; - pdfManagerArgs.length = fullRequest.contentLength; - pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; - newPdfManager = new NetworkPdfManager(pdfManagerArgs); - for (const chunk of cachedChunks) { - newPdfManager.sendProgressiveData(chunk); - } - cachedChunks = []; - pdfManagerCapability.resolve(newPdfManager); - cancelXHRs = null; - }).catch(function (reason) { - pdfManagerCapability.reject(reason); - cancelXHRs = null; - }); - new Promise(function (resolve, reject) { - const readChunk = function ({ - value, - done - }) { - try { - ensureNotTerminated(); - if (done) { - if (!newPdfManager) { - const pdfFile = arrayBuffersToBytes(cachedChunks); - cachedChunks = []; - if (length && pdfFile.length !== length) { - warn("reported HTTP length is different from actual"); - } - pdfManagerArgs.source = pdfFile; - newPdfManager = new LocalPdfManager(pdfManagerArgs); - pdfManagerCapability.resolve(newPdfManager); - } - cancelXHRs = null; - return; - } - loaded += value.byteLength; - if (!fullRequest.isStreamingSupported) { - handler.send("DocProgress", { - loaded, - total: Math.max(loaded, fullRequest.contentLength || 0) - }); - } - if (newPdfManager) { - newPdfManager.sendProgressiveData(value); - } else { - cachedChunks.push(value); - } - fullRequest.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - fullRequest.read().then(readChunk, reject); - }).catch(function (e) { - pdfManagerCapability.reject(e); - cancelXHRs = null; - }); - cancelXHRs = reason => { - pdfStream.cancelAllRequests(reason); - }; - return pdfManagerCapability.promise; - } - function setupDoc(data) { - function onSuccess(doc) { - ensureNotTerminated(); - handler.send("GetDoc", { - pdfInfo: doc - }); - } - function onFailure(ex) { - ensureNotTerminated(); - if (ex instanceof PasswordException) { - const task = new WorkerTask(`PasswordException: response ${ex.code}`); - startWorkerTask(task); - handler.sendWithPromise("PasswordRequest", ex).then(function ({ - password - }) { - finishWorkerTask(task); - pdfManager.updatePassword(password); - pdfManagerReady(); - }).catch(function () { - finishWorkerTask(task); - handler.send("DocException", ex); - }); - } else { - handler.send("DocException", wrapReason(ex)); - } - } - function pdfManagerReady() { - ensureNotTerminated(); - loadDocument(false).then(onSuccess, function (reason) { - ensureNotTerminated(); - if (!(reason instanceof XRefParseException)) { - onFailure(reason); - return; - } - pdfManager.requestLoadedStream().then(function () { - ensureNotTerminated(); - loadDocument(true).then(onSuccess, onFailure); - }); - }); - } - ensureNotTerminated(); - getPdfManager(data).then(function (newPdfManager) { - if (terminated) { - newPdfManager.terminate(new AbortException("Worker was terminated.")); - throw new Error("Worker was terminated"); - } - pdfManager = newPdfManager; - pdfManager.requestLoadedStream(true).then(stream => { - handler.send("DataLoaded", { - length: stream.bytes.byteLength - }); - }); - }).then(pdfManagerReady, onFailure); - } - handler.on("GetPage", function (data) { - return pdfManager.getPage(data.pageIndex).then(function (page) { - return Promise.all([pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "view")]).then(function ([rotate, ref, userUnit, view]) { - return { - rotate, - ref, - refStr: ref?.toString() ?? null, - userUnit, - view - }; - }); - }); - }); - handler.on("GetPageIndex", function (data) { - const pageRef = Ref.get(data.num, data.gen); - return pdfManager.ensureCatalog("getPageIndex", [pageRef]); - }); - handler.on("GetDestinations", function (data) { - return pdfManager.ensureCatalog("destinations"); - }); - handler.on("GetDestination", function (data) { - return pdfManager.ensureCatalog("getDestination", [data.id]); - }); - handler.on("GetPageLabels", function (data) { - return pdfManager.ensureCatalog("pageLabels"); - }); - handler.on("GetPageLayout", function (data) { - return pdfManager.ensureCatalog("pageLayout"); - }); - handler.on("GetPageMode", function (data) { - return pdfManager.ensureCatalog("pageMode"); - }); - handler.on("GetViewerPreferences", function (data) { - return pdfManager.ensureCatalog("viewerPreferences"); - }); - handler.on("GetOpenAction", function (data) { - return pdfManager.ensureCatalog("openAction"); - }); - handler.on("GetAttachments", function (data) { - return pdfManager.ensureCatalog("attachments"); - }); - handler.on("GetDocJSActions", function (data) { - return pdfManager.ensureCatalog("jsActions"); - }); - handler.on("GetPageJSActions", function ({ - pageIndex - }) { - return pdfManager.getPage(pageIndex).then(page => pdfManager.ensure(page, "jsActions")); - }); - handler.on("GetOutline", function (data) { - return pdfManager.ensureCatalog("documentOutline"); - }); - handler.on("GetOptionalContentConfig", function (data) { - return pdfManager.ensureCatalog("optionalContentConfig"); - }); - handler.on("GetPermissions", function (data) { - return pdfManager.ensureCatalog("permissions"); - }); - handler.on("GetMetadata", function (data) { - return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); - }); - handler.on("GetMarkInfo", function (data) { - return pdfManager.ensureCatalog("markInfo"); - }); - handler.on("GetData", function (data) { - return pdfManager.requestLoadedStream().then(stream => stream.bytes); - }); - handler.on("GetAnnotations", function ({ - pageIndex, - intent - }) { - return pdfManager.getPage(pageIndex).then(function (page) { - const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); - startWorkerTask(task); - return page.getAnnotationsData(handler, task, intent).then(data => { - finishWorkerTask(task); - return data; - }, reason => { - finishWorkerTask(task); - throw reason; - }); - }); - }); - handler.on("GetFieldObjects", function (data) { - return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null); - }); - handler.on("HasJSActions", function (data) { - return pdfManager.ensureDoc("hasJSActions"); - }); - handler.on("GetCalculationOrderIds", function (data) { - return pdfManager.ensureDoc("calculationOrderIds"); - }); - handler.on("SaveDocument", async function ({ - isPureXfa, - numPages, - annotationStorage, - filename - }) { - const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")]; - const changes = new RefSetCache(); - const promises = []; - const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; - const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises); - const catalogRef = xref.trailer.getRaw("Root") || null; - let structTreeRoot; - if (newAnnotationsByPage) { - if (!_structTreeRoot) { - if (await StructTreeRoot.canCreateStructureTree({ - catalogRef, - pdfManager, - newAnnotationsByPage - })) { - structTreeRoot = null; - } - } else if (await _structTreeRoot.canUpdateStructTree({ - pdfManager, - newAnnotationsByPage - })) { - structTreeRoot = _structTreeRoot; - } - const imagePromises = AnnotationFactory.generateImages(annotationStorage.values(), xref, pdfManager.evaluatorOptions.isOffscreenCanvasSupported); - const newAnnotationPromises = structTreeRoot === undefined ? promises : []; - for (const [pageIndex, annotations] of newAnnotationsByPage) { - newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => { - const task = new WorkerTask(`Save (editor): page ${pageIndex}`); - startWorkerTask(task); - return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(function () { - finishWorkerTask(task); - }); - })); - } - if (structTreeRoot === null) { - promises.push(Promise.all(newAnnotationPromises).then(async () => { - await StructTreeRoot.createStructureTree({ - newAnnotationsByPage, - xref, - catalogRef, - pdfManager, - changes - }); - })); - } else if (structTreeRoot) { - promises.push(Promise.all(newAnnotationPromises).then(async () => { - await structTreeRoot.updateStructureTree({ - newAnnotationsByPage, - pdfManager, - changes - }); - })); - } - } - if (isPureXfa) { - promises.push(pdfManager.ensureDoc("serializeXfaData", [annotationStorage])); - } else { - for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { - promises.push(pdfManager.getPage(pageIndex).then(function (page) { - const task = new WorkerTask(`Save: page ${pageIndex}`); - startWorkerTask(task); - return page.save(handler, task, annotationStorage, changes).finally(function () { - finishWorkerTask(task); - }); - })); - } - } - const refs = await Promise.all(promises); - let xfaData = null; - if (isPureXfa) { - xfaData = refs[0]; - if (!xfaData) { - return stream.bytes; - } - } else if (changes.size === 0) { - return stream.bytes; - } - const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances); - const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null; - let xfaDatasetsRef = null; - let hasXfaDatasetsEntry = false; - if (Array.isArray(xfa)) { - for (let i = 0, ii = xfa.length; i < ii; i += 2) { - if (xfa[i] === "datasets") { - xfaDatasetsRef = xfa[i + 1]; - hasXfaDatasetsEntry = true; - } - } - if (xfaDatasetsRef === null) { - xfaDatasetsRef = xref.getNewTemporaryRef(); - } - } else if (xfa) { - warn("Unsupported XFA type."); - } - let newXrefInfo = Object.create(null); - if (xref.trailer) { - const infoMap = new Map(); - const xrefInfo = xref.trailer.get("Info") || null; - if (xrefInfo instanceof Dict) { - for (const [key, value] of xrefInfo) { - if (typeof value === "string") { - infoMap.set(key, stringToPDFString(value)); - } - } - } - newXrefInfo = { - rootRef: catalogRef, - encryptRef: xref.trailer.getRaw("Encrypt") || null, - newRef: xref.getNewTemporaryRef(), - infoRef: xref.trailer.getRaw("Info") || null, - infoMap, - fileIds: xref.trailer.get("ID") || null, - startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef, - filename - }; - } - return incrementalUpdate({ - originalData: stream.bytes, - xrefInfo: newXrefInfo, - changes, - xref, - hasXfa: !!xfa, - xfaDatasetsRef, - hasXfaDatasetsEntry, - needAppearances, - acroFormRef, - acroForm, - xfaData, - useXrefStream: isDict(xref.topDict, "XRef") - }).finally(() => { - xref.resetNewTemporaryRef(); - }); - }); - handler.on("GetOperatorList", function (data, sink) { - const pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function (page) { - const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); - startWorkerTask(task); - const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; - page.getOperatorList({ - handler, - sink, - task, - intent: data.intent, - cacheKey: data.cacheKey, - annotationStorage: data.annotationStorage, - modifiedIds: data.modifiedIds - }).then(function (operatorListInfo) { - finishWorkerTask(task); - if (start) { - info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); - } - sink.close(); - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; - } - sink.error(reason); - }); - }); - }); - handler.on("GetTextContent", function (data, sink) { - const { - pageIndex, - includeMarkedContent, - disableNormalization - } = data; - pdfManager.getPage(pageIndex).then(function (page) { - const task = new WorkerTask("GetTextContent: page " + pageIndex); - startWorkerTask(task); - const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; - page.extractTextContent({ - handler, - task, - sink, - includeMarkedContent, - disableNormalization - }).then(function () { - finishWorkerTask(task); - if (start) { - info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`); - } - sink.close(); - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; - } - sink.error(reason); - }); - }); - }); - handler.on("GetStructTree", function (data) { - return pdfManager.getPage(data.pageIndex).then(page => pdfManager.ensure(page, "getStructTree")); - }); - handler.on("FontFallback", function (data) { - return pdfManager.fontFallback(data.id, handler); - }); - handler.on("Cleanup", function (data) { - return pdfManager.cleanup(true); - }); - handler.on("Terminate", function (data) { - terminated = true; - const waitOn = []; - if (pdfManager) { - pdfManager.terminate(new AbortException("Worker was terminated.")); - const cleanupPromise = pdfManager.cleanup(); - waitOn.push(cleanupPromise); - pdfManager = null; - } else { - clearGlobalCaches(); - } - cancelXHRs?.(new AbortException("Worker was terminated.")); - for (const task of WorkerTasks) { - waitOn.push(task.finished); - task.terminate(); - } - return Promise.all(waitOn).then(function () { - handler.destroy(); - handler = null; - }); - }); - handler.on("Ready", function (data) { - setupDoc(docParams); - docParams = null; - }); - return workerHandlerName; - } - static initializeFromPort(port) { - const handler = new MessageHandler("worker", "main", port); - this.setup(handler, port); - handler.send("ready", null); - } -} - -;// ./src/pdf.worker.js - -globalThis.pdfjsWorker = { - WorkerMessageHandler: WorkerMessageHandler -}; - -export { WorkerMessageHandler }; - -//# sourceMappingURL=pdf.worker.mjs.map \ No newline at end of file From 117e05beccf8e182d7c9f05e12cbd374afca948c Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 09:41:51 +0600 Subject: [PATCH 272/286] =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D1=81=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20=D0=BA=D1=83=D1=80=D1=81=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/course/page.tsx | 519 +++++++------- .../[lesson_id]/[step_id]/page.tsx | 639 ++++++++++++++++++ .../activeCourse/[course_id]/page.tsx | 177 +++++ app/(main)/openCourse/activeCourse/page.tsx | 71 ++ app/(main)/openCourse/page.tsx | 127 +++- app/(main)/pdf/[pdfUrl]/page.tsx | 4 +- .../[lesson_id]/[step_id]/page.tsx | 39 +- .../[connect_id]/[stream_id]/page.tsx | 37 +- app/(main)/unVerifed/page.tsx | 22 +- app/(student)/teaching/[subject_id]/page.tsx | 4 +- app/components/Contribution.tsx | 13 +- app/components/cards/OpenCourseCard.tsx | 60 +- app/components/cards/OpenCourseShowCard.tsx | 16 +- app/components/lessons/ActiveStepCard.tsx | 264 ++++++++ app/components/lessons/LessonTest.tsx | 4 - app/components/lessons/StudentInfoCard.tsx | 69 +- app/components/tables/StreamList.tsx | 34 +- services/openCourse.tsx | 78 ++- services/query-tests.http | 6 +- types/lessonStateType.tsx | 5 + types/myMainCourseType.tsx | 6 +- 21 files changed, 1831 insertions(+), 363 deletions(-) create mode 100644 app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx create mode 100644 app/(main)/openCourse/activeCourse/[course_id]/page.tsx create mode 100644 app/(main)/openCourse/activeCourse/page.tsx create mode 100644 app/components/lessons/ActiveStepCard.tsx diff --git a/app/(main)/course/page.tsx b/app/(main)/course/page.tsx index bedb20d8..1902b14a 100644 --- a/app/(main)/course/page.tsx +++ b/app/(main)/course/page.tsx @@ -5,7 +5,7 @@ import { addCourse, addOpenTypes, deleteCourse, fetchCourseInfo, fetchCourseOpen import { Button } from 'primereact/button'; import { FileUpload, FileUploadSelectEvent } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; -import React, { useContext, useEffect, useRef, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { InputTextarea } from 'primereact/inputtextarea'; import { DataTable } from 'primereact/datatable'; @@ -31,7 +31,6 @@ import { DataView } from 'primereact/dataview'; import { FileWithPreview } from '@/types/fileuploadPreview'; import { Dialog } from 'primereact/dialog'; import { AudenceType } from '@/types/courseTypes/AudenceTypes'; -import PDFViewer from '@/app/components/PDFBook'; export default function Course() { const { setMessage, setGlobalLoading, course, contextFetchCourse, setMainCourseId } = useContext(LayoutContext); @@ -68,18 +67,12 @@ export default function Course() { const [forStreamId, setForStreamId] = useState<{ id: number | null; title: string } | null>(null); const [globalCourseId, setGlobalCourseId] = useState<{ id: number | null; title: string | null } | null>(null); const [pageState, setPageState] = useState(1); - const [courseStatus, setCourseStatus] = useState({ name: 'Закрытый', code: 0 }); const [openTypes, setOpenTypes] = useState([]); const [isTall, setIsTall] = useState(false); const showError = useErrorMessage(); - const courseStatusOptions = [ - { name: 'Закрытый', code: 0 }, - { name: 'Открытый', code: 1 } - ]; - const toggleSkeleton = () => { setSkeleton(true); setTimeout(() => { @@ -475,6 +468,18 @@ export default function Course() { const imagestateStyle = imageState || editingLesson.image ? 'flex gap-1 items-center justify-between flex-col sm:flex-row' : ''; const imageTitle = useShortText(typeof editingLesson.image === 'string' ? editingLesson.image : '', 20); + // usecallback + const callbackFetchCourse = useCallback(() => { + contextFetchCourse(pageState); + }, [pageState]); + + const callbackSetIndex = useCallback(() => { + setActiveIndex(0); + }, [activeIndex]); + + // useMemo + const memoForStreamId = useMemo(() => (forStreamId?.id ? forStreamId : null), [forStreamId?.id]); + useEffect(() => { contextFetchCourse(1); setPageState(1); @@ -545,266 +550,266 @@ export default function Course() { return (
    -
    -
    - {/* Мобильный курс */} - {media ? ( - <> - handleTabChange(e)} - activeIndex={activeIndex} - // className="main-bg" +
    + {/* Мобильный курс */} + {media ? ( +
    + handleTabChange(e)} + activeIndex={activeIndex} + // className="main-bg" + pt={{ + nav: { className: 'flex flex-wrap justify-around' }, + panelContainer: { className: 'flex-1 pl-4' } + }} + > + {/* COURSE MOBILE */} + - {/* COURSE MOBILE */} - - {/* mobile table section */} - {hasCourses ? ( - <> -
    -
    - - - ) : ( - <> -
    -
    - - handlePageChange(e.page + 1)} - template={media ? 'FirstPageLink PrevPageLink NextPageLink LastPageLink' : 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink'} + {/* mobile table section */} + {hasCourses ? ( + <> +
    +
    + -
    + handlePageChange(e.page + 1)} + template={media ? 'FirstPageLink PrevPageLink NextPageLink LastPageLink' : 'FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink'} + /> + )} + - {/* table section */} - {hasCourses ? ( -

    {'Курсы отсутствуют'}

    - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : ( -
    -
    - - rowIndex + 1} header="#" style={{ width: '20px' }}> - ( -
    - -
    - )} - body={imageBodyTemplate} - >
    - -
    Название
    } - body={(rowData) => ( - { - setGlobalLoading(true); - setTimeout(() => { - setGlobalLoading(false); - }, 1200); - setMainCourseId(rowData.id); - }} - key={rowData.id} - className="max-w-sm break-words" - > - {rowData.title} - - )} - >
    -
    Статус
    } - body={(rowData) => ( - - )} - >
    -
    Балл
    } body={(rowData) => {rowData.max_score}}>
    -
    На рассмотрение
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => ( - <> - - - )} - >
    -
    Публикация
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => { - // if(rowData?.audience_type?.name === 'lock'){ - return rowData.is_published ? : ; - // } - // return - }} - >
    -
    Потоки
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => ( - <> - - - )} - >
    - ( -
    - -
    - )} - /> -
    -
    -
    - handlePageChange(e.page + 1)} - template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" + {/* STREAMS MOBILE */} + +
    + +
    +
    + +
    + ) : ( + // Десктопный курс +
    +
    + {/* info section */} + {skeleton ? ( + + ) : ( +
    +

    Курсы

    +
    + )} + + {/* table section */} + {hasCourses ? ( +

    {'Курсы отсутствуют'}

    + ) : ( + <> + {skeleton ? ( +
    + +
    + ) : ( +
    +
    + + rowIndex + 1} header="#" style={{ width: '20px' }}> + ( +
    + +
    + )} + body={imageBodyTemplate} + >
    + +
    Название
    } + body={(rowData) => ( + { + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 1200); + setMainCourseId(rowData.id); + }} + key={rowData.id} + className="max-w-sm break-words" + > + {rowData.title} + + )} + >
    +
    Статус
    } + body={(rowData) => ( + + )} + >
    +
    Балл
    } body={(rowData) => {rowData.max_score}}>
    +
    На рассмотрение
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => ( + <> + + + )} + >
    +
    Публикация
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => { + // if(rowData?.audience_type?.name === 'lock'){ + return rowData.is_published ? : ; + // } + // return + }} + >
    +
    Потоки
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => ( + <> + + + )} + >
    + ( +
    + +
    + )} /> -
    +
    - )} - - )} -
    - {/* STREAMS SECTION */} -
    - contextFetchCourse(pageState)} toggleIndex={() => {}} /> -
    +
    + handlePageChange(e.page + 1)} + template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" + /> +
    +
    + )} + + )}
    - )} -
    + {/* STREAMS SECTION */} +
    + + {/* contextFetchCourse(pageState)} toggleIndex={()=> {}} /> */} +
    +
    + )}
    + {/* modal window */} { - if (selectedCourse) { + if (selectedCourse) { handleAddOpenTypes(item?.id, selectedCourse); } }} diff --git a/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx new file mode 100644 index 00000000..e8c608dc --- /dev/null +++ b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx @@ -0,0 +1,639 @@ +'use client'; + +import { NotFound } from '@/app/components/NotFound'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import { statusView } from '@/services/notifications'; +import { fetchItemsLessons, fetchStudentSteps, fetchSubjects, stepPractica, stepTest } from '@/services/studentMain'; +import { docValueType } from '@/types/docValueType'; +import { lessonType } from '@/types/lessonType'; +import { mainStepsType } from '@/types/mainStepType'; +import { useParams } from 'next/navigation'; +import { Button } from 'primereact/button'; +import { ProgressSpinner } from 'primereact/progressspinner'; +import { useContext, useEffect, useState } from 'react'; +import dynamic from 'next/dynamic'; +import { fetchActiveStepsDetail } from '@/services/openCourse'; + +export default function ActiveLessonDetail() { + // types + interface subjectType { + id_curricula: number; + course_ids: number[]; + streams: number[]; + } + + const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { + ssr: false + }); + + const { course_id, lesson_id, step_id } = useParams(); + const params = new URLSearchParams(); + + const media = useMediaQuery('(max-width: 640px)'); + const showError = useErrorMessage(); + const { setMessage, setContextNewStudentThemes, contextNotificationId, setContextNotificationId } = useContext(LayoutContext); + + const [steps, setSteps] = useState(null); + const [hasSteps, setHasSteps] = useState(false); + const [progressSpinner, setProgressSpinner] = useState(false); + const [type, setType] = useState(''); + const [practica, setPractica] = useState<{ + content?: { document: string; document_path: string; description: string | null; title: string; link: string; url: string; content: string; answers: [{ text: string; is_correct: boolean; id: number | null }]; score: number }; + } | null>(null); + const [test, setTests] = useState(null); + const [answer, setAnswer] = useState<{ id: number | null; text: string; is_correct: boolean }[] | null>(null); + const [selectedAnswer, setSelectedAnswer] = useState(false); + const [answerCheck, setAnswerCheck] = useState(false); + const [lessons, setLessons] = useState>({ + 1: { semester: { name_kg: '' } } + }); + const [lessonName, setLessonName] = useState(''); + const [courseInfo, setCoursesInfo] = useState<{ title: string; description: string; image: string } | null>(null); + const [main_id, setMain_id] = useState(null); + const [skeleton, setSkeleton] = useState(false); + const [courses, setCourses] = useState< + { + id: number; + connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; + title: string; + description: string; + image: string; + user: { last_name: string; name: string; father_name: string }; + lessons: lessonType[]; + }[] + >([]); + const [docValue, setDocValue] = useState({ + title: '', + description: '', + file: null + }); + + // document + const [document, setDocument] = useState(null); + + // link + const [link, setLink] = useState(null); + + // video + const [video, setVideo] = useState(null); + const [preview, setPreview] = useState(false); + const [videoLink, setVideoLink] = useState(''); + + // fetch lessons + + const handleSteps = async () => { + setSkeleton(true); + const data = await fetchActiveStepsDetail(course_id ? Number(course_id) : null, step_id ? Number(step_id) : null); + console.log(data); + + if (data?.success) { + setHasSteps(false); + // if (data?.courses?.length < 1) { + // setEmptyCourse(true); + // } else { + // setEmptyCourse(false); + // } + setSteps(data?.step); + } else { + setHasSteps(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + setSkeleton(false); + }; + + // const handleStatusView = async (notification_id: number | null) => { + // console.log(notification_id); + // if (notification_id) { + // const data = await statusView(Number(notification_id)); + // console.log(data); + + // setContextNotificationId(null); + // } + // }; + + // const handleStep = async () => { + // const data = await fetchStudentSteps(Number(id), Number(stream_id)); + // if (data?.success) { + // if (!data?.step?.content || data?.step?.content == null) { + // setHasSteps(true); + // } else { + // setHasSteps(false); + // setMainSteps(data.step); + // } + // } else { + // setHasSteps(true); + // } + // }; + + // Запрос курса, типа уроков (лк,лб) + // const handleFetchSubject = async (subject: subjectType) => { + // params.append('id_curricula', String(subject.id_curricula)); + // subject.streams.forEach((i) => params.append('streams[]', String(i))); + // subject.course_ids.forEach((i) => params.append('course_ids[]', String(i))); + + // const data = await fetchSubjects(params); + // // console.log(data); + + // if (data) { + // setCourses(data); + // // setHasThemes(false); + // } else { + // // setHasThemes(true); + // setMessage({ + // state: true, + // value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + // }); + // if (data?.response?.status) { + // showError(data.response.status); + // } + // } + // }; + + const handleVideoCall = (value: string | null) => { + setPreview(true); + + if (!value) { + setPreview(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при воспроизведении видео', detail: '' } + }); + } + + const url = new URL(typeof value === 'string' ? value : ''); + let videoId = null; + + if (url.hostname === 'youtu.be') { + // короткая ссылка, видео ID — в пути + videoId = url.pathname.slice(1); // убираем первый слеш + } else if (url.hostname === 'www.youtube.com' || url.hostname === 'youtube.com') { + // стандартная ссылка, видео ID в параметре v + videoId = url.searchParams.get('v'); + } + + if (!videoId) { + setPreview(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при воспроизведении видео', detail: '' } + }); + return null; // не удалось получить ID + } + // return `https://www.youtube.com/embed/${videoId}`; + setVideoLink(`https://www.youtube.com/embed/${videoId}`); + setPreview(false); + // setVisisble(true); + }; + + const handleAddTest = async () => { + setProgressSpinner(true); + const isCorrect = answer?.filter((item) => item.is_correct); + const data = await stepTest(steps && steps?.id, steps?.connections?.id_stream, (isCorrect && isCorrect[0]?.id) || null); + + if (data?.success) { + setProgressSpinner(false); + setMessage({ + state: true, + value: { severity: 'success', summary: '', detail: data?.message } + }); + handleSteps(); + } else { + setProgressSpinner(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при отправке ответа!', detail: '' } + }); + handleSteps(); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + }; + + const handleAddPractica = async () => { + setProgressSpinner(true); + const data = await stepPractica(steps && steps?.id, steps?.connections?.id_stream, docValue.file); + if (data?.success) { + setProgressSpinner(false); + setMessage({ + state: true, + value: { severity: 'success', summary: '', detail: data?.message } + }); + handleSteps(); + } else { + setProgressSpinner(false); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка при отправке документа!', detail: '' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + }; + + useEffect(() => { + console.log('Step ', steps); + + // const lesson = steps.find((item) => item.id === Number(id)); + // console.log(lesson, lesson?.type); + if (steps?.type.name === 'document') { + setType(steps?.type.name); + setDocument(steps); + } else if (steps?.type.name === 'link') { + setType(steps?.type.name); + setLink(steps); + } else if (steps?.type.name === 'practical') { + setType(steps?.type.name); + setPractica(steps); + } else if (steps?.type.name === 'test') { + setType(steps?.type.name); + setTests(steps); + setAnswer(steps?.content?.answers || []); + } else if (steps?.type.name === 'video') { + setType(steps?.type.name); + setVideo(steps); + } + }, [steps]); + + useEffect(() => { + if (video?.content?.link) { + handleVideoCall(video.content.link); + } + }, [video]); + + useEffect(() => { + if (lesson_id) { + const forLesson = courses?.find((item) => { + return item?.lessons.find((j) => { + if (j?.id === Number(lesson_id)) { + setLessonName(j?.title || ''); + } + return j?.id === Number(lesson_id); + }); + }); + if (forLesson && forLesson?.lessons) { + setContextNewStudentThemes(forLesson?.lessons); + } + setCoursesInfo(forLesson || null); + } + }, [courses]); + + useEffect(() => { + const check = answer?.find((item) => item?.is_correct); + if (check) { + setAnswerCheck(true); + } else { + setAnswerCheck(false); + } + }, [answer]); + + useEffect(() => { + if (test?.answer_id && test?.answer_id != null) { + setSelectedAnswer(true); + } else { + setSelectedAnswer(false); + } + }, [test]); + + useEffect(() => { + handleSteps(); + }, []); + + const docSection = ( +
    +
    +
    + {steps?.type?.title} + +
    +
    + {document?.content?.title} + {document?.content?.description &&
    {document?.content?.description &&
    {document?.content?.description}
    }
    } +
    +
    + {/* +
    +
    + +
    + +
    +
    + ); + + const linkSection = ( +
    +
    +
    + {steps?.type?.title} + +
    +
    + {link?.content?.title} + {link?.content?.description &&
    {link?.content?.description &&
    {link?.content?.description}
    }
    } +
    +
    + Ссылка: + + {link?.content?.url} + +
    +
    +
    + ); + + const practicaSection = ( +
    +
    +
    + {steps?.type?.title} + +
    +
    + Балл за задание: + {`${steps?.score}`} +
    +
    + +
    + {practica?.content?.title} + +
    + {practica?.content?.description &&
    } + +
    +
    + {practica?.content?.document_path && practica?.content.document_path.toLowerCase().includes('pdf') && ( + <> + Документ: + + + )} +
    + +
    + {practica?.content?.url && ( +
    + Ссылка: + {practica?.content.url && ( + + {practica?.content.url} + + )} +
    + )} +
    +
    +
    +
    + + {/*
    + Сообщения от преподавателя + +
      +
    • Loremipsumdolorsitametconsecteturadipisicingelit. Mollitia, illum.
    • +
    • Lorem ipsum dolor sit amet consectetur adipisicing elit. Mollitia, illum.
    • +
    +
    */} + + {steps?.chills ? ( + Задание выполнено + ) : ( +
    + Задание после изучения материала, загрузи свой файл с решением. +
    + { + const file = e.target.files?.[0]; + if (file) { + const maxSize = 10 * 1024 * 1024; + + if (file.size > maxSize) { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Файл слишком большой!', detail: 'Разрешено максимум 10 MB.' } + }); + } else { + setDocValue((prev) => ({ + ...prev, + file: file + })); + } + } + }} + /> +
    +
    + {progressSpinner && } +
    +
    + )} +
    + ); + + const testSection = ( +
    + {progressSpinner && ( +
    + +
    + )} +
    +
    +
    + {steps?.type?.title} + +
    +
    + Балл за задание: + {`${steps?.score}`} +
    +
    +
    + {test?.content?.content} +
    + {test?.content?.answers.map((item, index) => { + return ( +
    + {selectedAnswer ? ( + <> + +
    {item.text}
    + + ) : ( + <> + +
    {item.text}
    + + )} +
    + ); + })} +
    +
    +
    + + {steps?.count_attempt && steps?.count_attempt >= 3 ? ( + Задание выполнено + ) : ( +
    +
    + )} +
    + ); + + const videoSection = ( +
    +
    +
    + {steps?.type?.title} + +
    +
    + {video?.content?.description && ( +
    + {video?.content?.title} + {video?.content?.description &&
    {video?.content?.description &&
    {video?.content?.description}
    }
    } +
    + )} +
    +
    + {preview ? ( +
    +
    + +
    + Видео +
    + ) : ( + + )} +
    +
    +
    + ); + + return ( +
    +
    +
    +
    0 ? 'justify-around flex-col sm:flex-row' : 'justify-center'} items-center`}> +
    +

    + {courseInfo?.title} +

    +
    +

    Тема:

    +

    {lessonName ? lessonName : '------'}

    +
    + {courseInfo?.description} +
    + {courseInfo?.image && courseInfo?.image.length > 0 && ( +
    + +
    + )} +
    +
    +
    + + {hasSteps && } + {type === 'document' && docSection} + {type === 'link' && linkSection} + {type === 'practical' && practicaSection} + {type === 'test' && testSection} + {type === 'video' && videoSection} +
    + ); +} diff --git a/app/(main)/openCourse/activeCourse/[course_id]/page.tsx b/app/(main)/openCourse/activeCourse/[course_id]/page.tsx new file mode 100644 index 00000000..235cc849 --- /dev/null +++ b/app/(main)/openCourse/activeCourse/[course_id]/page.tsx @@ -0,0 +1,177 @@ +'use client'; + +import ActiveStepCard from '@/app/components/lessons/ActiveStepCard'; +import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; +import StudentInfoCard from '@/app/components/lessons/StudentInfoCard'; +import { NotFound } from '@/app/components/NotFound'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import { courseOpen, fetchActiveSteps } from '@/services/openCourse'; +import { lessonStateType } from '@/types/lessonStateType'; +import { mainStepsType } from '@/types/mainStepType'; +import { myMainCourseType } from '@/types/myMainCourseType'; +import { useParams } from 'next/navigation'; +import { Accordion, AccordionTab } from 'primereact/accordion'; +import { useContext, useEffect, useState } from 'react'; + +export default function ActiveCourseDetail() { + const { course_id } = useParams(); + + const { setMessage } = useContext(LayoutContext); + const showError = useErrorMessage(); + const [mainCourse, setMainCourses] = useState(null); + const [lessons, setLessonsValue] = useState([]); + const [emptyCourse, setEmptyCourse] = useState(false); + const [hasCourses, setHasCourses] = useState(false); + const [themeShow, setThemeShow] = useState(false); + const [skeleton, setSkeleton] = useState(false); + const [hasSteps, setHasSteps] = useState(false); + const [steps, setSteps] = useState([]); + const [activeIndex, setActiveIndex] = useState(0); + + const handleCourseOpen = async () => { + setSkeleton(true); + const data = await courseOpen(course_id ? Number(course_id) : null); + console.log(data); + + if (data?.success) { + setHasCourses(false); + if (data?.courses?.length < 1) { + setEmptyCourse(true); + } else { + setEmptyCourse(false); + } + setMainCourses(data.course); + setLessonsValue(data.course?.lessons); + } else { + setHasCourses(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + setSkeleton(false); + }; + + const handleSteps = async (lesson_id: number | null) => { + setSkeleton(true); + const data = await fetchActiveSteps(course_id ? Number(course_id) : null, lesson_id); + console.log(data); + + if (data?.success) { + setHasSteps(false); + // if (data?.courses?.length < 1) { + // setEmptyCourse(true); + // } else { + // setEmptyCourse(false); + // } + setSteps(data?.steps); + } else { + setHasSteps(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + setSkeleton(false); + }; + + useEffect(() => { + handleCourseOpen(); + }, []); + + useEffect(() => { + if (lessons?.length > 0 && [activeIndex as number]) { + const lessonId = lessons[activeIndex as number]?.id; + if (lessonId) { + handleSteps(lessonId); + } + } + }, [lessons, activeIndex]); + + return ( +
    + {themeShow ? ( + + ) : ( +
    +

    + Название курса: {mainCourse?.title} +

    + setActiveIndex(e.index)}> + {lessons?.map((item) => { + const content = steps.filter((j) => { + return j.content != null; + }); + + return ( + +
    + {hasSteps ? ( +

    Данных нет

    + ) : content?.length > 0 ? ( + content.map((i, idx) => { + if (i.content) { + return ( +
    + { + handleTabChange(courses, course.id, accordionIndex)} + fetchProp={() => {}} + // contentId={i?.content?.id} + // id_parent={i?.id_parent || null} + // forumValueAdd={() => { + // setForumValues({ description: i?.content.title || '', userInfo: { userName: course?.user?.name, userLastName: course?.user?.last_name } }); + // localStorage.setItem( + // 'forumValues', + // JSON.stringify({ description: i?.content.title || '', userInfo: { userName: course?.user?.name, userLastName: course?.user?.last_name } }) + // ); + // } + lessonItem={item} + stepItem={i} + /> + } +
    + ); + } + }) + ) : ( +

    Данных нет

    + )} +
    +
    + ); + })} +
    +
    + )} +
    + ); +} diff --git a/app/(main)/openCourse/activeCourse/page.tsx b/app/(main)/openCourse/activeCourse/page.tsx new file mode 100644 index 00000000..e3a64319 --- /dev/null +++ b/app/(main)/openCourse/activeCourse/page.tsx @@ -0,0 +1,71 @@ +'use client'; + +import OpenCourseCard from '@/app/components/cards/OpenCourseCard'; +import useErrorMessage from '@/hooks/useErrorMessage'; +import { LayoutContext } from '@/layout/context/layoutcontext'; +import { fetchActiveCourses, fetchOpenCourses } from '@/services/openCourse'; +import { myMainCourseType } from '@/types/myMainCourseType'; +import { useContext, useEffect, useState } from 'react'; + +export default function ActiveCourseList() { + const { setMessage } = useContext(LayoutContext); + const showError = useErrorMessage(); + const [coursesValue, setValueCourses] = useState([]); + const [emptyCourse, setEmptyCourse] = useState(false); + const [hasCourses, setHasCourses] = useState(false); + const [skeleton, setSkeleton] = useState(false); + + const handleFetchActiveCourse = async () => { + setSkeleton(true); + const data = await fetchActiveCourses(); + console.log(data); + + if (data?.success) { + setHasCourses(false); + + if (data?.courses?.length < 1) { + setEmptyCourse(true); + } else { + setEmptyCourse(false); + } + setValueCourses(data.courses); + } else { + setHasCourses(true); + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + setSkeleton(false); + }; + + useEffect(() => { + handleFetchActiveCourse(); + }, []); + + return ( +
    +

    Мои активные курсы

    +
    + {coursesValue?.map((item) => { + return ( +
    + {/* */} + {}} courseSignup={()=> {}} /> +
    + ); + })} +
    +
    + ); +} diff --git a/app/(main)/openCourse/page.tsx b/app/(main)/openCourse/page.tsx index 2dc5f920..a4bd7f56 100644 --- a/app/(main)/openCourse/page.tsx +++ b/app/(main)/openCourse/page.tsx @@ -6,11 +6,12 @@ import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; -import { fetchOpenCourses, openCourseShow } from '@/services/openCourse'; +import { fetchOpenCourses, openCourseShow, openCourseSignup, signupList } from '@/services/openCourse'; import { myMainCourseType } from '@/types/myMainCourseType'; import { Button } from 'primereact/button'; import { InputText } from 'primereact/inputtext'; import { Paginator } from 'primereact/paginator'; +import { ProgressSpinner } from 'primereact/progressspinner'; import { Sidebar } from 'primereact/sidebar'; import { useContext, useEffect, useState } from 'react'; @@ -18,6 +19,7 @@ export default function OpenCourse() { const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); + const params = new URLSearchParams(); const [mainCourse, setMainCourse] = useState([]); const [coursesValue, setValueCourses] = useState([]); const [courseDetail, setCourseDetail] = useState(null); @@ -34,6 +36,8 @@ export default function OpenCourse() { }); const [searchController, setSearchController] = useState(false); const [showVisisble, setShowVisible] = useState(false); + const [progressSpinner, setProgressSpinner] = useState(false); + const [sendSignupList, setSendSignupList] = useState(false); const handleFetchOpenCourse = async (page = 1, audence_type_id: number | string, search: string) => { setSkeleton(true); @@ -49,6 +53,16 @@ export default function OpenCourse() { setEmptyCourse(false); } setValueCourses(data.data); + const list: any | null = await handleSignupList(data?.data); + if (list) { + console.warn(list); + setValueCourses((prev) => + prev.map((item) => ({ + ...item, + is_signed: list.signed_courses?.includes(item.id) + })) + ); + } setPagination({ currentPage: data.current_page, total: data?.total, @@ -80,11 +94,9 @@ export default function OpenCourse() { const data = await openCourseShow(course_id); console.log(data); - if (data && Array.isArray(data)) { - // setHasCourses(false); - setCourseDetail(data[0]); + if (data && Object.values(data)?.length) { + setCourseDetail(data); } else { - // setHasCourses(true); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } @@ -103,6 +115,62 @@ export default function OpenCourse() { setSkeleton(false); }; + // signup courses list + const handleSignupList = async (course: any) => { + course?.forEach((i:{id:number}) => params.append('course_Ids[]', String(i?.id))); + const data = await signupList(params); + + if (data && data?.signed_courses) { + return data; + } else { + return null; + } + }; + + // signUp + const сourseSignup = async (course_id: number) => { + const data = await openCourseSignup(course_id); + console.log(data); + + if (data?.success) { + // handleFetchOpenCourse(1, free === 'paid' ? '3' : free === 'free' ? '2' : '', search); + const list: any | null = await handleSignupList(coursesValue); + if (list) { + setValueCourses((prev) => + prev.map((item) => ({ + ...item, + is_signed: list.signed_courses.includes(item.id) + })) + ); + setMessage({ + state: true, + value: { severity: 'success', summary: list?.message || 'Успешное добавление!', detail: '' } + }); + setValueCourses((prev) => + prev.map((item) => ({ + ...item, + is_signed: list.signed_courses?.includes(item.id) + })) + ); + } + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: 'Повторите позже' } + }); + if (data?.response?.status) { + if (data?.response?.status == '400') { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка!', detail: data?.response?.data?.message } + }); + } else { + showError(data.response.status); + } + } + } + }; + const clearFilter = () => { setFree(null); handleFetchOpenCourse(1, '', ''); @@ -116,21 +184,54 @@ export default function OpenCourse() { }; useEffect(() => { + setProgressSpinner(true); if (search?.length === 0 && searchController) { handleFetchOpenCourse(1, free === 'paid' ? '3' : free === 'free' ? '2' : '', search); setSearchController(false); + setProgressSpinner(false); } - if (search?.length < 2) return; + if (search?.length < 2) { + setProgressSpinner(false); + return; + } setSearchController(true); const delay = setTimeout(() => { handleFetchOpenCourse(1, free === 'paid' ? '3' : free === 'free' ? '2' : '', search); + setProgressSpinner(false); }, 1000); - return () => clearTimeout(delay); + return () => { + clearTimeout(delay); + }; }, [search]); + useEffect(() => { + if (coursesValue?.length) { + setSendSignupList(true); + } else { + setSendSignupList(false); + } + }, [coursesValue]); + + useEffect(() => { + const handleSendSingup = async () => { + const list: any | null = await handleSignupList(coursesValue); + if (list) { + setValueCourses((prev) => + prev.map((item) => ({ + ...item, + is_signed: list.signed_courses?.includes(item.id) + })) + ); + } + }; + if (sendSignupList) { + handleSendSingup(); + } + }, [sendSignupList]); + useEffect(() => { handleFetchOpenCourse(1, '', ''); }, []); @@ -182,10 +283,10 @@ export default function OpenCourse() {
    - {/*
    */} - setSearch(e.target.value)} className="w-full p-inputtext-sm p-inputtext-rounded" /> - {/*
    */} +
    + setSearch(e.target.value)} className="w-full p-inputtext-sm p-inputtext-rounded" /> +
    {progressSpinner && }
    +
    @@ -206,7 +307,7 @@ export default function OpenCourse() { return (
    {/* */} - +
    ); })} @@ -224,7 +325,7 @@ export default function OpenCourse() { )} setShowVisible(false)}> - {skeleton ? : courseDetail ? : Данные не доступны} + {skeleton ? : courseDetail ? : Данные не доступны}
    ); diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 5187f7aa..87a11fc2 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -20,13 +20,13 @@ export default function PdfUrlViewer() { return (
    -
    +
    -
    +
    {/* */}
    diff --git a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx index cf980086..9a94a600 100644 --- a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx +++ b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/[student_id]/[lesson_id]/[step_id]/page.tsx @@ -5,27 +5,31 @@ import LessonInfoCard from '@/app/components/lessons/LessonInfoCard'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; +import { fetchCourseInfo } from '@/services/courses'; import { statusView } from '@/services/notifications'; import { fetchElement } from '@/services/steps'; import { fetchStudentCalendar, fetchStudentDetail, pacticaDisannul, pacticaScoreAdd } from '@/services/streams'; import { ContributionDay } from '@/types/ContributionDay'; +import { CourseType } from '@/types/courseType'; import { lessonType } from '@/types/lessonType'; import { mainStepsType } from '@/types/mainStepType'; +import { User } from '@/types/user'; import { useParams } from 'next/navigation'; import { Accordion, AccordionTab } from 'primereact/accordion'; import { useContext, useEffect, useState } from 'react'; export default function StudentCheck() { - - const { connect_id, stream_id, student_id, lesson_id, step_id } = useParams(); + const { cource_id, connect_id, stream_id, student_id, lesson_id, step_id } = useParams(); const params = useParams(); - // console.log(params); + // console.log(params, cource_id, connect_id, stream_id, student_id, lesson_id, step_id); const { setMessage, contextNotificationId, setContextNotificationId } = useContext(LayoutContext); const showError = useErrorMessage(); const [mainSkeleton, mainSetSkeleton] = useState(false); const [lessons, setLessons] = useState(null); + const [student, setStudent] = useState(null); + const [courseShow, setCourseShow] = useState(null); const [hasSteps, setHasSteps] = useState(false); const [element, setElement] = useState<{ content: any | null; step: mainStepsType } | null>(null); const [contribution, setContribution] = useState(null); @@ -33,15 +37,26 @@ export default function StudentCheck() { const [activeIndex, setActiveIndex] = useState(0); + const handleCourseShow = async () => { + mainSetSkeleton(true); + const data = await fetchCourseInfo(cource_id ? Number(cource_id) : null); + if (data?.success) { + setCourseShow(data?.course); + } + mainSetSkeleton(false); + }; + const handleFetchStreams = async () => { mainSetSkeleton(true); const data = await fetchStudentDetail(lesson_id ? Number(lesson_id) : null, connect_id ? Number(connect_id) : null, stream_id ? Number(stream_id) : null, student_id ? Number(student_id) : null, step_id ? Number(step_id) : null); - + console.log(data); + if (data?.success) { // handleStatusView(); setHasSteps(false); mainSetSkeleton(false); setLessons(data?.lessons); + setStudent(data?.student); } else { mainSetSkeleton(false); setHasSteps(true); @@ -58,8 +73,6 @@ export default function StudentCheck() { const handleStatusView = async (notification_id: number | null) => { if (notification_id) { const data = await statusView(Number(notification_id)); - console.log(data); - setContextNotificationId(null); } }; @@ -128,7 +141,7 @@ export default function StudentCheck() { } }; - const handlePracticaDisannul = async (id_curricula:number, course_id:number, id_stream:number, id:number, steps_id:number, message: string) => { + const handlePracticaDisannul = async (id_curricula: number, course_id: number, id_stream: number, id: number, steps_id: number, message: string) => { const data = await pacticaDisannul(id_curricula, course_id, id_stream, Number(student_id), steps_id, message); if (data?.success) { @@ -156,6 +169,7 @@ export default function StudentCheck() { }; useEffect(() => { + handleCourseShow(); handleFetchCalendar(); handleFetchStreams(); @@ -183,7 +197,12 @@ export default function StudentCheck() {
    ) : (
    - + + {courseShow && courseShow?.title ?

    + {courseShow?.title} +

    : ''} + +

    {/* Название курса: {courseInfo.title} */}

    setActiveIndex(e.index)}> {lessons?.map((item) => { @@ -219,7 +238,9 @@ export default function StudentCheck() { skeleton={skeleton} getValues={() => handleFetchElement(i?.lesson_id, i?.id)} addPracticaScore={(score) => handlePracticaScoreAdd(i?.id, score)} - addPracticaDisannul={(id_curricula:number, course_id:number, id_stream:number, id:number, steps_id:number, message: string) => handlePracticaDisannul(id_curricula, course_id, id_stream, id, steps_id, message)} + addPracticaDisannul={(id_curricula: number, course_id: number, id_stream: number, id: number, steps_id: number, message: string) => + handlePracticaDisannul(id_curricula, course_id, id_stream, id, steps_id, message) + } isOpened={i?.is_opened || false} item={i} /> diff --git a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx index 6ab46a86..b8158e42 100644 --- a/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx +++ b/app/(main)/students/[cource_id]/[connect_id]/[stream_id]/page.tsx @@ -1,5 +1,6 @@ 'use client'; +import MyDateTime from '@/app/components/MyDateTime'; import { NotFound } from '@/app/components/NotFound'; import GroupSkeleton from '@/app/components/skeleton/GroupSkeleton'; import useErrorMessage from '@/hooks/useErrorMessage'; @@ -7,6 +8,7 @@ import { useMediaQuery } from '@/hooks/useMediaQuery'; import { LayoutContext } from '@/layout/context/layoutcontext'; import { fetchStreams, fetchStreamStudents } from '@/services/streams'; import { mainStreamsType } from '@/types/mainStreamsType'; +import { OptionsType } from '@/types/OptionsType'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; @@ -27,6 +29,16 @@ export default function StudentList() { const { cource_id, connect_id, stream_id } = useParams(); const media = useMediaQuery('(max-width: 640px)'); + const options: OptionsType = { + year: '2-digit', + month: '2-digit', // 'long', 'short', 'numeric' + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false // 24-часовой формат + }; + // functions const toggleSkeleton = () => { setSkeleton(true); @@ -57,7 +69,7 @@ export default function StudentList() { toggleSkeleton(); if (data) { setHasList(false); - setStudentList(data); + setStudentList(data); } else { setHasList(true); setMessage({ @@ -86,9 +98,9 @@ export default function StudentList() { } } }, [streams]); - + return ( -
    +
    {skeleton ? ( ) : ( @@ -107,7 +119,7 @@ export default function StudentList() { {/* {stream?.teacher?.name} */}
    - Язык обучения: + Язык обучения: {stream?.language?.name}
    @@ -158,7 +170,7 @@ export default function StudentList() { {rowData?.score && rowData.score > 0 ? (
    30 ? 'text-[var(--greenColor)] p-1 w-[25px] text-center' : 'text-amber-400 p-1 w-[25px] text-center '}`}>{rowData.score} - + {/*
    ) : ( @@ -173,7 +185,8 @@ export default function StudentList() { // style={{ width: '20%' }} body={(rowData) => (
    - {rowData?.last_movement ? new Date(rowData.last_movement).toISOString().slice(0, 19).replace('T', ' ') : } + {/* {rowData?.last_movement ? new Date(rowData.last_movement).toISOString().slice(0, 19).replace('T', ' ') : } */} + {rowData?.last_movement ? : }
    )} /> @@ -182,9 +195,15 @@ export default function StudentList() { header="Выполненные действия" body={(rowData) => (
    - {rowData?.last_movement &&
    )} /> diff --git a/app/(main)/unVerifed/page.tsx b/app/(main)/unVerifed/page.tsx index d7616927..4f25dbe7 100644 --- a/app/(main)/unVerifed/page.tsx +++ b/app/(main)/unVerifed/page.tsx @@ -21,6 +21,15 @@ export default function UnVerifed() { const [hasThemes, setHasThemes] = useState(false); const [tasks, setTasks] = useState(null); + const options: OptionsType = { + year: '2-digit', + month: 'short', // 'long', 'short', 'numeric' + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false // 24-часовой формат + }; + const fetchVerifedSteps = async () => { const data = await unVerifedSteps(); @@ -47,15 +56,6 @@ export default function UnVerifed() { } }; - const options: OptionsType = { - year: '2-digit', - month: 'short', // 'long', 'short', 'numeric' - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - hour12: false // 24-часовой формат - }; - useEffect(() => { fetchVerifedSteps(); }, []); @@ -96,7 +96,9 @@ export default function UnVerifed() {
    -

    +

    + +

    diff --git a/app/(student)/teaching/[subject_id]/page.tsx b/app/(student)/teaching/[subject_id]/page.tsx index 51c24963..3912a60b 100644 --- a/app/(student)/teaching/[subject_id]/page.tsx +++ b/app/(student)/teaching/[subject_id]/page.tsx @@ -226,7 +226,7 @@ export default function StudentLesson() { ) : ( <> -

    Список курсов

    +

    Список курсов

    {skeleton ? (
    @@ -284,6 +284,7 @@ export default function StudentLesson() { type: { name: string; logo: string }; content: { id: number; title: string; description: string; url: string; document: string; document_path: string }; id_parent?: number | null; + score: number; }, idx ) => { @@ -315,6 +316,7 @@ export default function StudentLesson() { JSON.stringify({ description: item?.content.title || '', userInfo: { userName: course?.user?.name, userLastName: course?.user?.last_name } }) ); }} + lessonItem={item} />
    ); diff --git a/app/components/Contribution.tsx b/app/components/Contribution.tsx index 1b5b1681..1754334c 100644 --- a/app/components/Contribution.tsx +++ b/app/components/Contribution.tsx @@ -2,12 +2,14 @@ import React from 'react'; import HeatMap from '@uiw/react-heat-map'; // <-- Новый импорт! import { ContributionDay } from '@/types/ContributionDay'; +import { User } from '@/types/user'; // Интерфейс для данных остается прежним (но у HeatMap используется prop 'value') -const ActivityHeatmap = ({ value, recipient }: { value: ContributionDay[] | null; recipient: string }) => { +const ActivityHeatmap = ({ value, recipient, userInfo }: { value: ContributionDay[] | null; recipient: string, userInfo: User | null}) => { const months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек']; const weekdays = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']; + console.log(userInfo); // const start = new Date('2025-01-01'); // 1 января // const end = new Date('2025-12-31'); // 31 декабря @@ -18,8 +20,13 @@ const ActivityHeatmap = ({ value, recipient }: { value: ContributionDay[] | null return (
    -

    - {recipient} +

    + {recipient}: + {userInfo &&
    + {userInfo?.last_name} + {userInfo?.name && userInfo?.name[0] + '.'} + {userInfo?.father_name && userInfo?.father_name[0] + '.'} +
    }

    {value && ( void }) { +export default function OpenCourseCard({ + course, + signBtn, + link, + courseShowProp, + courseSignup +}: { + course: myMainCourseType; + signBtn: boolean; + link: { url: string | null; status: boolean }; + courseShowProp: (course_id: number) => void; + courseSignup: (course_id: number) => void; +}) { const options: OptionsType = { year: '2-digit', month: 'short', // 'long', 'short', 'numeric' @@ -31,14 +40,14 @@ export default function OpenCourseCard({ course, courseShowProp }: { course: myM if (typeof image === 'string') { return ( -
    +
    Course image
    ); } return ( -
    +
    Course image
    ); @@ -48,8 +57,9 @@ export default function OpenCourseCard({ course, courseShowProp }: { course: myM
    {/* header section */}
    -
    +
    {imageBodyTemplate(course)} + {/* {titlePos === 'left' && courseShowProp(course?.id)}>{course?.title}} */}
    {course?.audience_type?.name === 'open' ? 'Бесплатный' : course?.audience_type?.name === 'wallet' ? 'Платный' : ''}
    - courseShowProp(course?.id)}>{course?.title} + {link.status ? ( + + courseShowProp(course?.id)}> + {course?.title} + + + ) : ( + courseShowProp(course?.id)}> + {course?.title} + + )}
    -
    {/* data */} -
    +
    diff --git a/app/components/cards/OpenCourseShowCard.tsx b/app/components/cards/OpenCourseShowCard.tsx index 677ce031..796ef959 100644 --- a/app/components/cards/OpenCourseShowCard.tsx +++ b/app/components/cards/OpenCourseShowCard.tsx @@ -5,7 +5,7 @@ import MyDateTime from '../MyDateTime'; import { myMainCourseType } from '@/types/myMainCourseType'; import { Button } from 'primereact/button'; -export default function OpenCourseShowCard({ course }: { course: myMainCourseType }) { +export default function OpenCourseShowCard({ course, courseSignup }: { course: myMainCourseType; courseSignup: (id: number) => void }) { const options: OptionsType = { year: '2-digit', month: 'short', // 'long', 'short', 'numeric' @@ -15,6 +15,8 @@ export default function OpenCourseShowCard({ course }: { course: myMainCourseTyp hour12: false // 24-часовой формат }; + console.log(course); + return (
    {/* header section */} @@ -33,17 +35,23 @@ export default function OpenCourseShowCard({ course }: { course: myMainCourseTyp
    Автор: -
    +
    {course?.user?.last_name} {course?.user?.name}
    -
    + // ) : ( + //
    + // {progressSpinner && } + // {type === 'test' || type === 'practical' ? ( + // + //
    + // )} + //
    + // ); + + const docCard = ( +
    +
    +
    +
    + +
    + videoStart && videoStart(video_link || '')} + className="cursor-pointer max-w-[800px] text-[16px] break-words hover:underline" + > + {title} + +
    +
    + {/*
    {cheelseBtn('')}
    */} +
    + ); + + const linkCard = ( +
    +
    +
    + +
    +
    + videoStart && videoStart(video_link || '')} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > + {title} + +
    +
    + {/*
    {cheelseBtn('')}
    */} +
    + ); + + const videoCard = ( +
    +
    +
    + +
    +
    + videoStart && videoStart(video_link || '')} + className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" + > + {title} + +
    +
    + {/*
    {cheelseBtn('')}
    */} +
    + ); + + const testCard = ( +
    +
    +
    + +
    +
    + + Тест + +
    +
    +
    +
    + Балл:{' '} + + {' '} + {0} / {stepItem?.score || 0} + +
    + {/*
    {cheelseBtn('practical')}
    */} +
    + {/*
    {cheelseBtn('test')}
    */} +
    + ); + + const practicaCard = ( +
    +
    +
    + +
    + + Практическое задание + +
    +
    +
    + Балл:{' '} + + {' '} + + {' '} + {0} / {stepItem?.score || 0} + + +
    + {/*
    {cheelseBtn('practical')}
    */} +
    +
    + ); + + const forumCard = ( +
    +
    +
    + +
    +
    + {/* + Оставьте отзыв или задайте вопрос по материалам урока + */} +
    +
    +
    +
    + ); + + return ( +
    +
    {type === 'document' && docCard}
    +
    {type === 'link' && linkCard}
    +
    {type === 'video' && videoCard}
    +
    {type === 'test' && testCard}
    +
    {type === 'practical' && practicaCard}
    + {/*
    {type === 'forum' && forumCard}
    */} +
    + ); +} diff --git a/app/components/lessons/LessonTest.tsx b/app/components/lessons/LessonTest.tsx index 856a9038..da00d9b5 100644 --- a/app/components/lessons/LessonTest.tsx +++ b/app/components/lessons/LessonTest.tsx @@ -470,10 +470,6 @@ export default function LessonTest({ setTestValue({ title: '', score: 0, aiCreate:false }); }, [element]); - useEffect(()=> { - console.log(testValue); - },[testValue]); - return (
    void; // test?: { content: string; answers: { id: number | null; text: string; is_correct: boolean }[]; score: number | null }; - streams: { id: number; connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; title: string; description: string; user: { last_name: string; name: string; father_name: string }; lessons: lessonType[] }; + streams: { id: number; connections: { subject_type: string; id: number; user_id: number | null; id_stream: number }[]; title: string; description: string; user: { last_name: string; name: string; father_name: string }; lessons: lessonType[] } | null; lesson: number; stepId: number; subjectId?: string; @@ -45,7 +46,25 @@ export default function StudentInfoCard({ fetchProp: () => void; contentId?: number; id_parent?: number | null; - forumValueAdd?: ()=> void; + forumValueAdd?: () => void; + lessonItem: { + id: number; + chills: boolean; + type: { name: string; logo: string }; + content: { id: number; title: string; description: string; url: string; document: string; document_path: string }; + id_parent?: number | null; + score: number; + + // id: number; + // chills: boolean; + // type: { name: string; logo: string; title: string }; + // content: { id: number; title: string; description: string; url: string; document: string; document_path: string; link: string }; + // lesson_id: number; + // id_parent?: number | null; + // score: number; + // ListAnswer: any; + // is_opened: boolean; + }; }) { const { id_kafedra } = useParams(); // console.log(id_kafedra); @@ -59,7 +78,7 @@ export default function StudentInfoCard({ const handleChills = async () => { const newChills = !chills; setProgressSpinner(true); - const data = await chillsUpdate(stepId, streams?.connections[0]?.id_stream, newChills); + const data = await chillsUpdate(stepId, streams && streams?.connections[0]?.id_stream, newChills); if (data?.success) { setProgressSpinner(false); setMessage({ @@ -88,18 +107,31 @@ export default function StudentInfoCard({
    {progressSpinner && } {type === 'test' || type === 'practical' ? ( - -
    ) : (
    {progressSpinner && } {type === 'test' || type === 'practical' ? ( - +
    videoStart && videoStart(video_link || '')} className="cursor-pointer max-w-[800px] text-[16px] break-words hover:underline" > @@ -138,7 +170,7 @@ export default function StudentInfoCard({
    videoStart && videoStart(video_link || '')} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" > @@ -166,7 +198,7 @@ export default function StudentInfoCard({
    videoStart && videoStart(video_link || '')} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline" > @@ -185,7 +217,7 @@ export default function StudentInfoCard({
    - + Тест
    @@ -200,11 +232,20 @@ export default function StudentInfoCard({
    - + Практическое задание
    -
    {cheelseBtn('practical')}
    +
    +
    + Балл:{' '} + + {' '} + {lessonItem?.score || 0} / {0} + +
    +
    {cheelseBtn('practical')}
    +
    ); diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index 27e9fa02..b63076f5 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -5,11 +5,9 @@ import { LayoutContext } from '@/layout/context/layoutcontext'; import { connectStreams, fetchStreams } from '@/services/streams'; import { Button } from 'primereact/button'; import { DataView } from 'primereact/dataview'; -import { useContext, useEffect, useState } from 'react'; -import { NotFound } from '../NotFound'; +import React, { useContext, useEffect, useState } from 'react'; import GroupSkeleton from '../skeleton/GroupSkeleton'; import { streamsType } from '@/types/streamType'; -import { displayType } from '@/types/displayType'; import { Dialog } from 'primereact/dialog'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; @@ -17,7 +15,7 @@ import { mainStreamsType } from '@/types/mainStreamsType'; import Link from 'next/link'; import useShortText from '@/hooks/useShortText'; -export default function StreamList({ +const StreamList = React.memo(function StreamList({ callIndex, courseValue, isMobile, @@ -27,7 +25,7 @@ export default function StreamList({ callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; - toggleIndex: () => void; + toggleIndex?: () => void; fetchprop: () => void; }) { const [streams, setStreams] = useState([]); @@ -46,7 +44,7 @@ export default function StreamList({ setSkeleton(false); }, 1000); }; - + const profilactor = (data: mainStreamsType[]) => { const newStreams: streamsType[] = []; @@ -80,7 +78,7 @@ export default function StreamList({ const data = await fetchStreams(courseValue ? courseValue?.id : null); // setStreamValues({ stream: [] }); setPendingChanges([]); - + if (data) { profilactor(data); setHasStreams(false); @@ -162,7 +160,7 @@ export default function StreamList({ }); }; - useEffect(() => { + useEffect(() => { toggleSkeleton(); if (courseValue?.id) { handleFetchStreams(); @@ -222,7 +220,7 @@ export default function StreamList({ const listTemplate = (items: mainStreamsType[]) => { if (!items || items.length === 0) return null; - + const hasData = items.some((item) => item.connect_id !== null); if (hasData) { let list = items.map((product, index: number) => { @@ -230,7 +228,7 @@ export default function StreamList({ return itemTemplate(product, index); } }); - + return
    {list}
    ; } return ( @@ -239,12 +237,12 @@ export default function StreamList({
    ); }; - + const footerContent = (
    @@ -393,7 +391,7 @@ export default function StreamList({ ) : ( <>
    - +
    )} @@ -423,4 +421,6 @@ export default function StreamList({ )} ); -} +}); + +export default StreamList; diff --git a/services/openCourse.tsx b/services/openCourse.tsx index 6d1fc635..ce4e1a9f 100644 --- a/services/openCourse.tsx +++ b/services/openCourse.tsx @@ -1,4 +1,4 @@ -import axiosInstance from "@/utils/axiosInstance"; +import axiosInstance from '@/utils/axiosInstance'; export const fetchOpenCourses = async (page: number, audence_type_id: number | string, search: string) => { try { @@ -22,4 +22,78 @@ export const openCourseShow = async (course_id: number) => { console.log('Ошибка загрузки:', err); return err; } -}; \ No newline at end of file +}; + +export const openCourseSignup = async (course_id: number) => { + try { + const res = await axiosInstance.post(`/v1/course/signup`, { course_id: course_id }); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const signupList = async (params: URLSearchParams) => { + try { + const res = await axiosInstance.get(`/v1/course/sign/have?${params}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +// active courses + +export const fetchActiveCourses = async () => { + try { + const res = await axiosInstance.get(`/v1/course/list`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const courseOpen = async (course_id: number | null) => { + try { + const res = await axiosInstance.get(`/v1/course/open?course_id=${course_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchActiveSteps = async (course_id: number | null, lesson_id: number | null) => { + try { + const res = await axiosInstance.get(`/v1/course/open/lesson/show?course_id=${course_id}&lesson_id=${lesson_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; + +export const fetchActiveStepsDetail = async (course_id: number | null, step_id: number | null) => { + try { + const res = await axiosInstance.get(`/v1/course/open/step/show?course_id=${course_id}&step_id=${step_id}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; diff --git a/services/query-tests.http b/services/query-tests.http index 053ba72b..3d74914f 100644 --- a/services/query-tests.http +++ b/services/query-tests.http @@ -1,4 +1,4 @@ -@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NjE4OTg1NjEsImV4cCI6MTc2MTkyNzQyMSwibmJmIjoxNzYxODk4NTYxLCJqdGkiOiJHcndYUGd5c2pDWnhBMVZIIiwic3ViIjoiOTUwNjAiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.vN5g1UzIjsQaq6XlMq5nula481JtcQwd-4SKh8aqeiw +@token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS5teWVkdS5vc2hzdS5rZy9wdWJsaWMvYXBpL21vb2MvbG9naW4iLCJpYXQiOjE3NjMzNjc0OTQsImV4cCI6MTc2MzM5NjM1NCwibmJmIjoxNzYzMzY3NDk0LCJqdGkiOiIwcTZBTVg2cGlETjFIQWt5Iiwic3ViIjoiNDY0NTYiLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.vLOVmtYZb3_4Jzstn6i2QGbJCuXx5BofOEZ9I9pKnhk # ### # http://api.mooc.oshsu.kg/public/api/v1/open/video/types @@ -34,10 +34,10 @@ # Authorization: Bearer {{token}} # Content-Type: application/json -GET https://api-dev.mooc.oshsu.kg/public/api/open/course/show?course_id=206 +GET https://api-dev.mooc.oshsu.kg/public/api/v1/course/open?course_id=204 Authorization: Bearer {{token}} Content-Type: application/json { - "course_id": 206 + "course_id": 204, } diff --git a/types/lessonStateType.tsx b/types/lessonStateType.tsx index 12f27c04..503ebf77 100644 --- a/types/lessonStateType.tsx +++ b/types/lessonStateType.tsx @@ -1,8 +1,13 @@ export interface lessonStateType { + course_id: number; + id:number; title: string; description: string | null; file: File | null; url: string | null; video_link: string | null; cover?: File | null; + is_published: true; + published_at: null; + sequence_number: 0; } diff --git a/types/myMainCourseType.tsx b/types/myMainCourseType.tsx index f756b2d8..6060afea 100644 --- a/types/myMainCourseType.tsx +++ b/types/myMainCourseType.tsx @@ -1,4 +1,5 @@ import { AudenceType } from "./courseTypes/AudenceTypes"; +import { lessonStateType } from "./lessonStateType"; export interface test { title: string; @@ -19,7 +20,10 @@ export interface myMainCourseType { user_id: number; current_page?: number; user:{name:string, last_name:string, father_name: string}; - audience_type: AudenceType + audience_type: AudenceType; + is_signed: boolean; + + lessons?: lessonStateType // data?: test[]; } From dd2339583e9bff53ca601ded34f095e936268e0b Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 14:27:01 +0600 Subject: [PATCH 273/286] =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20=D1=81=20=D0=B2=D0=BE?= =?UTF-8?q?=D1=80=D0=B4=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 26 +++- app/components/lessons/LessonTest.tsx | 136 +++++++++++++++--- services/steps.tsx | 27 +++- 3 files changed, 160 insertions(+), 29 deletions(-) diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 32416430..97890dbb 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -52,6 +52,7 @@ export default function LessonStep() { const [lastStep, setLastStep] = useState(null); const [draggedId, setDraggedId] = useState(''); const [toggleDragSteps, setToggleDragSteps] = useState(false); + const [toggleDocGenerate, setToggleDocGenerate] = useState(false); const [documentSteps, setDocumentSteps] = useState([]); const changeUrl = (lessonId: number | null) => { @@ -439,7 +440,7 @@ export default function LessonStep() { } }; - const Notificatoin = ({notification}: {notification: any}) => { + const Notificatoin = ({ notification }: { notification: any }) => { return (
    {notification?.length > 0 ? ( @@ -560,7 +561,18 @@ export default function LessonStep() {
    ) : (
    - {toggleDragSteps ? ( + {toggleDocGenerate ? ( +
    +
    + { + setToggleDocGenerate(false); + }}> +
    + Выберите свой документ в формате Word — из его содержания будет автоматически создан тест. +
    +
    +
    + ) : toggleDragSteps ? (
    @@ -609,7 +621,8 @@ export default function LessonStep() { {skeleton ? ( ) : ( - !toggleDragSteps && ( + !toggleDragSteps && + !toggleDocGenerate && (
    +
    + +
    +
    +
    + + ) + ) : aiTestStat ? (
    {aiOptions && aiOptions?.length > 0 ? ( - aiOptionsSection() + aiOptionsSection('ai') ) : progressSpinner ? ( ) : aiTestSteps?.length > 0 ? ( @@ -427,16 +514,17 @@ export default function LessonTest({
    ); })} -
    +
    -
    - {!testValue.title?.length && *Добавтье вопрос } - {!testChecked.check && *Добавтье правильный ответ} - *Балл за тест ({testValue?.score || '0'}) +
    + {!testValue.title?.length && *Добавтье вопрос} + {!testChecked.check && *Добавтье правильный ответ} + *Балл за тест ({testValue?.score || '0'})
    @@ -467,9 +555,13 @@ export default function LessonTest({ }, [content]); useEffect(() => { - setTestValue({ title: '', score: 0, aiCreate:false }); + setTestValue({ title: '', score: 0, aiCreate: false, isDoc: false }); }, [element]); + useEffect(() => { + console.log(myFile); + }, [myFile]); + return (
    { }; // test -export const addTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, type_id: number, step_id: number, score: number, is_ai: boolean) => { +export const addTest = async (answers: { text: string; is_correct: boolean }[], title: string, lesson_id: number, type_id: number, step_id: number, score: number, is_ai: boolean, is_doc: boolean) => { const payload = { lesson_id, type_id, @@ -230,8 +230,9 @@ export const addTest = async (answers: { text: string; is_correct: boolean }[], img: null, // если файла нет, можно null или пустую строку score, is_ai, + is_doc }; - + try { const res = await axiosInstance.post(`/v1/teacher/test/store`, payload); @@ -515,14 +516,32 @@ export const stepSequenceUpdate = async (lesson_id: number | null, steps: { id: }; export const generateQuiz = async (lesson_id: number, step_id: number | string) => { + console.log(step_id); try { const res = await axiosInstance.get(`/v1/teacher/lessons/generate-quiz?lesson_id=${lesson_id}&step_id=${step_id}`); const data = await res.data; - + return data; } catch (err) { console.log('Ошибка загрузки:', err); return err; } -}; \ No newline at end of file +}; + +export const generateDoc = async (doc_file: File | null) => { + const formData = new FormData(); + if(doc_file){ + formData.append('doc_file', doc_file); + } + + try { + const res = await axiosInstance.post(`/test-doc`, formData); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } +}; From 134021ce1c51f9a43fcc4c9b7cc2c93fc9044f4e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 15:41:58 +0600 Subject: [PATCH 274/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonTyping.tsx | 96 ++++++++++--------------- layout/AppMenu.tsx | 20 +++--- utils/axiosInstance.tsx | 16 ++--- 3 files changed, 56 insertions(+), 76 deletions(-) diff --git a/app/components/lessons/LessonTyping.tsx b/app/components/lessons/LessonTyping.tsx index 3b4acb42..519f7283 100644 --- a/app/components/lessons/LessonTyping.tsx +++ b/app/components/lessons/LessonTyping.tsx @@ -21,7 +21,6 @@ import { Dropdown } from 'primereact/dropdown'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useRouter } from 'next/navigation'; import { ProgressSpinner } from 'primereact/progressspinner'; -import useShortText from '@/hooks/useShortText'; import { Dialog } from 'primereact/dialog'; import { FileWithPreview } from '@/types/fileuploadPreview'; @@ -61,26 +60,14 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // doc const [documents, setDocuments] = useState([]); - const [docValue, setDocValue] = useState({ - title: '', - description: '', - file: null, - url: '', - video_link: '' - }); + const [docValue, setDocValue] = useState(null); const [docShow, setDocShow] = useState(false); const [urlPDF, setUrlPDF] = useState(''); const [PDFVisible, setPDFVisible] = useState(false); // links const [links, setLinks] = useState([]); - const [linksValue, setLinksValue] = useState({ - title: '', - description: '', - file: null, - url: '', - video_link: '' - }); + const [linksValue, setLinksValue] = useState(null); const [linksShow, setLinksShow] = useState(false); // videos @@ -90,14 +77,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const [videoTypes, setVideoTypes] = useState([]); const [videoCall, setVideoCall] = useState(false); const [videoLink, setVideoLink] = useState(''); - const [videoValue, setVideoValue] = useState({ - title: '', - description: '', - file: null, - url: '', - video_link: '', - cover: null - }); + const [videoValue, setVideoValue] = useState(null); const [videoShow, setVideoShow] = useState(false); const [imageState, setImageState] = useState(null); @@ -178,7 +158,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp } ); } else { - setDocValue((prev) => ({ + setDocValue((prev) => prev && ({ ...prev, file: null })); @@ -187,8 +167,8 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const clearValues = () => { clearFile(); - setDocValue({ title: '', description: '', file: null, url: '', video_link: '' }); - setLinksValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setDocValue(null); + setLinksValue(null); setEditingLesson(null); setSelectId(null); setSelectType(''); @@ -229,7 +209,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp uploadHandler={() => {}} accept="application/pdf" onSelect={(e) => - setDocValue((prev) => ({ + setDocValue((prev) => prev && ({ ...prev, file: e.files[0] })) @@ -242,24 +222,24 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp id="title" type="text" placeholder={'Аталышы'} - value={docValue.title} + value={docValue && docValue.title} onChange={(e) => { - setDocValue((prev) => ({ ...prev, title: e.target.value })); + setDocValue((prev) => prev && ({ ...prev, title: e.target.value })); setValue('title', e.target.value, { shouldValidate: true }); }} /> {errors.title?.message} - {additional.doc && setDocValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + {additional.doc && setDocValue((prev) => prev && ({ ...prev, description: e.target.value }))} className="w-full" />}
    - {/*
    @@ -305,7 +285,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp if (data?.success) { if (data.documents) { // Присваиваю себе. Для отображения - setDocValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setDocValue(null); setDocuments(data.documents); setDocShow(false); } else { @@ -328,7 +308,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const handleAddDoc = async () => { toggleSpinner(); const token = getToken('access_token'); - const data = await addLesson('doc', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, docValue, 0); + const data = await addLesson('doc', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, docValue || '', 0); if (data.success) { handleFetchDoc(); @@ -366,7 +346,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } }); } else { - setDocValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setDocValue(null); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } @@ -412,9 +392,9 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp id="usefulLink" type="url" placeholder={'Шилтеме жүктөө'} - value={linksValue.url} + value={linksValue && linksValue.url} onChange={(e) => { - setLinksValue((prev) => ({ ...prev, url: e.target.value })); + setLinksValue((prev) => prev && ({ ...prev, url: e.target.value })); setValue('usefulLink', e.target.value, { shouldValidate: true }); }} /> @@ -424,17 +404,17 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp id="title" type="text" placeholder={'Аталышы'} - value={linksValue.title} + value={linksValue && linksValue.title} onChange={(e) => { - setLinksValue((prev) => ({ ...prev, title: e.target.value })); + setLinksValue((prev) => prev && ({ ...prev, title: e.target.value })); setValue('title', e.target.value, { shouldValidate: true }); }} /> {errors.title?.message} - {additional.link && setLinksValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" />} + {additional.link && setLinksValue((prev) => prev && ({ ...prev, description: e.target.value }))} className="w-full" />}
    - {/*
    @@ -489,7 +469,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp if (data?.success) { if (data.links) { // Присваиваю себе. Для отображения - setLinksValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setLinksValue(null); setLinks(data.links); setLinksShow(false); } else { @@ -512,7 +492,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const handleAddLink = async () => { toggleSpinner(); const token = getToken('access_token'); - const data = await addLesson('url', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, linksValue, 0); + const data = await addLesson('url', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, linksValue || '', 0); if (data.success) { handleFetchLink(); @@ -567,7 +547,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } }); } else { - setLinksValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setLinksValue(null); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при при изменении урока' } @@ -581,7 +561,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp // VIDEO SECTIONS const toggleVideoType = (e: videoType) => { setSelectedCity(e); - setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null }); + setVideoValue(null); }; const handleVideoCall = (value: string | null) => { @@ -620,7 +600,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const onSelect = (e: FileUploadSelectEvent & { files: FileWithPreview[] }) => { if (e.files.length > 0) { setImageState(e.files[0].objectURL); - setVideoValue((prev) => ({ + setVideoValue((prev) => prev && ({ ...prev, cover: e.files[0] })); @@ -650,10 +630,10 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp id="usefulLink" type="url" placeholder={'Шилтеме жүктөө'} - value={videoValue.video_link} + value={videoValue && videoValue.video_link} className="w-full" onChange={(e) => { - setVideoValue((prev) => ({ ...prev, video_link: e.target.value })); + setVideoValue((prev) => prev && ({ ...prev, video_link: e.target.value })); setValue('usefulLink', e.target.value, { shouldValidate: true }); }} /> @@ -669,7 +649,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp uploadHandler={() => {}} accept="video/" onSelect={(e) => - setVideoValue((prev) => ({ + setVideoValue((prev) => prev && ({ ...prev, file: e.files[0] })) @@ -684,16 +664,16 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp id="title" type="text" placeholder={'Аталышы'} - value={videoValue.title} + value={videoValue && videoValue.title} onChange={(e) => { - setVideoValue((prev) => ({ ...prev, title: e.target.value })); + setVideoValue((prev) => prev && ({ ...prev, title: e.target.value })); setValue('title', e.target.value, { shouldValidate: true }); }} /> {errors.title?.message} {additional.video && (
    - setVideoValue((prev) => ({ ...prev, description: e.target.value }))} className="w-full" /> + setVideoValue((prev) => prev && ({ ...prev, description: e.target.value }))} className="w-full" />
    @@ -707,14 +687,14 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp )}
    - {/*
    @@ -790,7 +770,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp if (data?.success) { if (data.videos) { - setVideoValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setVideoValue(null); setVideo(data.videos); setVideoShow(false); } else { @@ -813,7 +793,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp const handleAddVideo = async () => { toggleSpinner(); const token = getToken('access_token'); - const data = await addLesson('video', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, videoValue, selectedCity?.id ); + const data = await addLesson('video', token, courseId ? Number(courseId) : null, lessonId ? Number(lessonId) : null, videoValue || '', selectedCity?.id ); if (data.success) { clearFile(); handleFetchVideo(); @@ -846,7 +826,7 @@ export default function LessonTyping({ mainType, courseId, lessonId }: { mainTyp value: { severity: 'success', summary: 'Ийгиликтүү өзгөртүлдү!', detail: '' } }); } else { - setVideoValue({ title: '', description: '', file: null, url: '', video_link: '' }); + setVideoValue(null); setMessage({ state: true, value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка при изменении урока' } diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index 8108c19b..2fd14d11 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -113,11 +113,11 @@ const AppMenu = () => { icon: 'pi pi-fw pi-clock', to: '/unVerifed' }, - { - label: 'Общедоступные курсы', - icon: 'pi pi-fw pi-globe', - to: '/openCourse' - } + // { + // label: 'Общедоступные курсы', + // icon: 'pi pi-fw pi-globe', + // to: '/openCourse' + // } ] : [] : [] @@ -189,11 +189,11 @@ const AppMenu = () => { icon: 'pi pi-fw pi-clock', to: '/unVerifed' }, - { - label: 'Общедоступные курсы', - icon: 'pi pi-fw pi-globe', - to: '/openCourse' - } + // { + // label: 'Общедоступные курсы', + // icon: 'pi pi-fw pi-globe', + // to: '/openCourse' + // } ] : [] : []; diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index e8801c2d..e665358a 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -31,18 +31,18 @@ axiosInstance.interceptors.response.use( if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/'; - // } + if (typeof window !== 'undefined') { + window.location.href = '/'; + } } if (status === 404) { console.warn('404 - Перенаправляю...'); - // if (typeof window !== 'undefined') { - // window.location.href = '/pages/notfound'; - // localStorage.removeItem('userVisit'); - // } - // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + if (typeof window !== 'undefined') { + window.location.href = '/pages/notfound'; + localStorage.removeItem('userVisit'); + } + document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } return Promise.reject(error); From 98116a270c97fca0d7355ce32788b731d2b5fa38 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 15:55:56 +0600 Subject: [PATCH 275/286] PDF fix --- app/(main)/pdf/[pdfUrl]/page.tsx | 8 ++++---- .../[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx | 1 - app/components/lessons/LessonDocument.tsx | 8 ++++---- app/components/lessons/LessonPractica.tsx | 8 ++++---- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 87a11fc2..93d60441 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -1,12 +1,12 @@ -'use client'; +// 'use client'; // import PDFViewer from '@/app/components/PDFBook'; // import PDFViewer from '../PDFBook'; import dynamic from 'next/dynamic'; -const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { - ssr: false -}); +// const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { +// ssr: false +// }); const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { ssr: false diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index b179ba5c..d09bdc43 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -9,7 +9,6 @@ import { fetchItemsLessons, fetchStudentSteps, fetchSubjects, stepPractica, step import { docValueType } from '@/types/docValueType'; import { lessonType } from '@/types/lessonType'; import { mainStepsType } from '@/types/mainStepType'; -import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; import { ProgressSpinner } from 'primereact/progressspinner'; diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 96bb3b97..51f6cec7 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -22,9 +22,9 @@ import FormModal from '../popUp/FormModal'; import dynamic from 'next/dynamic'; import GroupSkeleton from '../skeleton/GroupSkeleton'; -const PDFViewer = dynamic(() => import('../PDFBook'), { - ssr: false -}); +// const PDFViewer = dynamic(() => import('../PDFBook'), { +// ssr: false +// }); export default function LessonDocument({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface docValueType { @@ -119,7 +119,7 @@ export default function LessonDocument({ element, content, fetchPropElement, cle
    setPDFVisible(false)}>
    - + {/* */}
    diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 4fa90707..9b271f4c 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -21,9 +21,9 @@ import dynamic from 'next/dynamic'; import GroupSkeleton from '../skeleton/GroupSkeleton'; import { Editor, EditorTextChangeEvent } from 'primereact/editor'; -const PDFViewer = dynamic(() => import('../PDFBook'), { - ssr: false -}); +// const PDFViewer = dynamic(() => import('../PDFBook'), { +// ssr: false +// }); export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: () => void; clearProp: boolean }) { interface docValueType { @@ -113,7 +113,7 @@ export default function LessonPractica({ element, content, fetchPropElement, fet
    setPDFVisible(false)}>
    - + {/* */}
    From 9f31238d1e1ce36698b89736031e9a60cc409097 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 15:58:43 +0600 Subject: [PATCH 276/286] fix --- app/(main)/pdf/[pdfUrl]/page.tsx | 8 -------- app/components/lessons/LessonDocument.tsx | 8 -------- app/components/lessons/LessonPractica.tsx | 6 ------ 3 files changed, 22 deletions(-) diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 93d60441..eabd48aa 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -1,12 +1,5 @@ -// 'use client'; - -// import PDFViewer from '@/app/components/PDFBook'; -// import PDFViewer from '../PDFBook'; import dynamic from 'next/dynamic'; -// const PDFViewer = dynamic(() => import('@/app/components/PDFBook'), { -// ssr: false -// }); const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { ssr: false @@ -27,7 +20,6 @@ export default function PdfUrlViewer() {
    - {/* */}
    diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 51f6cec7..2f2823c5 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -18,14 +18,8 @@ import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; -// import PDFViewer from '../PDFBook'; -import dynamic from 'next/dynamic'; import GroupSkeleton from '../skeleton/GroupSkeleton'; -// const PDFViewer = dynamic(() => import('../PDFBook'), { -// ssr: false -// }); - export default function LessonDocument({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface docValueType { title: string; @@ -119,7 +113,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle
    setPDFVisible(false)}>
    - {/* */}
    @@ -136,7 +129,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle // if (media) { router.push(`/pdf/${url}`); // } else { - // setPDFVisible(true); // } }; diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 9b271f4c..51463f15 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -17,14 +17,9 @@ import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; -import dynamic from 'next/dynamic'; import GroupSkeleton from '../skeleton/GroupSkeleton'; import { Editor, EditorTextChangeEvent } from 'primereact/editor'; -// const PDFViewer = dynamic(() => import('../PDFBook'), { -// ssr: false -// }); - export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: () => void; clearProp: boolean }) { interface docValueType { title: string; @@ -113,7 +108,6 @@ export default function LessonPractica({ element, content, fetchPropElement, fet
    setPDFVisible(false)}>
    - {/* */}
    From 40b5159e67a5b6c40a039194747e026b5dbeff67 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 16:04:45 +0600 Subject: [PATCH 277/286] fix 3 --- .../[subject_id]/[stream_id]/[id]/page.tsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index d09bdc43..e70f6b09 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -1,4 +1,8 @@ -'use client'; +const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { + ssr: false +}); + +('use client'); import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; @@ -23,10 +27,6 @@ export default function LessonTest() { streams: number[]; } - const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { - ssr: false - }); - const { lesson_id, subject_id, stream_id, id } = useParams(); const params = new URLSearchParams(); @@ -344,7 +344,7 @@ export default function LessonTest() { }, [test]); const docSection = ( -
    +
    {steps?.type?.title} @@ -369,10 +369,9 @@ export default function LessonTest() {
    -
    +
    -
    ); From 0e7782890973e9b5645ffc4e6bf26d34999f890e Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 16:12:21 +0600 Subject: [PATCH 278/286] fix 4 --- .../[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx | 7 ++++--- app/components/PDFBook.tsx | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index e70f6b09..c14afe78 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -1,9 +1,11 @@ +'use client'; + +import dynamic from 'next/dynamic'; + const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { ssr: false }); -('use client'); - import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -17,7 +19,6 @@ import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useState } from 'react'; -import dynamic from 'next/dynamic'; export default function LessonTest() { // types diff --git a/app/components/PDFBook.tsx b/app/components/PDFBook.tsx index cce96306..009b80a3 100644 --- a/app/components/PDFBook.tsx +++ b/app/components/PDFBook.tsx @@ -15,7 +15,7 @@ // // Указываем путь к файлу mjs // pdfjsLib.GlobalWorkerOptions.workerSrc = `/pdf.worker.mjs`; -export default function PDFViewer({ url }: { url: string }) { +export default function PDFView({ url }: { url: string }) { // const { setMessage } = useContext(LayoutContext); // const [pages, setPages] = useState([]); From db2ee0a4dba623830c6bd7e7bbb597a2ca610472 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 16:16:54 +0600 Subject: [PATCH 279/286] fix 5 --- .../[lesson_id]/[step_id]/page.tsx | 17 +- app/(main)/pdf/[pdfUrl]/page.tsx | 3 +- app/components/PDFBook.tsx | 334 ------------------ 3 files changed, 11 insertions(+), 343 deletions(-) delete mode 100644 app/components/PDFBook.tsx diff --git a/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx index e8c608dc..1912516b 100644 --- a/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx +++ b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx @@ -1,5 +1,11 @@ 'use client'; +import dynamic from 'next/dynamic'; + +const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { + ssr: false +}); + import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -13,7 +19,6 @@ import { useParams } from 'next/navigation'; import { Button } from 'primereact/button'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useState } from 'react'; -import dynamic from 'next/dynamic'; import { fetchActiveStepsDetail } from '@/services/openCourse'; export default function ActiveLessonDetail() { @@ -24,10 +29,6 @@ export default function ActiveLessonDetail() { streams: number[]; } - const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { - ssr: false - }); - const { course_id, lesson_id, step_id } = useParams(); const params = new URLSearchParams(); @@ -86,7 +87,7 @@ export default function ActiveLessonDetail() { const handleSteps = async () => { setSkeleton(true); const data = await fetchActiveStepsDetail(course_id ? Number(course_id) : null, step_id ? Number(step_id) : null); - console.log(data); + console.log(data); if (data?.success) { setHasSteps(false); @@ -474,7 +475,7 @@ export default function ActiveLessonDetail() { disabled={progressSpinner} className={`${progressSpinner ? 'opacity-50' : ''}`} onClick={() => { - handleAddPractica(); + handleAddPractica(); }} />
    @@ -554,7 +555,7 @@ export default function ActiveLessonDetail() {
    - // Страница {currentPage} / {totalPages} - // - //
    - // {}} - // onFlip={() => { - // if (bookRef.current) { - // const current = bookRef.current.pageFlip().getCurrentPageIndex(); - // setCurrentPage(current + 1); - // } - // }} - // onChangeOrientation={() => {}} - // onChangeState={() => {}} - // onInit={() => {}} - // onUpdate={() => {}} - // startPage={0} - // drawShadow={true} - // flippingTime={900} - // showPageCorners={true} - // disableFlipByClick={false} - // > - // {pages.map((page, index) => ( - //
    - //
    - // {' '} - // {/* Добавляем класс для содержимого страницы */} - // {page} - //
    - //
    - // ))} - //
    - // - // ) : ( - // <> - //
    - // - // Страница {currentPage} / {totalPages} - // - //
    - // {}} - // onFlip={() => { - // if (bookRef.current) { - // const current = bookRef.current.pageFlip().getCurrentPageIndex(); - // setCurrentPage(current + 1); - // } - // }} - // onChangeOrientation={() => {}} - // onChangeState={() => {}} - // onInit={() => {}} - // onUpdate={() => {}} - // startPage={0} - // drawShadow={true} - // flippingTime={900} - // showPageCorners={true} - // disableFlipByClick={false} - // > - // {pages.map((page, index) => ( - //
    - //
    - // {' '} - // {/* Добавляем класс для содержимого страницы */} - // {page} - //
    - //
    - // ))} - //
    - // - // )} - // - // )} - //
    - //
    - ); -} \ No newline at end of file From 0e4afac227330e6ba13b563146f72ff9fd727a32 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 16:24:32 +0600 Subject: [PATCH 280/286] fix 6 --- .../[lesson_id]/[step_id]/page.tsx | 10 --- app/(main)/pdf/[pdfUrl]/page.tsx | 9 --- .../[subject_id]/[stream_id]/[id]/page.tsx | 10 --- app/components/pdfComponents/PDFworker.tsx | 68 +++++++++---------- 4 files changed, 34 insertions(+), 63 deletions(-) diff --git a/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx index 1912516b..3151f6e1 100644 --- a/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx +++ b/app/(main)/openCourse/activeCourse/[course_id]/[lesson_id]/[step_id]/page.tsx @@ -1,11 +1,5 @@ 'use client'; -import dynamic from 'next/dynamic'; - -const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { - ssr: false -}); - import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -355,10 +349,6 @@ export default function ActiveLessonDetail() { {progressSpinner && }
    - -
    - -
    ); diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 6fb32dc3..6745ddf4 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -1,11 +1,5 @@ 'use client'; -import dynamic from 'next/dynamic'; - -const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { - ssr: false -}); - import { useParams, useRouter } from 'next/navigation'; export default function PdfUrlViewer() { @@ -20,9 +14,6 @@ export default function PdfUrlViewer() { Назад
    -
    - -
    ); } diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index c14afe78..f50169dc 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -1,11 +1,5 @@ 'use client'; -import dynamic from 'next/dynamic'; - -const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFworker'), { - ssr: false -}); - import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -369,10 +363,6 @@ export default function LessonTest() { {progressSpinner && }
    - -
    - -
    ); diff --git a/app/components/pdfComponents/PDFworker.tsx b/app/components/pdfComponents/PDFworker.tsx index e3e23860..d70a2c03 100644 --- a/app/components/pdfComponents/PDFworker.tsx +++ b/app/components/pdfComponents/PDFworker.tsx @@ -1,43 +1,43 @@ 'use client'; -import { Viewer, Worker } from '@react-pdf-viewer/core'; -import { defaultLayoutPlugin } from '@react-pdf-viewer/default-layout'; -import '@react-pdf-viewer/core/lib/styles/index.css'; -import '@react-pdf-viewer/default-layout/lib/styles/index.css'; -import { useContext, useEffect, useState } from 'react'; -import { LayoutContext } from '@/layout/context/layoutcontext'; +// import { Viewer, Worker } from '@react-pdf-viewer/core'; +// import { defaultLayoutPlugin } from '@react-pdf-viewer/default-layout'; +// import '@react-pdf-viewer/core/lib/styles/index.css'; +// import '@react-pdf-viewer/default-layout/lib/styles/index.css'; +// import { useContext, useEffect, useState } from 'react'; +// import { LayoutContext } from '@/layout/context/layoutcontext'; -export default function PDFreader({ url }: { url: string }) { - const defaultLayoutPluginInstance = defaultLayoutPlugin(); +// export default function PDFreader({ url }: { url: string }) { +// const defaultLayoutPluginInstance = defaultLayoutPlugin(); - const { setMessage } = useContext(LayoutContext); - const [forUrl, setForUrl] = useState(''); +// const { setMessage } = useContext(LayoutContext); +// const [forUrl, setForUrl] = useState(''); - useEffect(() => { - // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; - const inApiString = process.env.NEXT_PUBLIC_BASE_URL; - let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; - console.log(newUrl); +// useEffect(() => { +// // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; +// const inApiString = process.env.NEXT_PUBLIC_BASE_URL; +// let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; +// console.log(newUrl); - if (newUrl) { - setForUrl(newUrl); - } else { - setMessage({ - state: true, - value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } - }); - } - }, [url]); +// if (newUrl) { +// setForUrl(newUrl); +// } else { +// setMessage({ +// state: true, +// value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } +// }); +// } +// }, [url]); - const loadSection = (error: any | null) =>
    Не удалось загрузить PDF: {error?.message || ''}
    +// const loadSection = (error: any | null) =>
    Не удалось загрузить PDF: {error?.message || ''}
    - if(!forUrl) return loadSection(null); +// if(!forUrl) return loadSection(null); - return ( -
    - - loadSection(error)} /> - -
    - ); -} +// return ( +//
    +// +// loadSection(error)} /> +// +//
    +// ); +// } From 69a69f0cf55f987b9b6b65cf10737fa71872b8e2 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Tue, 18 Nov 2025 17:07:08 +0600 Subject: [PATCH 281/286] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=D1=8B,=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F.=20=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=82=D0=B8=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/lessons/LessonDocument.tsx | 75 ++++++------------ app/components/lessons/LessonForum.tsx | 17 +--- app/components/lessons/LessonLink.tsx | 24 +----- app/components/lessons/LessonPractica.tsx | 89 +++++++-------------- app/components/lessons/LessonVideo.tsx | 97 ++++++++++------------- types/contentType.tsx | 14 ++++ types/linkValueType.tsx | 6 ++ 7 files changed, 117 insertions(+), 205 deletions(-) create mode 100644 types/contentType.tsx create mode 100644 types/linkValueType.tsx diff --git a/app/components/lessons/LessonDocument.tsx b/app/components/lessons/LessonDocument.tsx index 2f2823c5..844e080b 100644 --- a/app/components/lessons/LessonDocument.tsx +++ b/app/components/lessons/LessonDocument.tsx @@ -2,7 +2,7 @@ import { lessonSchema } from '@/schemas/lessonSchema'; import { yupResolver } from '@hookform/resolvers/yup'; -import { useParams, useRouter } from 'next/navigation'; +import { useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; import { FileUpload } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; @@ -19,6 +19,7 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import GroupSkeleton from '../skeleton/GroupSkeleton'; +import { contentType } from '@/types/contentType'; export default function LessonDocument({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface docValueType { @@ -29,29 +30,13 @@ export default function LessonDocument({ element, content, fetchPropElement, cle stepPos?: number; } - interface contentType { - course_id: number | null; - created_at: string; - description: string | null; - document: string; - id: number; - lesson_id: number; - status: true; - title: string; - updated_at: string; - user_id: number; - document_path: string; - } - const router = useRouter(); - const media = useMediaQuery('(max-width: 640px)'); const fileUploadRef = useRef(null); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); const [editingLesson, setEditingLesson] = useState({ title: 'string', description: '', file: null }); const [visible, setVisisble] = useState(false); - const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); const [skeleton, setSkeleton] = useState(false); @@ -62,19 +47,16 @@ export default function LessonDocument({ element, content, fetchPropElement, cle description: '', file: null }); - const [docShow, setDocShow] = useState(false); const [urlPDF, setUrlPDF] = useState(''); const [PDFVisible, setPDFVisible] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); - const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const clearFile = () => { fileUploadRef.current?.clear(); setAdditional((prev) => ({ ...prev, video: false })); - setImageState(null); if (visible) { setEditingLesson( (prev) => @@ -96,7 +78,6 @@ export default function LessonDocument({ element, content, fetchPropElement, cle setDocValue({ title: '', description: '', file: null }); setEditingLesson(null); setSelectId(null); - setSelectType(''); }; // validate @@ -112,13 +93,11 @@ export default function LessonDocument({ element, content, fetchPropElement, cle <>
    setPDFVisible(false)}> -
    -
    +
    ); const selectedForEditing = (id: number, type: string) => { - setSelectType(type); setSelectId(id); setVisisble(true); editing(); @@ -250,32 +229,28 @@ export default function LessonDocument({ element, content, fetchPropElement, cle ) : contentShow ? (
    - {docShow ? ( - - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : ( - document && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'doc', document: document.document }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'doc', icon: 'pi pi-doc' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} - urlForPDF={() => sentToPDF(document.document || '')} - urlForDownload={document.document_path || ''} - /> - ) - )} - - )} + <> + {skeleton ? ( +
    + +
    + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'doc', document: document.document }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'doc', icon: 'pi pi-doc' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} + urlForPDF={() => sentToPDF(document.document || '')} + urlForDownload={document.document_path || ''} + /> + ) + )} +
    ) : ( diff --git a/app/components/lessons/LessonForum.tsx b/app/components/lessons/LessonForum.tsx index 94dde694..e3a0ae85 100644 --- a/app/components/lessons/LessonForum.tsx +++ b/app/components/lessons/LessonForum.tsx @@ -7,7 +7,6 @@ import { InputText } from 'primereact/inputtext'; import { ProgressSpinner } from 'primereact/progressspinner'; import { useContext, useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; -import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { addForum, deleteForum, fetchElement, stepSequenceUpdate, updateForum } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; @@ -15,6 +14,7 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import GroupSkeleton from '../skeleton/GroupSkeleton'; +import { contentType } from '@/types/contentType'; export default function LessonForum({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { interface linkValueType { @@ -24,21 +24,6 @@ export default function LessonForum({ element, content, fetchPropElement, clearP stepPos?: number; } - interface contentType { - course_id: number | null; - created_at: string; - description: string | null; - document: string; - id: number; - lesson_id: number; - status: true; - title: string; - updated_at: string; - user_id: number; - document_path: string; - url: string; - } - const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); diff --git a/app/components/lessons/LessonLink.tsx b/app/components/lessons/LessonLink.tsx index 8882d0e9..5c7b1046 100644 --- a/app/components/lessons/LessonLink.tsx +++ b/app/components/lessons/LessonLink.tsx @@ -15,30 +15,10 @@ import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import GroupSkeleton from '../skeleton/GroupSkeleton'; +import { contentType } from '@/types/contentType'; +import { linkValueType } from '@/types/linkValueType'; export default function LessonLink({ element, content, fetchPropElement, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; clearProp: boolean }) { - interface linkValueType { - title: string; - description: string; - url: string; - stepPos?: number; - } - - interface contentType { - course_id: number | null; - created_at: string; - description: string | null; - document: string; - id: number; - lesson_id: number; - status: true; - title: string; - updated_at: string; - user_id: number; - document_path: string; - url: string; - } - const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); diff --git a/app/components/lessons/LessonPractica.tsx b/app/components/lessons/LessonPractica.tsx index 51463f15..2582847c 100644 --- a/app/components/lessons/LessonPractica.tsx +++ b/app/components/lessons/LessonPractica.tsx @@ -2,23 +2,23 @@ import { lessonSchema } from '@/schemas/lessonSchema'; import { yupResolver } from '@hookform/resolvers/yup'; -import { useParams, useRouter } from 'next/navigation'; +import { useRouter } from 'next/navigation'; import { Button } from 'primereact/button'; import { FileUpload } from 'primereact/fileupload'; import { InputText } from 'primereact/inputtext'; import { ProgressSpinner } from 'primereact/progressspinner'; -import { ReactElement, ReactHTML, useContext, useEffect, useRef, useState } from 'react'; +import { useContext, useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; -import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { useMediaQuery } from '@/hooks/useMediaQuery'; -import { addDocument, addPractica, deleteDocument, deletePractica, fetchElement, stepSequenceUpdate, updateDocument, updatePractica } from '@/services/steps'; +import { addPractica, deletePractica, fetchElement, stepSequenceUpdate, updatePractica } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; import FormModal from '../popUp/FormModal'; import GroupSkeleton from '../skeleton/GroupSkeleton'; import { Editor, EditorTextChangeEvent } from 'primereact/editor'; +import { contentType } from '@/types/contentType'; export default function LessonPractica({ element, content, fetchPropElement, fetchPropThemes, clearProp }: { element: mainStepsType; content: any; fetchPropElement: (id: number) => void; fetchPropThemes: () => void; clearProp: boolean }) { interface docValueType { @@ -30,29 +30,11 @@ export default function LessonPractica({ element, content, fetchPropElement, fet stepPos?: number; } - interface contentType { - course_id: number | null; - created_at: string; - description: string | null; - document: string; - id: number; - lesson_id: number; - status: true; - title: string; - updated_at: string; - user_id: number; - document_path: string; - url: string; - score?: number | null; - } - const router = useRouter(); const media = useMediaQuery('(max-width: 640px)'); const fileUploadRef = useRef(null); const showError = useErrorMessage(); const { setMessage } = useContext(LayoutContext); - const [editorDescription, setEditorDescription] = useState(null); - const [editorUpdateState, setEditorUpdateState] = useState(false); const renderHeader = () => { return ( @@ -68,25 +50,21 @@ export default function LessonPractica({ element, content, fetchPropElement, fet const [editingLesson, setEditingLesson] = useState({ title: '', description: '', document: null, url: '', score: 0 }); const [visible, setVisisble] = useState(false); - const [imageState, setImageState] = useState(null); const [contentShow, setContentShow] = useState(false); // doc const [document, setDocuments] = useState(); const [docValue, setDocValue] = useState({ title: '', description: '', document: null, url: '', score: 0 }); - const [docShow, setDocShow] = useState(false); const [urlPDF, setUrlPDF] = useState(''); const [PDFVisible, setPDFVisible] = useState(false); const [progressSpinner, setProgressSpinner] = useState(false); const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); - const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const [skeleton, setSkeleton] = useState(false); const clearFile = () => { fileUploadRef.current?.clear(); setAdditional((prev) => ({ ...prev, video: false })); - setImageState(null); if (visible) { setEditingLesson( (prev) => @@ -107,8 +85,7 @@ export default function LessonPractica({ element, content, fetchPropElement, fet <>
    setPDFVisible(false)}> -
    -
    +
    ); @@ -118,7 +95,6 @@ export default function LessonPractica({ element, content, fetchPropElement, fet setDocValue({ title: '', description: '', document: null, url: '', score: 0 }); setEditingLesson({ title: '', description: '', document: null, url: '', score: 0 }); setSelectId(null); - setSelectType(''); }; // validate @@ -131,7 +107,6 @@ export default function LessonPractica({ element, content, fetchPropElement, fet }); const selectedForEditing = (id: number, type: string) => { - setSelectType(type); setSelectId(id); setVisisble(true); editing(); @@ -264,32 +239,28 @@ export default function LessonPractica({ element, content, fetchPropElement, fet ) : contentShow ? (
    - {docShow ? ( - - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : ( - document && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteDoc(id)} - cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document, score: element?.score || 0 }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'practica', icon: 'pi pi-list' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} - urlForPDF={() => sentToPDF('')} - urlForDownload={document.document ? document.document_path : ''} - /> - ) - )} - - )} + <> + {skeleton ? ( +
    + +
    + ) : ( + document && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteDoc(id)} + cardValue={{ title: document?.title, id: document.id, desctiption: document?.description || '', type: 'practica', url: document.url, document: document.document, score: element?.score || 0 }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'practica', icon: 'pi pi-list' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(document.created_at).toISOString().slice(0, 10)} + urlForPDF={() => sentToPDF('')} + urlForDownload={document.document ? document.document_path : ''} + /> + ) + )} +
    ) : ( @@ -475,7 +446,7 @@ export default function LessonPractica({ element, content, fetchPropElement, fet /> */} { setEditingLesson((prev) => prev && { ...prev, title: e.target.value }); @@ -497,13 +468,12 @@ export default function LessonPractica({ element, content, fetchPropElement, fet />
    -
    +
    { - setEditorUpdateState(false); setEditingLesson((prev) => ({ ...prev, description: String(e.htmlValue) })); setValue('title', String(e.htmlValue), { shouldValidate: true }); }} @@ -553,7 +523,6 @@ export default function LessonPractica({ element, content, fetchPropElement, fet
    -
    diff --git a/app/components/lessons/LessonVideo.tsx b/app/components/lessons/LessonVideo.tsx index 7ff41a6b..4b8c8511 100644 --- a/app/components/lessons/LessonVideo.tsx +++ b/app/components/lessons/LessonVideo.tsx @@ -11,7 +11,7 @@ import { useForm } from 'react-hook-form'; import { NotFound } from '../NotFound'; import LessonCard from '../cards/LessonCard'; import { getToken } from '@/utils/auth'; -import { addDocument, addVideo, deleteDocument, deleteVideo, fetchElement, stepSequenceUpdate, updateDocument, updateVideo } from '@/services/steps'; +import { addVideo, deleteVideo, fetchElement, stepSequenceUpdate, updateVideo } from '@/services/steps'; import { mainStepsType } from '@/types/mainStepType'; import useErrorMessage from '@/hooks/useErrorMessage'; import { LayoutContext } from '@/layout/context/layoutcontext'; @@ -36,12 +36,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP cover_url: string; } - interface videoType { - name: string; - status: boolean; - id: number; - } - interface videoValueType { title: string; description: string | null; // вместо ? → строго string | null @@ -57,7 +51,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP // videos const [video, setVideo] = useState(); - const [selectedCity, setSelectedCity] = useState({ name: '', status: true, id: 1 }); const [videoCall, setVideoCall] = useState(false); const [videoLink, setVideoLink] = useState(''); const [videoValue, setVideoValue] = useState<{ title: string; description: string; file: null; url: string; video_link: string; cover: File | null; link: null }>({ @@ -69,7 +62,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP cover: null, link: null }); - const [videoShow, setVideoShow] = useState(false); const [imageState, setImageState] = useState(null); // auxiliary @@ -79,7 +71,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP const [editingLesson, setEditingLesson] = useState(null); const [progressSpinner, setProgressSpinner] = useState(false); const [additional, setAdditional] = useState<{ doc: boolean; link: boolean; video: boolean }>({ doc: false, link: false, video: false }); - const [selectType, setSelectType] = useState(''); const [selectId, setSelectId] = useState(null); const [contentShow, setContentShow] = useState(false); const [skeleton, setSkeleton] = useState(false); @@ -99,12 +90,9 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP setEditingLesson(null); setVideoValue({ title: '', description: '', file: null, url: '', video_link: '', cover: null, link: null }); setSelectId(null); - setSelectType(''); }; const handleVideoCall = (value: string | null) => { - console.log(value); - if (!value) { setMessage({ state: true, @@ -146,8 +134,6 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP }); const selectedForEditing = (id: number, type: string) => { - console.log(id, type); - setSelectType(type); setSelectId(id); setVisisble(true); editing(); @@ -297,7 +283,7 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP
    - {imageState &&
    {imageState ? : } @@ -344,48 +330,45 @@ export default function LessonVideo({ element, content, fetchPropElement, clearP >
    */} - {videoShow ? ( - - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : !videoCall ? ( - video && ( - selectedForEditing(id, type)} - onDelete={(id: number) => handleDeleteVideo(id)} - cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} - cardBg={'#ddc4f51a'} - type={{ typeValue: 'video', icon: 'pi pi-video' }} - typeColor={'var(--mainColor)'} - lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} - urlForPDF={() => ''} - urlForDownload="" - videoVisible={() => handleVideoCall(String(video?.link))} - /> - ) - ) : ( -
    -
    - setVideoCall(false)}> -
    - + + <> + {skeleton ? ( +
    + +
    + ) : !videoCall ? ( + video && ( + selectedForEditing(id, type)} + onDelete={(id: number) => handleDeleteVideo(id)} + cardValue={{ title: video.title, id: video.id, desctiption: video?.description || '', type: 'video', photo: video?.cover_url }} + cardBg={'#ddc4f51a'} + type={{ typeValue: 'video', icon: 'pi pi-video' }} + typeColor={'var(--mainColor)'} + lessonDate={new Date(video.created_at).toISOString().slice(0, 10)} + urlForPDF={() => ''} + urlForDownload="" + videoVisible={() => handleVideoCall(String(video?.link))} + /> + ) + ) : ( +
    +
    + setVideoCall(false)}>
    - )} - - )} + +
    + )} +
    )} diff --git a/types/contentType.tsx b/types/contentType.tsx new file mode 100644 index 00000000..611b41d3 --- /dev/null +++ b/types/contentType.tsx @@ -0,0 +1,14 @@ +export interface contentType { + course_id: number | null; + created_at: string; + description: string | null; + document: string; + id: number; + lesson_id: number; + status: true; + title: string; + updated_at: string; + user_id: number; + document_path: string; + url: string; + } \ No newline at end of file diff --git a/types/linkValueType.tsx b/types/linkValueType.tsx new file mode 100644 index 00000000..ab363bcd --- /dev/null +++ b/types/linkValueType.tsx @@ -0,0 +1,6 @@ +export interface linkValueType { + title: string; + description: string; + url: string; + stepPos?: number; +} From e038090f6f58e9cc85d72bfa7fa4bb9b0a241806 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 19 Nov 2025 09:29:24 +0600 Subject: [PATCH 282/286] =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[subject_id]/[stream_id]/[id]/page.tsx | 5 +++ app/components/pdfComponents/PDFreader.tsx | 43 +++++++++++++++++++ app/components/pdfComponents/PDFworker.tsx | 43 ------------------- 3 files changed, 48 insertions(+), 43 deletions(-) create mode 100644 app/components/pdfComponents/PDFreader.tsx delete mode 100644 app/components/pdfComponents/PDFworker.tsx diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index f50169dc..93cd84f3 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -1,5 +1,9 @@ 'use client'; +import dynamic from 'next/dynamic'; + +const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFreader'), { ssr: false }); + import { NotFound } from '@/app/components/NotFound'; import useErrorMessage from '@/hooks/useErrorMessage'; import { useMediaQuery } from '@/hooks/useMediaQuery'; @@ -360,6 +364,7 @@ export default function LessonTest() {
    diff --git a/app/components/pdfComponents/PDFreader.tsx b/app/components/pdfComponents/PDFreader.tsx new file mode 100644 index 00000000..e3e23860 --- /dev/null +++ b/app/components/pdfComponents/PDFreader.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { Viewer, Worker } from '@react-pdf-viewer/core'; +import { defaultLayoutPlugin } from '@react-pdf-viewer/default-layout'; +import '@react-pdf-viewer/core/lib/styles/index.css'; +import '@react-pdf-viewer/default-layout/lib/styles/index.css'; +import { useContext, useEffect, useState } from 'react'; +import { LayoutContext } from '@/layout/context/layoutcontext'; + +export default function PDFreader({ url }: { url: string }) { + const defaultLayoutPluginInstance = defaultLayoutPlugin(); + + const { setMessage } = useContext(LayoutContext); + const [forUrl, setForUrl] = useState(''); + + useEffect(() => { + // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; + const inApiString = process.env.NEXT_PUBLIC_BASE_URL; + let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; + console.log(newUrl); + + if (newUrl) { + setForUrl(newUrl); + } else { + setMessage({ + state: true, + value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } + }); + } + }, [url]); + + const loadSection = (error: any | null) =>
    Не удалось загрузить PDF: {error?.message || ''}
    + + if(!forUrl) return loadSection(null); + + return ( +
    + + loadSection(error)} /> + +
    + ); +} diff --git a/app/components/pdfComponents/PDFworker.tsx b/app/components/pdfComponents/PDFworker.tsx deleted file mode 100644 index d70a2c03..00000000 --- a/app/components/pdfComponents/PDFworker.tsx +++ /dev/null @@ -1,43 +0,0 @@ -'use client'; - -// import { Viewer, Worker } from '@react-pdf-viewer/core'; -// import { defaultLayoutPlugin } from '@react-pdf-viewer/default-layout'; -// import '@react-pdf-viewer/core/lib/styles/index.css'; -// import '@react-pdf-viewer/default-layout/lib/styles/index.css'; -// import { useContext, useEffect, useState } from 'react'; -// import { LayoutContext } from '@/layout/context/layoutcontext'; - -// export default function PDFreader({ url }: { url: string }) { -// const defaultLayoutPluginInstance = defaultLayoutPlugin(); - -// const { setMessage } = useContext(LayoutContext); -// const [forUrl, setForUrl] = useState(''); - -// useEffect(() => { -// // let newUrl = `https://api.mooc.oshsu.kg/public/temprory-file/${url}`; -// const inApiString = process.env.NEXT_PUBLIC_BASE_URL; -// let newUrl = `${inApiString?.substring(0, inApiString?.length - 4)}/temprory-file/${url}`; -// console.log(newUrl); - -// if (newUrl) { -// setForUrl(newUrl); -// } else { -// setMessage({ -// state: true, -// value: { severity: 'error', summary: 'Ошибка', detail: 'Ошибка загрузки или отображения документа' } -// }); -// } -// }, [url]); - -// const loadSection = (error: any | null) =>
    Не удалось загрузить PDF: {error?.message || ''}
    - -// if(!forUrl) return loadSection(null); - -// return ( -//
    -// -// loadSection(error)} /> -// -//
    -// ); -// } From 70a60a43da63ded136f87cd5fa4bb6b383781930 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 19 Nov 2025 09:52:58 +0600 Subject: [PATCH 283/286] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B5=D0=BA=D1=82=20=D0=B8=20=D0=B5=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=8C=20=D1=81=20=D0=BF=D0=B4=D1=84=20=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=B2=20=D0=B2=D1=81=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(student)/teaching/[subject_id]/page.tsx | 2 +- .../[subject_id]/[stream_id]/[id]/page.tsx | 2 +- next.config.js | 9 + package-lock.json | 161 +++++++++--------- package.json | 4 +- 5 files changed, 89 insertions(+), 89 deletions(-) diff --git a/app/(student)/teaching/[subject_id]/page.tsx b/app/(student)/teaching/[subject_id]/page.tsx index 3912a60b..32600126 100644 --- a/app/(student)/teaching/[subject_id]/page.tsx +++ b/app/(student)/teaching/[subject_id]/page.tsx @@ -304,7 +304,7 @@ export default function StudentLesson() { stepId={item.id} streams={course} lesson={lesson.id} - subjectId={subject_id} + // subjectId={subject_id} chills={item?.chills} fetchProp={() => handleTabChange(courses, course.id, accordionIndex)} contentId={item?.content?.id} diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index 93cd84f3..1d85043a 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -364,10 +364,10 @@ export default function LessonTest() {
    +
    ); diff --git a/next.config.js b/next.config.js index df762170..f30e8fd6 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,15 @@ /** @type {import('next').NextConfig} */ const nextConfig = { // output: 'export', + webpack: (config, { isServer }) => { + if (isServer) { + config.resolve.fallback = { + ...config.resolve.fallback, + canvas: false, + }; + } + return config; + }, } module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json index ca4e0335..d8d814cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "chart.js": "4.2.1", "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", - "next": "13.4.8", + "next": "^13.5.7", "pdfjs-dist": "^2.16.105", "primeflex": "^4.0.0", "primeicons": "^7.0.0", @@ -43,7 +43,7 @@ "@types/pdfjs-dist": "^2.10.378", "autoprefixer": "^10.4.21", "eslint": "8.43.0", - "eslint-config-next": "13.4.6", + "eslint-config-next": "^13.5.7", "postcss": "^8.5.4", "prettier": "^2.8.8", "sass": "^1.63.4", @@ -611,23 +611,23 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@next/env": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.8.tgz", - "integrity": "sha512-twuSf1klb3k9wXI7IZhbZGtFCWvGD4wXTY2rmvzIgVhXhs7ISThrbNyutBx3jWIL8Y/Hk9+woytFz5QsgtcRKQ==" + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.7.tgz", + "integrity": "sha512-uVuRqoj28Ys/AI/5gVEgRAISd0KWI0HRjOO1CTpNgmX3ZsHb5mdn14Y59yk0IxizXdo7ZjsI2S7qbWnO+GNBcA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.6.tgz", - "integrity": "sha512-bPigeu0RI7bgy1ucBA2Yqcfg539y0Lzo38P2hIkrRB1GNvFSbYg6RTu8n6tGqPVrH3TTlPTNKLXG01wc+5NuwQ==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.7.tgz", + "integrity": "sha512-c4vuEOOXeib4js5gDq+zFqAAdRGXX6T0d+zFETiQkRwy7vyj5lBov1dW0Z09nDst2lvxo7VEcKrQMUBH5Vgx7Q==", "dev": true, "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.8.tgz", - "integrity": "sha512-MSFplVM4dTWOuKAUv0XR9gY7AWtMSBu9os9f+kp+s5rWhM1I2CdR3obFttd6366nS/W/VZxbPM5oEIdlIa46zA==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.7.tgz", + "integrity": "sha512-7SxmxMex45FvKtRoP18eftrDCMyL6WQVYJSEE/s7A1AW/fCkznxjEShKet2iVVzf89gWp8HbXGaL4hCaseux6g==", "cpu": [ "arm64" ], @@ -640,9 +640,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.8.tgz", - "integrity": "sha512-Reox+UXgonon9P0WNDE6w85DGtyBqGitl/ryznOvn6TvfxEaZIpTgeu3ZrJLU9dHSMhiK7YAM793mE/Zii2/Qw==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.7.tgz", + "integrity": "sha512-6iENvgyIkGFLFszBL4b1VfEogKC3TDPEB6/P/lgxmgXVXIV09Q4or1MVn+U/tYyYmm7oHMZ3oxGpHAyJ80nA6g==", "cpu": [ "x64" ], @@ -655,9 +655,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.8.tgz", - "integrity": "sha512-kdyzYvAYtqQVgzIKNN7e1rLU8aZv86FDSRqPlOkKZlvqudvTO0iohuTPmnEEDlECeBM6qRPShNffotDcU/R2KA==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.7.tgz", + "integrity": "sha512-P42jDX56wu9zEdVI+Xv4zyTeXB3DpqgE1Gb4bWrc0s2RIiDYr6uKBprnOs1hCGIwfVyByxyTw5Va66QCdFFNUg==", "cpu": [ "arm64" ], @@ -670,9 +670,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.8.tgz", - "integrity": "sha512-oWxx4yRkUGcR81XwbI+T0zhZ3bDF6V1aVLpG+C7hSG50ULpV8gC39UxVO22/bv93ZlcfMY4zl8xkz9Klct6dpQ==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.7.tgz", + "integrity": "sha512-A06vkj+8X+tLRzSja5REm/nqVOCzR+x5Wkw325Q/BQRyRXWGCoNbQ6A+BR5M86TodigrRfI3lUZEKZKe3QJ9Bg==", "cpu": [ "arm64" ], @@ -685,9 +685,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.8.tgz", - "integrity": "sha512-anhtvuO6eE9YRhYnaEGTfbpH3L5gT/9qPFcNoi6xS432r/4DAtpJY8kNktqkTVevVIC/pVumqO8tV59PR3zbNg==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.7.tgz", + "integrity": "sha512-UdHm7AlxIbdRdMsK32cH0EOX4OmzAZ4Xm+UVlS0YdvwLkI3pb7AoBEoVMG5H0Wj6Wpz6GNkrFguHTRLymTy6kw==", "cpu": [ "x64" ], @@ -700,9 +700,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.8.tgz", - "integrity": "sha512-aR+J4wWfNgH1DwCCBNjan7Iumx0lLtn+2/rEYuhIrYLY4vnxqSVGz9u3fXcgUwo6Q9LT8NFkaqK1vPprdq+BXg==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.7.tgz", + "integrity": "sha512-c50Y8xBKU16ZGj038H6C13iedRglxvdQHD/1BOtes56gwUrIRDX2Nkzn3mYtpz3Wzax0gfAF9C0Nqljt93IxvA==", "cpu": [ "x64" ], @@ -715,9 +715,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.8.tgz", - "integrity": "sha512-OWBKIrJwQBTqrat0xhxEB/jcsjJR3+diD9nc/Y8F1mRdQzsn4bPsomgJyuqPVZs6Lz3K18qdIkvywmfSq75SsQ==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.7.tgz", + "integrity": "sha512-NcUx8cmkA+JEp34WNYcKW6kW2c0JBhzJXIbw+9vKkt9m/zVJ+KfizlqmoKf04uZBtzFN6aqE2Fyv2MOd021WIA==", "cpu": [ "arm64" ], @@ -730,9 +730,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.8.tgz", - "integrity": "sha512-agiPWGjUndXGTOn4ChbKipQXRA6/UPkywAWIkx7BhgGv48TiJfHTK6MGfBoL9tS6B4mtW39++uy0wFPnfD0JWg==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.7.tgz", + "integrity": "sha512-wXp+/3NVcuyJDED6gJiLXs5dqHaWO7moAB6aBtjlKZvsxBDxpcyjsfRbtHPeYtaT20zCkmPs69H0K25lrVZmlA==", "cpu": [ "ia32" ], @@ -745,9 +745,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.8.tgz", - "integrity": "sha512-UIRKoByVKbuR6SnFG4JM8EMFlJrfEGuUQ1ihxzEleWcNwRMMiVaCj1KyqfTOW8VTQhJ0u8P1Ngg6q1RwnIBTtw==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.7.tgz", + "integrity": "sha512-PLyD3Dl6jTTkLG8AoqhPGd5pXtSs8wbqIhWPQt3yEMfnYld/dGYuF2YPs3YHaVFrijCIF9pXY3+QOyvP23Zn7g==", "cpu": [ "x64" ], @@ -1036,9 +1036,9 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" }, "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", "dependencies": { "tslib": "^2.4.0" } @@ -2524,20 +2524,20 @@ } }, "node_modules/eslint-config-next": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.6.tgz", - "integrity": "sha512-nlv4FYish1RYYHILbQwM5/rD37cOvEqtMfDjtQCYbXdE2O3MggqHu2q6IDeLE2Z6u8ZJyNPgWOA6OimWcxj3qw==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.7.tgz", + "integrity": "sha512-pdeUuL9KZ8qFzzKqCbxk6FXwG9dNEnot/3+qSFJqxdSGgkFUH8cgZus/meyCi2S0cTAsDbBEE030E6zvL9pUYQ==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "13.4.6", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", + "@next/eslint-plugin-next": "13.5.7", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", @@ -4371,39 +4371,37 @@ "dev": true }, "node_modules/next": { - "version": "13.4.8", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.8.tgz", - "integrity": "sha512-lxUjndYKjZHGK3CWeN2RI+/6ni6EUvjiqGWXAYPxUfGIdFGQ5XoisrqAJ/dF74aP27buAfs8MKIbIMMdxjqSBg==", + "version": "13.5.7", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.7.tgz", + "integrity": "sha512-W7KIRTE+hPcgGdq89P3mQLDX3m7pJ6nxSyC+YxYaUExE+cS4UledB+Ntk98tKoyhsv6fjb2TRAnD7VDvoqmeFg==", "dependencies": { - "@next/env": "13.4.8", - "@swc/helpers": "0.5.1", + "@next/env": "13.5.7", + "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", + "postcss": "8.4.31", "styled-jsx": "5.1.1", - "watchpack": "2.4.0", - "zod": "3.21.4" + "watchpack": "2.4.0" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.8.0" + "node": ">=16.14.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.8", - "@next/swc-darwin-x64": "13.4.8", - "@next/swc-linux-arm64-gnu": "13.4.8", - "@next/swc-linux-arm64-musl": "13.4.8", - "@next/swc-linux-x64-gnu": "13.4.8", - "@next/swc-linux-x64-musl": "13.4.8", - "@next/swc-win32-arm64-msvc": "13.4.8", - "@next/swc-win32-ia32-msvc": "13.4.8", - "@next/swc-win32-x64-msvc": "13.4.8" + "@next/swc-darwin-arm64": "13.5.7", + "@next/swc-darwin-x64": "13.5.7", + "@next/swc-linux-arm64-gnu": "13.5.7", + "@next/swc-linux-arm64-musl": "13.5.7", + "@next/swc-linux-x64-gnu": "13.5.7", + "@next/swc-linux-x64-musl": "13.5.7", + "@next/swc-win32-arm64-msvc": "13.5.7", + "@next/swc-win32-ia32-msvc": "13.5.7", + "@next/swc-win32-x64-msvc": "13.5.7" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -4412,18 +4410,15 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { - "optional": true - }, "sass": { "optional": true } } }, "node_modules/next/node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -4432,10 +4427,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -5555,9 +5554,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -5890,14 +5889,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } } diff --git a/package.json b/package.json index a735758c..6aac5f8d 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "chart.js": "4.2.1", "contribution-heatmap": "^1.4.1", "countup": "^1.8.2", - "next": "13.4.8", + "next": "^13.5.7", "pdfjs-dist": "^2.16.105", "primeflex": "^4.0.0", "primeicons": "^7.0.0", @@ -46,7 +46,7 @@ "@types/pdfjs-dist": "^2.10.378", "autoprefixer": "^10.4.21", "eslint": "8.43.0", - "eslint-config-next": "13.4.6", + "eslint-config-next": "^13.5.7", "postcss": "^8.5.4", "prettier": "^2.8.8", "sass": "^1.63.4", From 40a2a4c82ee48e0e76067c5c41bba4105beef675 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 19 Nov 2025 11:25:20 +0600 Subject: [PATCH 284/286] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B4=D1=84=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=BF=D0=BE=D0=B4=D0=B0=20=D1=82=D0=BE=D0=B6=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/pdf/[pdfUrl]/page.tsx | 6 +++++- .../[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/(main)/pdf/[pdfUrl]/page.tsx b/app/(main)/pdf/[pdfUrl]/page.tsx index 6745ddf4..1120a45e 100644 --- a/app/(main)/pdf/[pdfUrl]/page.tsx +++ b/app/(main)/pdf/[pdfUrl]/page.tsx @@ -1,4 +1,7 @@ 'use client'; +import dynamic from 'next/dynamic'; + +const PDFreader = dynamic(() => import('@/app/components/pdfComponents/PDFreader'), { ssr: false }); import { useParams, useRouter } from 'next/navigation'; @@ -9,10 +12,11 @@ export default function PdfUrlViewer() { return (
    - +
    ); diff --git a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx index 1d85043a..4d8cba84 100644 --- a/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx +++ b/app/(student)/teaching/lessonView/[lesson_id]/[subject_id]/[stream_id]/[id]/page.tsx @@ -361,7 +361,7 @@ export default function LessonTest() { {document?.content?.document_path && ( {' '} -
    - )} + {!sendStream ? ( +
    + {/* info section */} + {skeleton ? ( + + ) : ( +
    +

    Курсы

    +
    + )} - {/* table section */} - {hasCourses ? ( -

    {'Курсы отсутствуют'}

    - ) : ( - <> - {skeleton ? ( -
    - -
    - ) : ( -
    -
    - - rowIndex + 1} header="#" style={{ width: '20px' }}> - ( -
    - -
    - )} - body={imageBodyTemplate} - >
    - -
    Название
    } - body={(rowData) => ( - { - setGlobalLoading(true); - setTimeout(() => { - setGlobalLoading(false); - }, 1200); - setMainCourseId(rowData.id); - }} - key={rowData.id} - className="max-w-sm break-words" - > - {rowData.title} - - )} - >
    -
    Статус
    } - body={(rowData) => ( - - )} - >
    -
    Балл
    } body={(rowData) => {rowData.max_score}}>
    -
    На рассмотрение
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => ( - <> - - - )} - >
    -
    Публикация
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => { - // if(rowData?.audience_type?.name === 'lock'){ - return rowData.is_published ? : ; - // } - // return - }} - >
    -
    Потоки
    } - style={{ margin: '0 3px', textAlign: 'center' }} - body={(rowData) => ( - <> - - - )} - >
    - ( -
    - -
    - )} - /> -
    + {/* table section */} + {hasCourses ? ( +

    {'Курсы отсутствуют'}

    + ) : ( + <> + {skeleton ? ( +
    +
    -
    - handlePageChange(e.page + 1)} - template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" - /> + ) : ( +
    +
    + + rowIndex + 1} header="#" style={{ width: '20px' }}> + ( +
    + +
    + )} + body={imageBodyTemplate} + >
    + +
    Название
    } + body={(rowData) => ( + { + setGlobalLoading(true); + setTimeout(() => { + setGlobalLoading(false); + }, 1200); + setMainCourseId(rowData.id); + }} + key={rowData.id} + className="max-w-sm break-words" + > + {rowData.title} + + )} + >
    +
    Статус
    } + body={(rowData) => ( + + )} + >
    +
    Балл
    } body={(rowData) => {rowData.max_score}}>
    +
    На рассмотрение
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => ( + <> + + + )} + >
    +
    Публикация
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => { + // if(rowData?.audience_type?.name === 'lock'){ + return rowData.is_published ? : ; + // } + // return + }} + >
    +
    Потоки
    } + style={{ margin: '0 3px', textAlign: 'center' }} + body={(rowData) => { + const isChecked = forStreamId?.id === rowData.id; + return ( + <> + + + ); + }} + >
    + ( +
    + +
    + )} + /> +
    +
    +
    + handlePageChange(e.page + 1)} + template="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink" + /> +
    -
    - )} - - )} -
    - {/* STREAMS SECTION */} -
    - - {/* contextFetchCourse(pageState)} toggleIndex={()=> {}} /> */} -
    + )} + + )} +
    + ) : ( +
    + setSendStream(false)}/> + {/* contextFetchCourse(pageState)} toggleIndex={()=> {}} /> */} +
    + )}
    )}
    diff --git a/app/components/tables/StreamList.tsx b/app/components/tables/StreamList.tsx index b63076f5..6e8f820c 100644 --- a/app/components/tables/StreamList.tsx +++ b/app/components/tables/StreamList.tsx @@ -20,13 +20,15 @@ const StreamList = React.memo(function StreamList({ courseValue, isMobile, toggleIndex, - fetchprop + fetchprop, + close }: { callIndex: number; courseValue: { id: number | null; title: string } | null; isMobile: boolean; toggleIndex?: () => void; fetchprop: () => void; + close: () => void; }) { const [streams, setStreams] = useState([]); const [hasStreams, setHasStreams] = useState(false); @@ -36,7 +38,7 @@ const StreamList = React.memo(function StreamList({ const { setMessage } = useContext(LayoutContext); const showError = useErrorMessage(); - const shortTitle = useShortText(courseValue?.title ? courseValue?.title : '', 20, 'right'); + // const shortTitle = useShortText(courseValue?.title ? courseValue?.title : '', 40, 'right'); const toggleSkeleton = () => { setSkeleton(true); @@ -44,7 +46,7 @@ const StreamList = React.memo(function StreamList({ setSkeleton(false); }, 1000); }; - + const profilactor = (data: mainStreamsType[]) => { const newStreams: streamsType[] = []; @@ -329,27 +331,31 @@ const StreamList = React.memo(function StreamList({ )} {callIndex === 1 && ( -
    +
    {skeleton ? ( ) : ( <> {/* info section */} {!isMobile && ( -
    - {/* */} - {shortTitle} - {/* */} -
    -
    )} @@ -358,7 +364,7 @@ const StreamList = React.memo(function StreamList({ {hasStreams ? ( <> -

    Потоков пока нет

    +

    Потоков пока нет или курс не связан с потоками

    ) : (
    diff --git a/layout/AppTopbar.tsx b/layout/AppTopbar.tsx index 3b6ea4ed..d3c4297d 100644 --- a/layout/AppTopbar.tsx +++ b/layout/AppTopbar.tsx @@ -79,7 +79,6 @@ const AppTopbar = forwardRef((props, ref) => { {Object.values(typeObjs)?.length > 1 ? ( Object.entries(typeObjs).map((el: any) => { const item = el[1]; - console.log(item); let path = ''; if (user?.is_working && item?.type?.type === 'practical') { path = `/students/${item?.meta?.course_id}/${item?.meta?.connect_id}/${item?.meta?.stream_id}/${item?.meta?.student_id}/${item?.meta?.lesson_id}/${item?.meta?.step_id}`;
    - {selectShow ? ( + {skeleton ? ( + + ) : selectShow ? (

    Факультеты временно не доступны

    ) : ( -
    +
    setSelected(e.value)} options={faculty} optionLabel="name_ru" className="w-[90%] overflow-x-auto" panelClassName="w-[50%] overflow-x-scroll" />
    )}
    {/* data table */} -
    -

    Кафедры

    - {facultyShow ? ( - - ) : ( - - rowIndex + 1} header="#" style={{ width: '20px' }}> - ( - - {rowData.name_ru} - - )} - > - - )} -
    + {skeleton ? ( + + ) : ( + !selectShow && ( +
    +

    Кафедры

    + {facultyShow ? ( + + ) : ( + + rowIndex + 1} header="#" style={{ width: '20px' }}> + ( + + {rowData.name_ru} + + )} + > + + )} +
    + ) + )}
    ); } diff --git a/app/(main)/videoLesson/[video_url]/page.tsx b/app/(main)/videoLesson/[video_url]/page.tsx new file mode 100644 index 00000000..ff74b539 --- /dev/null +++ b/app/(main)/videoLesson/[video_url]/page.tsx @@ -0,0 +1,10 @@ +'use client'; + +import { useParams } from "next/navigation"; + +export default function VideoLesson() { + const {video_url} = useParams(); + console.log(video_url); + + return
    page
    ; +} diff --git a/app/components/SessionManager.tsx b/app/components/SessionManager.tsx index bb89b461..37e7f1a9 100644 --- a/app/components/SessionManager.tsx +++ b/app/components/SessionManager.tsx @@ -74,8 +74,8 @@ const SessionManager = () => { if (!token && pathname !== '/' && pathname !== '/auth/login') { console.log('Перенеправляю в login'); - logout({ setUser, setGlobalLoading }); - window.location.href = '/auth/login'; + // logout({ setUser, setGlobalLoading }); + // window.location.href = '/auth/login'; return; } // setTimeout(() => { diff --git a/app/components/lessons/LessonInfoCard.tsx b/app/components/lessons/LessonInfoCard.tsx new file mode 100644 index 00000000..0a8211b2 --- /dev/null +++ b/app/components/lessons/LessonInfoCard.tsx @@ -0,0 +1,211 @@ +'use client'; + +import { useMediaQuery } from '@/hooks/useMediaQuery'; +import Link from 'next/link'; +import { useParams } from 'next/navigation'; +import { Dialog } from 'primereact/dialog'; +import { useState } from 'react'; + +export default function LessonInfoCard({ + type, + icon, + title, + description, + documentUrl, + link, + video_link, + videoStart, + test +}: { + type: string; + icon: string; + title?: string; + description?: string; + documentUrl?: { document: string | null; document_path: string }; + link?: string; + video_link?: string; + videoStart?: (id: string) => void; + test?: { content: string; answers: { id: number | null; text: string; is_correct: boolean }[]; score: number | null }; +}) { + const { id_kafedra } = useParams(); + // console.log(id_kafedra); + + const media = useMediaQuery('(max-width: 640px)'); + + const [testCall, setTestCall] = useState(false); + const [practicaCall, setPracticaCall] = useState(false); + + const docCard = ( +
    +
    + +
    +
    + {documentUrl?.document_path ? ( + documentUrl?.document_path?.length > 0 ? ( + 0 ? String(documentUrl?.document_path) : '#') : '#'} className="max-w-[800px] text-[16px] text-wrap break-all hover:underline" download target="_blank" rel="noopener noreferrer"> + {title} + + ) : ( + {title} + ) + ) : ( + {title} + )} +

    {description}

    +
    +
    + ); + + const linkCard = ( +
    +
    + +
    +
    + + {title} + + +

    {description}

    +
    +
    + ); + + const videoCard = ( +
    +
    + +
    +
    + videoStart && videoStart(video_link || '')} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + {title} + + +

    {description}

    +
    +
    + ); + + const testCard = ( +
    +
    + +
    +
    + setTestCall(true)} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + Тест + +
    +
    + ); + + const testInfo = ( +
    + {test?.answers && ( +
    +
    + {test?.content} +
    + {!media && '/'} Балл: + {`${test?.score}`} +
    +
    +
    + {test?.answers.map((item) => { + return ( +
    + +
    + ); + })} +
    +
    + )} +
    + ); + + const practicaCard = ( +
    +
    + +
    + setPracticaCall(true)} className="cursor-pointer max-w-[800px] text-[16px] text-wrap break-all hover:underline"> + Практическое задание + +
    + ); + + const docuemntPath = documentUrl && documentUrl?.document_path; + + const practicaInfo = ( +
    + ); + + return ( +
    + { + if (!testCall) return; + setTestCall(false); + }} + > +
    {testInfo}
    +
    + { + if (!practicaCall) return; + setPracticaCall(false); + }} + > +
    {practicaInfo}
    +
    +
    {type === "document" && docCard}
    +
    {type === 'link' && linkCard}
    +
    {type === 'video' && videoCard}
    +
    {type === 'test' && testCard}
    +
    {type === 'practical' && practicaCard}
    +
    + ); +} diff --git a/app/globals.css b/app/globals.css index 6117ed4f..16ef0340 100644 --- a/app/globals.css +++ b/app/globals.css @@ -12,6 +12,7 @@ --redBgColor: #EC272F1A; --greenColor: rgb(46, 192, 46); --greenBgColor: rgb(199, 231, 199); + --yellowColor: rgb(210, 239, 130); --titleColor: #21225F; --bodyColor: #555555; --whiteColor: #ffffff; diff --git a/layout/AppMenu.tsx b/layout/AppMenu.tsx index a5cb77b2..c2f070a2 100644 --- a/layout/AppMenu.tsx +++ b/layout/AppMenu.tsx @@ -102,7 +102,10 @@ const AppMenu = () => { { label: '', icon: 'pi pi-fw pi-arrow-left', - to: '/course' + to: '#', + command: ()=> { + router.back(); + } }, { label: '', diff --git a/services/steps.tsx b/services/steps.tsx index d65b7f2c..0cb25835 100644 --- a/services/steps.tsx +++ b/services/steps.tsx @@ -1,5 +1,3 @@ -import { CourseCreateType } from '@/types/courseCreateType'; -import { lessonStateType } from '@/types/lessonStateType'; import axiosInstance from '@/utils/axiosInstance'; let url = ''; @@ -424,4 +422,16 @@ export const updateLink = async (value: { url: string | null; title: string; des console.log('Ошибка при обновлении урока', err); return err; } +}; + +export const fetchDepartamentSteps = async (lesson_id: number, id_kafedra: number) => { + try { + const res = await axiosInstance.get(`/v1/teacher/controls/department/course/views?lesson_id=${lesson_id}&id_kafedra=${id_kafedra}`); + const data = await res.data; + + return data; + } catch (err) { + console.log('Ошибка загрузки:', err); + return err; + } }; \ No newline at end of file diff --git a/types/mainStepType.tsx b/types/mainStepType.tsx index bdf9a7d1..ef8c143a 100644 --- a/types/mainStepType.tsx +++ b/types/mainStepType.tsx @@ -5,6 +5,26 @@ export interface mainStepsType { user_id: number; lesson_id: number; step: number; - type: { active: true; created_at: string; id: 1; logo: string; modelName: string; name: string; title: string; updated_at: string }; + type: { active: true; created_at: string; id: 1; logo: string; description?: string | null; modelName: string; name: string; title: string; updated_at: string }; updated_at: string; } + +content: course_id: null; +created_at: '2025-09-12T06:24:54.000000Z'; +description: null; +document: '1_76_1757658294.pdf'; +id: 49; +lesson_id: 76; +status: true; +title: 'лекция'; +updated_at: '2025-09-12T06:24:54.000000Z'; +user_id: 1; + +type: active: true; +created_at: '2025-09-02T09:31:58.000000Z'; +id: 2; +logo: 'pi pi-folder'; +modelName: 'Document'; +name: 'document'; +title: 'Документ'; +updated_at: '2025-09-02T09:32:01.000000Z'; diff --git a/types/themeType.tsx b/types/themeType.tsx new file mode 100644 index 00000000..bb86ac5a --- /dev/null +++ b/types/themeType.tsx @@ -0,0 +1,12 @@ +interface themeType { + course_id: number; + created_at: string; + id: number; + is_deleted: boolean; + is_published: boolean; + published_at: boolean | null; + sequence_number: number; + title: string; + updated_at: string; + user_id: number; +} diff --git a/utils/axiosInstance.tsx b/utils/axiosInstance.tsx index f5267ed5..feb80829 100644 --- a/utils/axiosInstance.tsx +++ b/utils/axiosInstance.tsx @@ -22,18 +22,18 @@ axiosInstance.interceptors.response.use( const status = error.response?.status; if (status === 401) { console.warn('Неавторизован. Удаляю токен...'); - if (typeof window !== 'undefined') { - window.location.href = '/auth/login'; - localStorage.removeItem('userVisit'); - } - document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + // if (typeof window !== 'undefined') { + // window.location.href = '/auth/login'; + // localStorage.removeItem('userVisit'); + // } + // document.cookie = 'access_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; } if (status === 403) { console.warn('Не имеет доступ. Перенаправляю...'); - if (typeof window !== 'undefined') { - window.location.href = '/'; - } + // if (typeof window !== 'undefined') { + // window.location.href = '/'; + // } } if (status === 404) { From 6dc030a892a5d1ab324134144a3816d186c3fc15 Mon Sep 17 00:00:00 2001 From: BekzhanKutmanov Date: Wed, 17 Sep 2025 14:16:50 +0600 Subject: [PATCH 170/286] =?UTF-8?q?=D0=92=D0=B5=D1=80=D1=81=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=B2=20=D0=BA=D0=B0=D1=84=D0=B5=D0=B4?= =?UTF-8?q?=D1=80=D1=8B,=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D1=83=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/[course_Id]/[lesson_id]/page.tsx | 97 ++++++++++++----- .../faculty/[id_kafedra]/[course_id]/page.tsx | 102 +++++++++--------- app/(main)/faculty/page.tsx | 10 +- app/components/lessons/LessonInfoCard.tsx | 56 +++++----- app/globals.css | 2 +- layout/AppMenu.tsx | 5 +- layout/context/layoutcontext.tsx | 54 +++++----- services/courses.tsx | 2 + styles/layout/layout.scss | 3 +- styles/layout/primereact.css | 5 + utils/axiosInstance.tsx | 6 +- 11 files changed, 194 insertions(+), 148 deletions(-) create mode 100644 styles/layout/primereact.css diff --git a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx index 4b262c59..806eb4a8 100644 --- a/app/(main)/course/[course_Id]/[lesson_id]/page.tsx +++ b/app/(main)/course/[course_Id]/[lesson_id]/page.tsx @@ -39,18 +39,19 @@ export default function LessonStep() { const [selectedId, setSelectId] = useState(null); const [hasSteps, setHasSteps] = useState(false); const [themeNull, setThemeNull] = useState(false); - const [lesson_id, setLesson_id] = useState((param.lesson_id && Number(param.lesson_id)) || null); + // const [lesson_id, setLesson_id] = useState(null); + const [lesson_id, setLesson_id] = useState(null); const [sequence_number, setSequence_number] = useState(null); const [skeleton, setSkeleton] = useState(false); const [testovy, setTestovy] = useState(false); const router = useRouter(); const pathname = usePathname(); - const changeUrl = (lessonId: number) => { + const changeUrl = (lessonId: number | null) => { router.replace(`/course/${course_id}/${lessonId ? lessonId : null}`); }; - const handleShow = async (LessonId: number) => { + const handleShow = async (LessonId: number | null) => { const data = await fetchLessonShow(LessonId); if (data?.lesson) { @@ -86,7 +87,7 @@ export default function LessonStep() { } }; - const handleFetchSteps = async (lesson_id: number) => { + const handleFetchSteps = async (lesson_id: number | null) => { setSkeleton(true); const data = await fetchSteps(Number(lesson_id)); console.log('steps', data); @@ -189,6 +190,8 @@ export default function LessonStep() { useEffect(() => { setTestovy(true); + console.log('course-id', course_id); + contextFetchThemes(Number(course_id), null); }, [course_id]); @@ -220,38 +223,75 @@ export default function LessonStep() { // } // }, [contextThemes]); + // useEffect(() => { + // if (!contextThemes?.lessons?.data) return; + + // const lessons = contextThemes.lessons.data; + + // if (lessons.length > 0) { + // setThemeNull(false); + // console.warn(lessons, deleteQuery); + // let chosenId: number | null = null; + + // if (param.lesson_id === 'null' || deleteQuery) { + // console.log('var 1'); + // // alert(1); + + // chosenId = lessons[0].id; + // setDeleteQuery(false); + // } else { + // console.log('var 2'); + // // alert(2); + // chosenId = param.lesson_id ? Number(param.lesson_id) : lessons[0].id; + // } + // // alert(chosenId); + // setLesson_id(chosenId); + // } else { + // setThemeNull(true); + // } + + // setTestovy(false); + // setUpdateeQuery(false); + // }, [contextThemes, deleteQuery, param.lesson_id]); + + // useEffect(() => { + // console.warn('LESSONID ', lesson_id); + // if (!lesson_id) return; + + // handleShow(lesson_id); + // handleFetchSteps(lesson_id); + // changeUrl(lesson_id); + // }, [lesson_id]); + useEffect(() => { if (!contextThemes?.lessons?.data) return; const lessons = contextThemes.lessons.data; + if (lessons.length === 0) return; - if (lessons.length > 0) { - setThemeNull(false); - - let chosenId: number | null = null; - - if (param.lesson_id === 'null' || deleteQuery) { - chosenId = lessons[0].id; - setDeleteQuery(false); - } else { - chosenId = param.lesson_id ? Number(param.lesson_id) : lessons[0].id; - } + let chosenId: number | null = null; - setLesson_id(chosenId); + if (param.lesson_id && param.lesson_id !== 'null') { + const urlId = Number(param.lesson_id); + const exists = lessons.some((l) => l.id === urlId); + chosenId = exists ? urlId : lessons[0].id; } else { - setThemeNull(true); + chosenId = lessons[0].id; } - setTestovy(false); - setUpdateeQuery(false); + if (lesson_id !== chosenId) { + setLesson_id(chosenId); + } }, [contextThemes, deleteQuery, param.lesson_id]); - + useEffect(() => { - if (!lesson_id) return; - - handleShow(lesson_id); - handleFetchSteps(lesson_id); - changeUrl(lesson_id); + if (lesson_id && param.lesson_id !== String(lesson_id)) { + changeUrl(lesson_id); + } + if (lesson_id) { + handleFetchSteps(lesson_id); + handleShow(lesson_id); + } }, [lesson_id]); useEffect(() => { @@ -266,7 +306,10 @@ export default function LessonStep() { }; el.addEventListener('wheel', onWheel, { passive: false }); - return () => el.removeEventListener('wheel', onWheel); + return () => { + el.removeEventListener('wheel', onWheel); + setLesson_id(null); + }; }, []); const lessonInfo = ( @@ -301,7 +344,7 @@ export default function LessonStep() {